diff --git a/.travis.yml b/.travis.yml index e1e3e6fd72..9d86d85229 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,8 @@ language: c env: - BYOND_MAJOR="503" - BYOND_MINOR="1224" + BYOND_MAJOR="507" + BYOND_MINOR="1282" before_install: - sudo apt-get update -qq diff --git a/baystation12.dme b/baystation12.dme index abd75eb559..4fb2375407 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -16,6 +16,7 @@ #include "code\setup.dm" #include "code\stylesheet.dm" #include "code\world.dm" +#include "code\__HELPERS\datum_pool.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\game.dm" #include "code\__HELPERS\global_lists.dm" @@ -49,6 +50,7 @@ #include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\spell_screen_objects.dm" #include "code\ATMOSPHERICS\_atmos_setup.dm" #include "code\ATMOSPHERICS\_atmospherics_helpers.dm" #include "code\ATMOSPHERICS\atmospherics.dm" @@ -102,6 +104,7 @@ #include "code\controllers\Processes\disease.dm" #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" +#include "code\controllers\Processes\garbage.dm" #include "code\controllers\Processes\inactivity.dm" #include "code\controllers\Processes\lighting.dm" #include "code\controllers\Processes\machinery.dm" @@ -114,6 +117,7 @@ #include "code\controllers\Processes\sun.dm" #include "code\controllers\Processes\supply.dm" #include "code\controllers\Processes\ticker.dm" +#include "code\controllers\Processes\turf.dm" #include "code\controllers\Processes\vote.dm" #include "code\controllers\ProcessScheduler\core\_define.dm" #include "code\controllers\ProcessScheduler\core\_stubs.dm" @@ -265,9 +269,17 @@ #include "code\game\gamemodes\cult\cult.dm" #include "code\game\gamemodes\cult\cult_items.dm" #include "code\game\gamemodes\cult\cult_structures.dm" +#include "code\game\gamemodes\cult\hell_universe.dm" #include "code\game\gamemodes\cult\ritual.dm" #include "code\game\gamemodes\cult\runes.dm" #include "code\game\gamemodes\cult\talisman.dm" +#include "code\game\gamemodes\cult\cultify\mob.dm" +#include "code\game\gamemodes\cult\cultify\obj.dm" +#include "code\game\gamemodes\cult\cultify\turf.dm" +#include "code\game\gamemodes\endgame\endgame.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\black_hole.dm" #include "code\game\gamemodes\events\clang.dm" #include "code\game\gamemodes\events\dust.dm" @@ -317,7 +329,9 @@ #include "code\game\machinery\bees_items.dm" #include "code\game\machinery\biogenerator.dm" #include "code\game\machinery\bioprinter.dm" +#include "code\game\machinery\bluespacerelay.dm" #include "code\game\machinery\buttons.dm" +#include "code\game\machinery\CableLayer.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" #include "code\game\machinery\constructable_frame.dm" @@ -328,6 +342,7 @@ #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\flasher.dm" #include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\floorlayer.dm" #include "code\game\machinery\hologram.dm" #include "code\game\machinery\holosign.dm" #include "code\game\machinery\igniter.dm" @@ -369,12 +384,7 @@ #include "code\game\machinery\atmoalter\pump.dm" #include "code\game\machinery\atmoalter\scrubber.dm" #include "code\game\machinery\bots\bots.dm" -#include "code\game\machinery\bots\cleanbot.dm" -#include "code\game\machinery\bots\ed209bot.dm" -#include "code\game\machinery\bots\floorbot.dm" -#include "code\game\machinery\bots\medbot.dm" #include "code\game\machinery\bots\mulebot.dm" -#include "code\game\machinery\bots\secbot.dm" #include "code\game\machinery\camera\camera.dm" #include "code\game\machinery\camera\camera_assembly.dm" #include "code\game\machinery\camera\motion.dm" @@ -466,6 +476,7 @@ #include "code\game\machinery\kitchen\smartfridge.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\pipe\pipelayer.dm" #include "code\game\machinery\telecomms\broadcaster.dm" #include "code\game\machinery\telecomms\logbrowser.dm" #include "code\game\machinery\telecomms\machine_interactions.dm" @@ -541,6 +552,7 @@ #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\contraband.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\glassjar.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\toys.dm" @@ -644,6 +656,7 @@ #include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\commsantenna.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" @@ -732,6 +745,7 @@ #include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" #include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" #include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\statue.dm" #include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" #include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" #include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" @@ -754,6 +768,7 @@ #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" #include "code\game\turfs\simulated.dm" #include "code\game\turfs\turf.dm" +#include "code\game\turfs\turf_flick_animations.dm" #include "code\game\turfs\unsimulated.dm" #include "code\game\turfs\simulated\floor.dm" #include "code\game\turfs\simulated\floor_types.dm" @@ -940,8 +955,10 @@ #include "code\modules\economy\Events.dm" #include "code\modules\economy\Events_Mundane.dm" #include "code\modules\economy\TradeDestinations.dm" +#include "code\modules\events\apc_damage.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\camera_damage.dm" #include "code\modules\events\carp_migration.dm" #include "code\modules\events\comms_blackout.dm" #include "code\modules\events\communications_blackout.dm" @@ -989,6 +1006,7 @@ #include "code\modules\genetics\side_effects.dm" #include "code\modules\holodeck\HolodeckControl.dm" #include "code\modules\holodeck\HolodeckObjects.dm" +#include "code\modules\holodeck\HolodeckPrograms.dm" #include "code\modules\hydroponics\_hydro_setup.dm" #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\grown_inedible.dm" @@ -1054,13 +1072,24 @@ #include "code\modules\mob\typing_indicator.dm" #include "code\modules\mob\update_icons.dm" #include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\freelook\chunk.dm" #include "code\modules\mob\freelook\eye.dm" +#include "code\modules\mob\freelook\life.dm" +#include "code\modules\mob\freelook\read_me.dm" #include "code\modules\mob\freelook\update_triggers.dm" #include "code\modules\mob\freelook\visualnet.dm" +#include "code\modules\mob\freelook\ai\cameranet.dm" +#include "code\modules\mob\freelook\ai\chunk.dm" +#include "code\modules\mob\freelook\ai\eye.dm" +#include "code\modules\mob\freelook\ai\update_triggers.dm" +#include "code\modules\mob\freelook\mask\chunk.dm" +#include "code\modules\mob\freelook\mask\cultnet.dm" +#include "code\modules\mob\freelook\mask\eye.dm" +#include "code\modules\mob\freelook\mask\update_triggers.dm" #include "code\modules\mob\language\generic.dm" #include "code\modules\mob\language\language.dm" #include "code\modules\mob\language\monkey.dm" @@ -1068,6 +1097,7 @@ #include "code\modules\mob\language\station.dm" #include "code\modules\mob\language\synthetic.dm" #include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\default_language.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" @@ -1076,11 +1106,19 @@ #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\say.dm" #include "code\modules\mob\living\blob\blob.dm" +#include "code\modules\mob\living\bot\bot.dm" +#include "code\modules\mob\living\bot\cleanbot.dm" +#include "code\modules\mob\living\bot\ed209bot.dm" +#include "code\modules\mob\living\bot\farmbot.dm" +#include "code\modules\mob\living\bot\floorbot.dm" +#include "code\modules\mob\living\bot\medbot.dm" +#include "code\modules\mob\living\bot\secbot.dm" #include "code\modules\mob\living\carbon\breathe.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\shock.dm" #include "code\modules\mob\living\carbon\viruses.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" @@ -1175,12 +1213,6 @@ #include "code\modules\mob\living\silicon\ai\life.dm" #include "code\modules\mob\living\silicon\ai\login.dm" #include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\subsystems.dm" -#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" -#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" -#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" -#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" -#include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm" #include "code\modules\mob\living\silicon\decoy\death.dm" #include "code\modules\mob\living\silicon\decoy\decoy.dm" #include "code\modules\mob\living\silicon\decoy\life.dm" @@ -1237,6 +1269,7 @@ #include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" #include "code\modules\mob\living\simple_animal\hostile\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\bat.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" #include "code\modules\mob\living\simple_animal\hostile\creature.dm" @@ -1263,11 +1296,19 @@ #include "code\modules\nano\JSON Reader.dm" #include "code\modules\nano\JSON Writer.dm" #include "code\modules\nano\nanoexternal.dm" -#include "code\modules\nano\nanointeraction.dm" #include "code\modules\nano\nanomanager.dm" #include "code\modules\nano\nanomapgen.dm" #include "code\modules\nano\nanoui.dm" +#include "code\modules\nano\interaction\admin.dm" +#include "code\modules\nano\interaction\base.dm" +#include "code\modules\nano\interaction\contained.dm" +#include "code\modules\nano\interaction\default.dm" +#include "code\modules\nano\interaction\inventory.dm" +#include "code\modules\nano\interaction\physical.dm" +#include "code\modules\nano\interaction\self.dm" +#include "code\modules\nano\interaction\zlevel.dm" #include "code\modules\nano\modules\alarm_monitor.dm" +#include "code\modules\nano\modules\atmos_control.dm" #include "code\modules\nano\modules\crew_monitor.dm" #include "code\modules\nano\modules\human_appearance.dm" #include "code\modules\nano\modules\law_manager.dm" @@ -1349,12 +1390,14 @@ #include "code\modules\power\rust\virtual_particle_catcher.dm" #include "code\modules\power\sensors\powernet_sensor.dm" #include "code\modules\power\sensors\sensor_monitoring.dm" +#include "code\modules\power\singularity\act.dm" #include "code\modules\power\singularity\collector.dm" #include "code\modules\power\singularity\containment_field.dm" #include "code\modules\power\singularity\emitter.dm" #include "code\modules\power\singularity\field_generator.dm" #include "code\modules\power\singularity\generator.dm" #include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\narsie.dm" #include "code\modules\power\singularity\singularity.dm" #include "code\modules\power\singularity\particle_accelerator\particle.dm" #include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" @@ -1403,11 +1446,16 @@ #include "code\modules\reagents\Chemistry-Holder.dm" #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Readme.dm" -#include "code\modules\reagents\Chemistry-Reagents-Antidepressants.dm" #include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Core.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Dispenser.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Food-Drinks.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Other.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Toxins.dm" #include "code\modules\reagents\dispenser\_defines.dm" #include "code\modules\reagents\dispenser\cartridge.dm" #include "code\modules\reagents\dispenser\cartridge_presets.dm" @@ -1547,24 +1595,39 @@ #include "code\modules\shuttles\shuttle_specops.dm" #include "code\modules\shuttles\shuttle_supply.dm" #include "code\modules\shuttles\shuttles_multi.dm" -#include "code\modules\spells\area_teleport.dm" -#include "code\modules\spells\conjure.dm" -#include "code\modules\spells\dumbfire.dm" -#include "code\modules\spells\emplosion.dm" -#include "code\modules\spells\ethereal_jaunt.dm" -#include "code\modules\spells\explosion.dm" -#include "code\modules\spells\genetic.dm" -#include "code\modules\spells\horsemask.dm" -#include "code\modules\spells\inflict_handler.dm" -#include "code\modules\spells\knock.dm" -#include "code\modules\spells\mind_transfer.dm" -#include "code\modules\spells\projectile.dm" -#include "code\modules\spells\spell.dm" +#include "code\modules\spells\artifacts.dm" +#include "code\modules\spells\construct_spells.dm" +#include "code\modules\spells\no_clothes.dm" +#include "code\modules\spells\spell_code.dm" +#include "code\modules\spells\spell_projectile.dm" #include "code\modules\spells\spellbook.dm" -#include "code\modules\spells\trigger.dm" -#include "code\modules\spells\turf_teleport.dm" -#include "code\modules\spells\wizard_artifacts.dm" -#include "code\modules\spells\wizard_spells.dm" +#include "code\modules\spells\spells.dm" +#include "code\modules\spells\aoe_turf\aoe_turf.dm" +#include "code\modules\spells\aoe_turf\blink.dm" +#include "code\modules\spells\aoe_turf\charge.dm" +#include "code\modules\spells\aoe_turf\disable_tech.dm" +#include "code\modules\spells\aoe_turf\knock.dm" +#include "code\modules\spells\aoe_turf\smoke.dm" +#include "code\modules\spells\aoe_turf\summons.dm" +#include "code\modules\spells\aoe_turf\conjure\conjure.dm" +#include "code\modules\spells\aoe_turf\conjure\construct.dm" +#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" +#include "code\modules\spells\general\area_teleport.dm" +#include "code\modules\spells\general\rune_write.dm" +#include "code\modules\spells\targeted\disintegrate.dm" +#include "code\modules\spells\targeted\ethereal_jaunt.dm" +#include "code\modules\spells\targeted\flesh_to_stone.dm" +#include "code\modules\spells\targeted\genetic.dm" +#include "code\modules\spells\targeted\harvest.dm" +#include "code\modules\spells\targeted\horsemask.dm" +#include "code\modules\spells\targeted\mind_transfer.dm" +#include "code\modules\spells\targeted\shift.dm" +#include "code\modules\spells\targeted\subjugate.dm" +#include "code\modules\spells\targeted\targeted.dm" +#include "code\modules\spells\targeted\projectile\dumbfire.dm" +#include "code\modules\spells\targeted\projectile\fireball.dm" +#include "code\modules\spells\targeted\projectile\magic_missile.dm" +#include "code\modules\spells\targeted\projectile\projectile.dm" #include "code\modules\supermatter\supermatter.dm" #include "code\modules\surgery\bones.dm" #include "code\modules\surgery\brainrepair.dm" diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 7d57ea6c8f..37985034b1 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -44,15 +44,15 @@ obj/machinery/atmospherics/binary return null - Del() + Destroy() loc = null if(node1) node1.disconnect(src) - del(network1) + qdel(network1) if(node2) node2.disconnect(src) - del(network2) + qdel(network2) node1 = null node2 = null @@ -123,11 +123,11 @@ obj/machinery/atmospherics/binary disconnect(obj/machinery/atmospherics/reference) if(reference==node1) - del(network1) + qdel(network1) node1 = null else if(reference==node2) - del(network2) + qdel(network2) node2 = null update_icon() diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm index a4b720302b..6627d15d73 100644 --- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm +++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm @@ -112,10 +112,10 @@ else if(node1) node1.disconnect(src) - del(network1) + qdel(network1) if(node2) node2.disconnect(src) - del(network2) + qdel(network2) node1 = null node2 = null diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index b0ef990145..7604f33063 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -258,4 +258,4 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index 6923b6d31e..aead60a382 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -38,15 +38,15 @@ if(WEST) initialize_directions = NORTH|SOUTH - Del() + Destroy() loc = null if(node1) node1.disconnect(src) - del(network1) + qdel(network1) if(node2) node2.disconnect(src) - del(network2) + qdel(network2) node1 = null node2 = null @@ -110,10 +110,10 @@ else if(node1) node1.disconnect(src) - del(network1) + qdel(network1) if(node2) node2.disconnect(src) - del(network2) + qdel(network2) node1 = null node2 = null @@ -216,11 +216,11 @@ disconnect(obj/machinery/atmospherics/reference) if(reference==node1) - del(network1) + qdel(network1) node1 = null else if(reference==node2) - del(network2) + qdel(network2) node2 = null return null diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 87eaf9250d..079dfb76cd 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -235,4 +235,4 @@ Thus, the two variables affect pump operation are set in New(): "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index 3478f0f142..b2966ef431 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -24,7 +24,7 @@ for(var/datum/omni_port/P in ports) P.air.volume = ATMOS_DEFAULT_VOLUME_FILTER -/obj/machinery/atmospherics/omni/filter/Del() +/obj/machinery/atmospherics/omni/filter/Destroy() input = null output = null filters.Cut() diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index 970a33feee..f52269ee60 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -49,7 +49,7 @@ for(var/datum/omni_port/P in ports) P.air.volume = ATMOS_DEFAULT_VOLUME_MIXER -/obj/machinery/atmospherics/omni/mixer/Del() +/obj/machinery/atmospherics/omni/mixer/Destroy() inputs.Cut() output = null ..() diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 3d259ad941..52ab44fa74 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -98,7 +98,7 @@ "\blue You have unfastened \the [src].", \ "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) /obj/machinery/atmospherics/omni/attack_hand(user as mob) if(..()) @@ -231,13 +231,13 @@ return null -/obj/machinery/atmospherics/omni/Del() +/obj/machinery/atmospherics/omni/Destroy() loc = null for(var/datum/omni_port/P in ports) if(P.node) P.node.disconnect(src) - del(P.network) + qdel(P.network) P.node = null ..() @@ -292,7 +292,7 @@ /obj/machinery/atmospherics/omni/disconnect(obj/machinery/atmospherics/reference) for(var/datum/omni_port/P in ports) if(reference == P.node) - del(P.network) + qdel(P.network) P.node = null P.update = 1 break diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 315de2ce7c..c33ff79967 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -60,7 +60,7 @@ return null -/obj/machinery/atmospherics/portables_connector/Del() +/obj/machinery/atmospherics/portables_connector/Destroy() loc = null if(connected_device) @@ -68,7 +68,7 @@ if(node) node.disconnect(src) - del(network) + qdel(network) node = null @@ -122,7 +122,7 @@ /obj/machinery/atmospherics/portables_connector/disconnect(obj/machinery/atmospherics/reference) if(reference==node) - del(network) + qdel(network) node = null update_underlays() @@ -152,4 +152,4 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 7a5fca0fa7..0921d1d0aa 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -54,9 +54,6 @@ air2.volume = ATMOS_DEFAULT_VOLUME_FILTER air3.volume = ATMOS_DEFAULT_VOLUME_FILTER - if(radio_controller) - initialize() - /obj/machinery/atmospherics/trinary/filter/update_icon() if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter)) icon_state = "m" @@ -148,7 +145,7 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) /obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index c6f5b17613..a200de25a0 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -120,7 +120,7 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) /obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob) if(..()) diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index ff46b9b55f..3f5d66f262 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -52,18 +52,18 @@ obj/machinery/atmospherics/trinary return null - Del() + Destroy() loc = null if(node1) node1.disconnect(src) - del(network1) + qdel(network1) if(node2) node2.disconnect(src) - del(network2) + qdel(network2) if(node3) node3.disconnect(src) - del(network3) + qdel(network3) node1 = null node2 = null @@ -153,15 +153,15 @@ obj/machinery/atmospherics/trinary disconnect(obj/machinery/atmospherics/reference) if(reference==node1) - del(network1) + qdel(network1) node1 = null else if(reference==node2) - del(network2) + qdel(network2) node2 = null else if(reference==node3) - del(network3) + qdel(network3) node3 = null update_underlays() diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 68a1036a78..42556232bd 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -101,18 +101,18 @@ return null -/obj/machinery/atmospherics/tvalve/Del() +/obj/machinery/atmospherics/tvalve/Destroy() loc = null if(node1) node1.disconnect(src) - del(network_node1) + qdel(network_node1) if(node2) node2.disconnect(src) - del(network_node2) + qdel(network_node2) if(node3) node3.disconnect(src) - del(network_node3) + qdel(network_node3) node1 = null node2 = null @@ -128,9 +128,9 @@ update_icon() if(network_node1) - del(network_node1) + qdel(network_node1) if(network_node3) - del(network_node3) + qdel(network_node3) build_network() if(network_node1&&network_node2) @@ -153,9 +153,9 @@ update_icon() if(network_node1) - del(network_node1) + qdel(network_node1) if(network_node2) - del(network_node2) + qdel(network_node2) build_network() if(network_node1&&network_node3) @@ -262,15 +262,15 @@ /obj/machinery/atmospherics/tvalve/disconnect(obj/machinery/atmospherics/reference) if(reference==node1) - del(network_node1) + qdel(network_node1) node1 = null else if(reference==node2) - del(network_node2) + qdel(network_node2) node2 = null else if(reference==node3) - del(network_node3) + qdel(network_node3) node2 = null update_underlays() @@ -366,7 +366,7 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) /obj/machinery/atmospherics/tvalve/mirrored icon_state = "map_tvalvem0" diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 7d03ad9883..0e75146adc 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -86,4 +86,4 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 6635631f2d..eea2dba1ab 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -28,12 +28,12 @@ return null - Del() + Destroy() loc = null if(node) node.disconnect(src) - del(network) + qdel(network) node = null @@ -84,7 +84,7 @@ disconnect(obj/machinery/atmospherics/reference) if(reference==node) - del(network) + qdel(network) node = null update_icon() diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index cbaeb3bf9c..1920b8c6af 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -73,9 +73,6 @@ if (!id_tag) assign_uid() id_tag = num2text(uid) - if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() /obj/machinery/atmospherics/unary/vent_pump/high_volume name = "Large Air Vent" @@ -259,11 +256,12 @@ /obj/machinery/atmospherics/unary/vent_pump/initialize() ..() - //some vents work his own spesial way + //some vents work his own special way radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null if(frequency) set_frequency(frequency) + src.broadcast_status() /obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) @@ -383,7 +381,6 @@ user << "You are too far away to read the gauge." if(welded) user << "It seems welded shut." - ..() /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat @@ -415,9 +412,9 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) -/obj/machinery/atmospherics/unary/vent_pump/Del() +/obj/machinery/atmospherics/unary/vent_pump/Destroy() if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 8d88ad4db4..e5b6d3a8dc 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -42,9 +42,6 @@ if (!id_tag) assign_uid() id_tag = num2text(uid) - if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() /obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) if(!check_icon_cache()) @@ -121,6 +118,7 @@ radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null if (frequency) set_frequency(frequency) + src.broadcast_status() /obj/machinery/atmospherics/unary/vent_scrubber/process() ..() @@ -270,16 +268,15 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) /obj/machinery/atmospherics/unary/vent_scrubber/examine(mob/user) if(..(user, 1)) user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W" else user << "You are too far away to read the gauge." - ..() -/obj/machinery/atmospherics/unary/vent_scrubber/Del() +/obj/machinery/atmospherics/unary/vent_scrubber/Destroy() if(initial_loc) initial_loc.air_scrub_info -= id_tag initial_loc.air_scrub_names -= id_tag diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 9cc6f7451c..49ae4af2cf 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -73,15 +73,15 @@ return null -/obj/machinery/atmospherics/valve/Del() +/obj/machinery/atmospherics/valve/Destroy() loc = null if(node1) node1.disconnect(src) - del(network_node1) + qdel(network_node1) if(node2) node2.disconnect(src) - del(network_node2) + qdel(network_node2) node1 = null node2 = null @@ -113,9 +113,9 @@ update_icon() if(network_node1) - del(network_node1) + qdel(network_node1) if(network_node2) - del(network_node2) + qdel(network_node2) build_network() @@ -214,11 +214,11 @@ /obj/machinery/atmospherics/valve/disconnect(obj/machinery/atmospherics/reference) if(reference==node1) - del(network_node1) + qdel(network_node1) node1 = null else if(reference==node2) - del(network_node2) + qdel(network_node2) node2 = null update_underlays() @@ -310,7 +310,7 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) /obj/machinery/atmospherics/valve/examine(mob/user) ..() diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index 4098c15c31..7fe586733c 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -31,7 +31,7 @@ datum/pipe_network //Notes: Assuming that members will add themselves to appropriate roster in network_expand() if(!start_normal) - del(src) + qdel(src) start_normal.network_expand(src, reference) @@ -40,7 +40,7 @@ datum/pipe_network if((normal_members.len>0)||(line_members.len>0)) pipe_networks += src else - del(src) + qdel(src) proc/merge(datum/pipe_network/giver) if(giver==src) return 0 diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 662376e9b4..f4f4e37990 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -9,13 +9,13 @@ datum/pipeline var/alert_pressure = 0 - Del() + Destroy() if(network) - del(network) + qdel(network) if(air && air.volume) temporarily_store_air() - del(air) + qdel(air) ..() diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index cb11410f86..d78bb828e2 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -44,7 +44,7 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging node2 = target break if(!node1 && !node2) - del(src) + qdel(src) return update_icon() @@ -141,7 +141,7 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction break if(!node1&&!node2) - del(src) + qdel(src) return update_icon() diff --git a/code/ATMOSPHERICS/mainspipe.dm b/code/ATMOSPHERICS/mainspipe.dm index d70d2bc53e..a381b28c37 100644 --- a/code/ATMOSPHERICS/mainspipe.dm +++ b/code/ATMOSPHERICS/mainspipe.dm @@ -99,7 +99,7 @@ obj/machinery/atmospherics/mains_pipe for(var/obj/machinery/atmospherics/pipe/mains_component/node in nodes) node.disconnect() - Del() + Destroy() disconnect() ..() @@ -152,7 +152,7 @@ obj/machinery/atmospherics/mains_pipe/simple else if(!nodes[1]&&!nodes[2]) - del(src) //TODO: silent deleting looks weird + qdel(src) //TODO: silent deleting looks weird var/have_node1 = nodes[1]?1:0 var/have_node2 = nodes[2]?1:0 icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 92ad93c7d0..2315e856fd 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -30,7 +30,7 @@ /obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) //Return 1 if parent should continue checking other pipes - //Return null if parent should stop checking other pipes. Recall: del(src) will by default return null + //Return null if parent should stop checking other pipes. Recall: qdel(src) will by default return null return 1 @@ -62,8 +62,8 @@ return parent.return_network(reference) -/obj/machinery/atmospherics/pipe/Del() - del(parent) +/obj/machinery/atmospherics/pipe/Destroy() + qdel(parent) if(air_temporary) loc.assume_air(air_temporary) @@ -101,8 +101,8 @@ for (var/obj/machinery/meter/meter in T) if (meter.target == src) new /obj/item/pipe_meter(T) - del(meter) - del(src) + qdel(meter) + qdel(src) /obj/machinery/atmospherics/proc/change_color(var/new_color) //only pass valid pipe colors please ~otherwise your pipe will turn invisible @@ -219,7 +219,7 @@ var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() - del(src) + qdel(src) /obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() if(dir==3) @@ -227,7 +227,7 @@ else if(dir==12) set_dir(4) -/obj/machinery/atmospherics/pipe/simple/Del() +/obj/machinery/atmospherics/pipe/simple/Destroy() if(node1) node1.disconnect(src) if(node2) @@ -260,8 +260,8 @@ for (var/obj/machinery/meter/meter in T) if (meter.target == src) new /obj/item/pipe_meter(T) - del(meter) - del(src) + qdel(meter) + qdel(src) else if(node1 && node2) overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "[pipe_icon]intact[icon_connect_type]") else @@ -294,7 +294,7 @@ break if(!node1 && !node2) - del(src) + qdel(src) return var/turf/T = get_turf(src) @@ -305,12 +305,12 @@ /obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node1 = null if(reference == node2) if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node2 = null update_icon() @@ -459,7 +459,7 @@ else . = PROCESS_KILL -/obj/machinery/atmospherics/pipe/manifold/Del() +/obj/machinery/atmospherics/pipe/manifold/Destroy() if(node1) node1.disconnect(src) if(node2) @@ -472,17 +472,17 @@ /obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node1 = null if(reference == node2) if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node2 = null if(reference == node3) if(istype(node3, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node3 = null update_icon() @@ -511,8 +511,8 @@ for (var/obj/machinery/meter/meter in T) if (meter.target == src) new /obj/item/pipe_meter(T) - del(meter) - del(src) + qdel(meter) + qdel(src) else overlays.Cut() overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type) @@ -578,7 +578,7 @@ break if(!node1 && !node2 && !node3) - del(src) + qdel(src) return var/turf/T = get_turf(src) @@ -701,7 +701,7 @@ else . = PROCESS_KILL -/obj/machinery/atmospherics/pipe/manifold4w/Del() +/obj/machinery/atmospherics/pipe/manifold4w/Destroy() if(node1) node1.disconnect(src) if(node2) @@ -716,22 +716,22 @@ /obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node1 = null if(reference == node2) if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node2 = null if(reference == node3) if(istype(node3, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node3 = null if(reference == node4) if(istype(node4, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node4 = null update_icon() @@ -762,8 +762,8 @@ for (var/obj/machinery/meter/meter in T) if (meter.target == src) new /obj/item/pipe_meter(T) - del(meter) - del(src) + qdel(meter) + qdel(src) else overlays.Cut() overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type) @@ -837,7 +837,7 @@ break if(!node1 && !node2 && !node3 && !node4) - del(src) + qdel(src) return var/turf/T = get_turf(src) @@ -958,7 +958,7 @@ ..() else . = PROCESS_KILL -/obj/machinery/atmospherics/pipe/cap/Del() +/obj/machinery/atmospherics/pipe/cap/Destroy() if(node) node.disconnect(src) @@ -967,7 +967,7 @@ /obj/machinery/atmospherics/pipe/cap/disconnect(obj/machinery/atmospherics/reference) if(reference == node) if(istype(node, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node = null update_icon() @@ -1074,7 +1074,7 @@ else . = PROCESS_KILL -/obj/machinery/atmospherics/pipe/tank/Del() +/obj/machinery/atmospherics/pipe/tank/Destroy() if(node1) node1.disconnect(src) @@ -1108,7 +1108,7 @@ /obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node1 = null update_underlays() @@ -1258,7 +1258,7 @@ else parent.mingle_with_turf(loc, volume) -/obj/machinery/atmospherics/pipe/vent/Del() +/obj/machinery/atmospherics/pipe/vent/Destroy() if(node1) node1.disconnect(src) @@ -1290,7 +1290,7 @@ /obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node1 = null update_icon() diff --git a/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm b/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm index 4c173b7b7e..7374963fba 100644 --- a/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm +++ b/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm @@ -342,7 +342,7 @@ obj/machinery/atmospherics set src in world set category = "Minor" - del(src) + qdel(src) pipeline_data() set src in world @@ -487,7 +487,7 @@ obj/window destroy() set category = "Minor" set src in world - del(src) + qdel(src) mob sight = SEE_OBJS|SEE_TURFS diff --git a/code/FEA/FEA_fire.dm b/code/FEA/FEA_fire.dm index b7a8d42fa5..fe18350da0 100644 --- a/code/FEA/FEA_fire.dm +++ b/code/FEA/FEA_fire.dm @@ -171,7 +171,7 @@ return /* -/obj/effect/hotspot/Del() +/obj/effect/hotspot/Destroy() if (istype(loc, /turf/simulated)) DestroyTurf() ..() diff --git a/code/FEA/FEA_gas_mixture.dm b/code/FEA/FEA_gas_mixture.dm index 6beeffc187..a2a1af194e 100644 --- a/code/FEA/FEA_gas_mixture.dm +++ b/code/FEA/FEA_gas_mixture.dm @@ -346,7 +346,7 @@ What are the archived variables for? trace_gases += corresponding corresponding.moles += trace_gas.moles*giver.group_multiplier/group_multiplier - // del(giver) + // qdel(giver) return 1 remove(amount) diff --git a/code/FEA/FEA_system.dm b/code/FEA/FEA_system.dm index 574fd1ba26..6a3dfe0f8b 100644 --- a/code/FEA/FEA_system.dm +++ b/code/FEA/FEA_system.dm @@ -291,7 +291,7 @@ datum var/turf/simulated/T = turf T.parent = null turfs += T - del(turf_AG) + qdel(turf_AG) for(var/turf/simulated/S in turfs) //Have old members try to form new groups if(!S.parent) @@ -306,7 +306,7 @@ datum for(var/obj/movable/floor/OM in object_AG.members) OM.parent = null movable_objects += OM - del(object_AG) + qdel(object_AG) for(var/obj/movable/floor/OM in movable_objects) //Have old members try to form new groups if(!OM.parent) diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm index 981d0b023c..da7b1f856c 100644 --- a/code/FEA/FEA_turf_tile.dm +++ b/code/FEA/FEA_turf_tile.dm @@ -14,7 +14,7 @@ atom/movable/proc/experience_pressure_difference(pressure_difference, direction) turf assume_air(datum/gas_mixture/giver) //use this for machines to adjust air - del(giver) + qdel(giver) return 0 return_air() @@ -148,7 +148,7 @@ turf/simulated if(istype(target)) air_master.tiles_to_update.Add(target) - Del() + Destroy() if(air_master) if(parent) air_master.groups_to_rebuild.Add(parent) diff --git a/code/TriDimension/Pipes.dm b/code/TriDimension/Pipes.dm index d6b87f2909..c71255a34b 100644 --- a/code/TriDimension/Pipes.dm +++ b/code/TriDimension/Pipes.dm @@ -45,8 +45,6 @@ obj/machinery/atmospherics/pipe/zpipe/New() initialize_directions = EAST if(SOUTHWEST) initialize_directions = SOUTH - initialize() - obj/machinery/atmospherics/pipe/zpipe/hide(var/i) if(level == 1 && istype(loc, /turf/simulated)) @@ -80,7 +78,7 @@ obj/machinery/atmospherics/pipe/zpipe/proc/burst() var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() - del(src) + qdel(src) // NOT qdel. obj/machinery/atmospherics/pipe/zpipe/proc/normalize_dir() if(dir==3) @@ -88,7 +86,7 @@ obj/machinery/atmospherics/pipe/zpipe/proc/normalize_dir() else if(dir==12) set_dir(4) -obj/machinery/atmospherics/pipe/zpipe/Del() +obj/machinery/atmospherics/pipe/zpipe/Destroy() if(node1) node1.disconnect(src) if(node2) @@ -104,12 +102,12 @@ obj/machinery/atmospherics/pipe/zpipe/update_icon() obj/machinery/atmospherics/pipe/zpipe/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node1 = null if(reference == node2) if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node2 = null return null diff --git a/code/TriDimension/Structures.dm b/code/TriDimension/Structures.dm index 554853535a..9224facba2 100644 --- a/code/TriDimension/Structures.dm +++ b/code/TriDimension/Structures.dm @@ -41,18 +41,18 @@ switch(severity) if(1.0) if(icon_state == "ladderup" && prob(10)) - Del() + qdel(src) if(2.0) if(prob(50)) - Del() + qdel(src) if(3.0) - Del() + qdel(src) return*/ - Del() + Destroy() spawn(1) if(target && icon_state == "ladderdown") - del target + qdel(target) return ..() attackby(obj/item/C as obj, mob/user as mob) @@ -78,7 +78,7 @@ if(!blocked && !istype(below, /turf/simulated/wall)) var/obj/multiz/ladder/X = new /obj/multiz/ladder(below) S.amount = S.amount - 2 - if(S.amount == 0) S.Del() + if(S.amount == 0) qdel(S) X.icon_state = "ladderup" connect() user << "You finish the ladder." @@ -97,9 +97,9 @@ src.d_state = 1 if(target) - var/obj/item/stack/rods/R = new /obj/item/stack/rods(target.loc) + var/obj/item/stack/rods/R = PoolOrNew(/obj/item/stack/rods, target.loc) R.amount = 2 - target.Del() + qdel(Target) user << "You remove the bolts anchoring the ladder." return @@ -117,7 +117,7 @@ var/obj/item/stack/sheet/metal/S = new /obj/item/stack/sheet/metal( src ) S.amount = 2 user << "You remove the ladder and close the hole." - Del() + qdel(src) else user << "You need more welding fuel to complete this task." return @@ -167,7 +167,7 @@ attack_hand(var/mob/M) if(!target || !istype(target.loc, /turf)) - del src + qdel(src) if(active) M << "That [src] is being used." @@ -185,7 +185,7 @@ spawn(7) if(!target || !istype(target.loc, /turf)) - del src + qdel(src) if(M.z == z && get_dist(src,M) <= 1) var/list/adjacent_to_me = global_adjacent_z_levels["[z]"] M.visible_message("\blue \The [M] scurries [target.z == adjacent_to_me["up"] ? "up" : "down"] \the [src]!", "You scramble [target.z == adjacent_to_me["up"] ? "up" : "down"] \the [src]!", "You hear some grunting, and a hatch sealing.") diff --git a/code/TriDimension/Turfs.dm b/code/TriDimension/Turfs.dm index 8992068018..43e33ed3c2 100644 --- a/code/TriDimension/Turfs.dm +++ b/code/TriDimension/Turfs.dm @@ -120,7 +120,7 @@ var/obj/item/stack/tile/plasteel/S = C if (S.get_amount() < 1) return - del(L) + qdel(L) playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) S.build(src) S.use(1) diff --git a/code/TriDimension/controller.dm b/code/TriDimension/controller.dm index 528c2c76ba..a9d4df675a 100644 --- a/code/TriDimension/controller.dm +++ b/code/TriDimension/controller.dm @@ -28,9 +28,9 @@ initialized = 1 return 1 -/obj/effect/landmark/zcontroller/Del() +/obj/effect/landmark/zcontroller/Destroy() processing_objects.Remove(src) - return + return ..() /obj/effect/landmark/zcontroller/process() if (world.time > fast_time) diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index 6f75f4ea29..e655295f78 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -50,7 +50,7 @@ atom/proc/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif - return !CanPass(null, other, 0, 0) + 2*!CanPass(null, other, 1.5, 1) + return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) turf/c_airblock(turf/other) diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm index 4ba30f47b3..83d2a54ec3 100644 --- a/code/ZAS/Controller.dm +++ b/code/ZAS/Controller.dm @@ -98,7 +98,7 @@ Class Procs: set background = 1 #endif - world << "Processing Geometry..." + admin_notice("Processing Geometry...", R_DEBUG) sleep(-1) var/start_time = world.timeofday @@ -109,14 +109,14 @@ Class Procs: simulated_turf_count++ S.update_air_properties() - world << {"Geometry initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds. + admin_notice({"Geometry initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds. Total Simulated Turfs: [simulated_turf_count] Total Zones: [zones.len] Total Edges: [edges.len] Total Active Edges: [active_edges.len ? "[active_edges.len]" : "None"] Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count] -"} +"}, R_DEBUG) // spawn Start() @@ -154,7 +154,18 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #ifdef ZASDBG var/updated = 0 #endif + + //defer updating of self-zone-blocked turfs until after all other turfs have been updated. + //this hopefully ensures that non-self-zone-blocked turfs adjacent to self-zone-blocked ones + //have valid zones when the self-zone-blocked turfs update. + var/list/deferred = list() + for(var/turf/T in updating) + //check if the turf is self-zone-blocked + if(T.c_airblock(T) & ZONE_BLOCKED) + deferred += T + continue + T.update_air_properties() T.post_update_air_properties() T.needs_air_update = 0 @@ -164,6 +175,15 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #endif //sleep(1) + for(var/turf/T in deferred) + T.update_air_properties() + T.post_update_air_properties() + T.needs_air_update = 0 + #ifdef ZASDBG + T.overlays -= mark + updated++ + #endif + #ifdef ZASDBG if(updated != updating.len) tick_progress = "[updating.len - updated] tiles left unupdated." @@ -307,7 +327,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/mark_edge_sleeping(connection_edge/E) #ifdef ZASDBG - ASSERT(istype(E) + ASSERT(istype(E)) #endif if(E.sleeping) return active_edges.Remove(E) @@ -315,7 +335,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/mark_edge_active(connection_edge/E) #ifdef ZASDBG - ASSERT(istype(E) + ASSERT(istype(E)) #endif if(!E.sleeping) return active_edges.Add(E) diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 5dd0ac3cd3..688f71985d 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -78,11 +78,11 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) fire = new(src, fl) air_master.active_fire_zones |= zone - + var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src zone.fire_tiles |= src if(fuel) zone.fuel_objs += fuel - + return 0 /obj/fire @@ -162,7 +162,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) ..() if(!istype(loc, /turf)) - del src + qdel(src) set_dir(pick(cardinal)) SetLuminosity(3) @@ -170,7 +170,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) air_master.active_hotspots.Add(src) -/obj/fire/Del() +/obj/fire/Destroy() if (istype(loc, /turf/simulated)) RemoveFire() @@ -179,7 +179,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) /obj/fire/proc/RemoveFire() if (istype(loc, /turf)) SetLuminosity(0) - + loc = null air_master.active_hotspots.Remove(src) @@ -227,22 +227,22 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) //determine how far the reaction can progress var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit - + //determine the actual rate of reaction, as measured by the amount of fuel reacting - + //vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn). var/gas_reaction_progress = max(0.2*group_multiplier, (firelevel/vsc.fire_firelevel_multiplier)*gas_fuel)*FIRE_GAS_BURNRATE_MULT //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning (which is sort of accounted for by firelevel). Having more fuel means a longer burn. var/liquid_reaction_progress = (firelevel/vsc.fire_firelevel_multiplier)*FIRE_LIQUID_BURNRATE_MULT - + //world << "liquid_reaction_progress = [liquid_reaction_progress]" //world << "gas_reaction_progress = [gas_reaction_progress]" - + var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress var/used_fuel = min(total_reaction_progress, reaction_limit) var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) //world << "used_fuel = [used_fuel]; used_oxidizers = [used_oxidizers]; reaction_limit=[reaction_limit]" - + //if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out if(zone && zone.fuel_objs.len) if(used_fuel <= FIRE_LIQUD_MIN_BURNRATE) @@ -250,13 +250,13 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) else if(used_fuel <= FIRE_GAS_MIN_BURNRATE*group_multiplier) //purely gas fires have more stringent criteria return 0 - + //*** Remove fuel and oxidizer, add carbon dioxide and heat - + //remove and add gasses as calculated var/used_gas_fuel = min(used_fuel*(gas_reaction_progress/total_reaction_progress), gas_fuel) //remove in proportion to the relative reaction progress var/used_liquid_fuel = between(0, used_fuel-used_gas_fuel, liquid_fuel) - + //remove_by_flag() and adjust_gas() handle the group_multiplier for us. remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers) remove_by_flag(XGM_GAS_FUEL, used_gas_fuel) @@ -272,14 +272,14 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) if(!istype(fuel)) zone.fuel_objs -= fuel continue - + fuel.amount -= fuel_to_remove if(fuel.amount <= 0) zone.fuel_objs -= fuel if(liquidonly) var/turf/T = fuel.loc - if(istype(T) && T.fire) del(T.fire) - del(fuel) + if(istype(T) && T.fire) qdel(T.fire) + qdel(fuel) //calculate the energy produced by the reaction and then set the new temperature of the mix temperature = (starting_energy + vsc.fire_fuel_energy_release * used_fuel) / heat_capacity() diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index 9d031ce3d3..331c00dd37 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -46,6 +46,7 @@ air_master.connect(sim, src) /turf/simulated/update_air_properties() + if(zone && zone.invalid) c_copy_air() zone = null //Easier than iterating through the list at the zone. @@ -58,7 +59,8 @@ #endif if(zone) var/zone/z = zone - if(locate(/obj/machinery/door/airlock) in src) //Hacky, but prevents normal airlocks from rebuilding zones all the time + + if(s_block & ZONE_BLOCKED) //Hacky, but prevents normal airlocks from rebuilding zones all the time z.remove(src) else z.rebuild() @@ -102,7 +104,7 @@ //This happens when windows move or are constructed. We need to rebuild. if((previously_open & d) && istype(unsim, /turf/simulated)) var/turf/simulated/sim = unsim - if(sim.zone == zone) + if(zone && sim.zone == zone) zone.rebuild() return @@ -120,8 +122,10 @@ //Might have assigned a zone, since this happens for each direction. if(!zone) - //if((block & ZONE_BLOCKED) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) - if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) + //We do not merge if + // they are blocking us and we are not blocking them, or if + // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. + if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) #ifdef ZASDBG if(verbose) world << "[d] is zone blocked." //dbg(zone_blocked, d) diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index b7042191fc..9fcddc9246 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -111,6 +111,13 @@ Class Procs: #ifdef ZASDBG T.dbg(merged) #endif + + //rebuild the old zone's edges so that the will be possesed by the new zone + for(var/connection_edge/E in edges) + if(E.contains_zone(into)) + continue //don't need to rebuild this edge + for(var/turf/T in E.connecting_turfs) + air_master.mark_for_update(T) /zone/proc/c_invalidate() invalid = 1 diff --git a/code/__HELPERS/datum_pool.dm b/code/__HELPERS/datum_pool.dm new file mode 100644 index 0000000000..79970faf7b --- /dev/null +++ b/code/__HELPERS/datum_pool.dm @@ -0,0 +1,109 @@ + +/* +/tg/station13 /atom/movable Pool: +--------------------------------- +By RemieRichards + +Creation/Deletion is laggy, so let's reduce reuse and recycle! + +*/ +#define ATOM_POOL_COUNT 100 +// "define DEBUG_ATOM_POOL 1 +var/global/list/GlobalPool = list() + +//You'll be using this proc 90% of the time. +//It grabs a type from the pool if it can +//And if it can't, it creates one +//The pool is flexible and will expand to fit +//The new created atom when it eventually +//Goes into the pool + +//Second argument can be a new location, if the type is /atom/movable +//Or a list of arguments +//Either way it gets passed to new + +/proc/PoolOrNew(var/get_type,var/second_arg) + var/datum/D + D = GetFromPool(get_type,second_arg) + + if(!D) + // So the GC knows we're pooling this type. + if(!GlobalPool[get_type]) + GlobalPool[get_type] = list(new get_type) + if(islist(second_arg)) + return new get_type (arglist(second_arg)) + else + return new get_type (second_arg) + return D + +/proc/GetFromPool(var/get_type,var/second_arg) + if(isnull(GlobalPool[get_type])) + return 0 + + if(length(GlobalPool[get_type]) == 0) + return 0 + + var/datum/D = pick_n_take(GlobalPool[get_type]) + if(D) + D.ResetVars() + D.Prepare(second_arg) + return D + return 0 + +/proc/PlaceInPool(var/datum/D) + if(!istype(D)) + return + + if(length(GlobalPool[D.type]) > ATOM_POOL_COUNT) + #ifdef DEBUG_ATOM_POOL + world << text("DEBUG_DATUM_POOL: PlaceInPool([]) exceeds []. Discarding.", D.type, ATOM_POOL_COUNT) + #endif + del(D) + return + + if(D in GlobalPool[D.type]) + return + + if(!GlobalPool[D.type]) + GlobalPool[D.type] = list() + + GlobalPool[D.type] += D + + D.Destroy() + D.ResetVars() + D.disposed = 1 //Set to stop processing while pooled + +/proc/IsPooled(var/datum/D) + if(isnull(GlobalPool[D.type])) + return 0 + return 1 + +/datum/proc/Prepare(args) + if(islist(args)) + New(arglist(args)) + else + New(args) + disposed = null + +/atom/movable/Prepare(args) + var/list/args_list = args + if(istype(args_list) && args_list.len) + loc = args[1] + else + loc = args + ..() + +/datum/proc/ResetVars(var/list/exlude = list()) + var/list/excluded = list("animate_movement", "loc", "locs", "parent_type", "vars", "verbs", "type") + exlude + + for(var/V in vars) + if(V in excluded) + continue + + vars[V] = initial(vars[V]) + +/atom/movable/ResetVars() + ..() + vars["loc"] = null + +#undef ATOM_POOL_COUNT diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 45618f2ffc..10889abf2e 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -18,15 +18,20 @@ /proc/get_area(O) var/turf/loc = get_turf(O) - if(!loc) - return null - return loc.loc + if(loc) + var/area/res = loc.loc + .= res.master /proc/get_area_name(N) //get area by its name for(var/area/A in world) if(A.name == N) return A return 0 + +/proc/get_area_master(const/O) + var/area/A = get_area(O) + if (isarea(A)) + return A.master /proc/in_range(source, user) if(get_dist(source, user) <= 1) @@ -430,6 +435,34 @@ datum/projectile_data var/b = mixOneColor(weights, blues) return rgb(r,g,b) +/proc/mixOneColor(var/list/weight, var/list/color) + if (!weight || !color || length(weight)!=length(color)) + return 0 + + var/contents = length(weight) + var/i + + //normalize weights + var/listsum = 0 + for(i=1; i<=contents; i++) + listsum += weight[i] + for(i=1; i<=contents; i++) + weight[i] /= listsum + + //mix them + var/mixedcolor = 0 + for(i=1; i<=contents; i++) + mixedcolor += weight[i]*color[i] + mixedcolor = round(mixedcolor) + + //until someone writes a formal proof for this algorithm, let's keep this in +// if(mixedcolor<0x00 || mixedcolor>0xFF) +// return 0 + //that's not the kind of operation we are running here, nerd + mixedcolor=min(max(mixedcolor,0),255) + + return mixedcolor + /** * Gets the highest and lowest pressures from the tiles in cardinal directions * around us, then checks the difference. @@ -493,6 +526,6 @@ datum/projectile_data /proc/MinutesToTicks(var/minutes) return SecondsToTicks(60 * minutes) - + /proc/SecondsToTicks(var/seconds) return seconds * 10 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 01b9509ae8..7484d016b6 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -49,6 +49,17 @@ var/global/list/undershirt_t = list("White Tank top" = "u1", "Black Tank top" = //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg) + +// Visual nets +var/list/datum/visualnet/visual_nets = list() +var/datum/visualnet/camera/cameranet = new() +var/datum/visualnet/cult/cultnet = new() + +// Runes +var/global/list/rune_list = new() +var/global/list/escape_list = list() +var/global/list/endgame_exits = list() +var/global/list/endgame_safespawns = list() ////////////////////////// /////Initial Building///// ////////////////////////// diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index b7caf86669..a1f13c18ab 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -30,6 +30,13 @@ return "[output][and_text][input[index]]" + +/proc/ConvertReqString2List(var/list/source_list) + var/list/temp_list = params2list(source_list) + for(var/O in temp_list) + temp_list[O] = text2num(temp_list[O]) + return temp_list + //Returns list element or null. Should prevent "index out of bounds" error. proc/listgetindex(var/list/list,index) if(istype(list) && list.len) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 54ce601ac7..ae38249956 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -183,7 +183,7 @@ /proc/replace_characters(var/t,var/list/repl_chars) for(var/char in repl_chars) - replacetext(t, char, repl_chars[char]) + t = replacetext(t, char, repl_chars[char]) return t //Adds 'u' number of zeros ahead of the text 't' @@ -226,6 +226,31 @@ /proc/capitalize(var/t as text) return uppertext(copytext(t, 1, 2)) + copytext(t, 2) +//This proc strips html properly, remove < > and all text between +//for complete text sanitizing should be used sanitize() +/proc/strip_html_properly(var/input) + if(!input) + return + var/opentag = 1 //These store the position of < and > respectively. + var/closetag = 1 + while(1) + opentag = findtext(input, "<") + closetag = findtext(input, ">") + if(closetag && opentag) + if(closetag < opentag) + input = copytext(input, (closetag + 1)) + else + input = copytext(input, 1, opentag) + copytext(input, (closetag + 1)) + else if(closetag || opentag) + if(opentag) + input = copytext(input, 1, opentag) + else + input = copytext(input, (closetag + 1)) + else + break + + return input + //This proc fills in all spaces with the "replace" var (* by default) with whatever //is in the other string at the same spot (assuming it is not a replace char). //This is used for fingerprints @@ -274,7 +299,11 @@ proc/TextPreview(var/string,var/len=40) else return string else - return "[copytext(string, 1, 37)]..." + return "[copytext_preserve_html(string, 1, 37)]..." + +//alternative copytext() for encoded text, doesn't break html entities (" and other) +/proc/copytext_preserve_html(var/text, var/first, var/last) + return html_encode(copytext(html_decode(text), first, last)) //For generating neat chat tag-images //The icon var could be local in the proc, but it's a waste of resources @@ -283,4 +312,4 @@ proc/TextPreview(var/string,var/len=40) /proc/create_text_tag(var/tagname, var/tagdesc = tagname, var/client/C = null) if(C && (C.prefs.toggles & CHAT_NOICONS)) return tagdesc - return "[tagdesc]" + return "[tagdesc]" \ No newline at end of file diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index f20830e5cc..c90a935b6d 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -10,6 +10,9 @@ proc/worldtime2text(time = world.time) if(!roundstart_hour) roundstart_hour = pick(2,7,12,17) return "[round(time / 36000)+roundstart_hour]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" +proc/worlddate2text() + return num2text((text2num(time2text(world.timeofday, "YYYY"))+544)) + "-" + time2text(world.timeofday, "MM-DD") + proc/time_stamp() return time2text(world.timeofday, "hh:mm:ss") diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 72d85a67b5..3564c5e15f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -631,7 +631,7 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl animation.master = target flick(flick_anim, animation) sleep(max(sleeptime, 15)) - del(animation) + qdel(animation) //Will return the contents of an atom recursivly to a depth of 'searchDepth' /atom/proc/GetAllContents(searchDepth = 5) @@ -902,7 +902,7 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl X.icon = 'icons/turf/shuttle.dmi' X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state X.name = "wall" - del(O) // prevents multiple shuttle corners from stacking + qdel(O) // prevents multiple shuttle corners from stacking continue if(!istype(O,/obj)) continue O.loc = X @@ -927,30 +927,6 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl refined_trg -= B continue moving - var/list/doors = new/list() - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - for(var/obj/machinery/door/D2 in T1) - doors += D2 - /*if(T1.parent) - air_master.groups_to_rebuild += T1.parent - else - air_master.tiles_to_update += T1*/ - - if(fromupdate.len) - for(var/turf/simulated/T2 in fromupdate) - for(var/obj/machinery/door/D2 in T2) - doors += D2 - /*if(T2.parent) - air_master.groups_to_rebuild += T2.parent - else - air_master.tiles_to_update += T2*/ - - for(var/obj/O in doors) - O:update_nearby_tiles(1) - - proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) if(!original) diff --git a/code/__HELPERS/vector.dm b/code/__HELPERS/vector.dm index 970530e71d..44d293734c 100644 --- a/code/__HELPERS/vector.dm +++ b/code/__HELPERS/vector.dm @@ -52,7 +52,7 @@ return_location() var/offset_x = 0 // distance to increment each step var/offset_y = 0 -/datum/plot_vector/proc/setup(var/turf/S, var/turf/T, var/xo = 0, var/yo = 0) +/datum/plot_vector/proc/setup(var/turf/S, var/turf/T, var/xo = 0, var/yo = 0, var/angle_offset=0) source = S target = T @@ -78,7 +78,7 @@ return_location() return // calculate the angle - angle = Atan2(dx, dy) + angle = Atan2(dx, dy) + angle_offset // and some rounding to stop the increments jumping whole turfs - because byond favours certain angles if(angle > -135 && angle < 45) @@ -118,7 +118,7 @@ return_location() /datum/plot_vector/proc/return_location(var/datum/vector_loc/data) if(!data) data = new() - data.loc = locate(round(loc_x / world.icon_size), round(loc_y / world.icon_size), loc_z) + data.loc = locate(round(loc_x / world.icon_size, 1), round(loc_y / world.icon_size, 1), loc_z) if(!data.loc) return data.pixel_x = loc_x - (data.loc.x * world.icon_size) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 3a5f4032a2..900e89e7e7 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -48,6 +48,11 @@ #define ui_monkey_mask "5:14,1:5" //monkey #define ui_monkey_back "6:14,1:5" //monkey +#define ui_construct_health "15:00,7:15" //same height as humans, hugging the right border +#define ui_construct_purge "15:00,6:15" +#define ui_construct_fire "14:16,8:13" //above health, slightly to the left +#define ui_construct_pull "14:28,2:10" //above the zone_sel icon + //Lower right, persistant menu #define ui_dropbutton "11:22,1:5" #define ui_drop_throw "14:28,2:7" @@ -66,6 +71,7 @@ #define ui_gun2 "14:28, 4:7" #define ui_gun3 "13:26,4:7" #define ui_gun_select "14:28,3:7" +#define ui_gun4 "12:24,3:7" //Upper-middle right (damage indicators) #define ui_toxin "14:28,13:27" @@ -118,3 +124,6 @@ #define ui_iarrowleft "SOUTH-1,11" #define ui_iarrowright "SOUTH-1,13" + +#define ui_spell_master "14:16,14:16" +#define ui_genetic_master "14:16,12:16" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index c41f9594b3..f39499f3dc 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -33,7 +33,7 @@ var/list/global_huds = list( screen.screen_loc = "1,1" screen.icon = 'icons/obj/hud_full.dmi' screen.icon_state = icon_state - screen.layer = 17 + screen.layer = SCREEN_LAYER screen.mouse_opacity = 0 return screen @@ -249,7 +249,11 @@ datum/hud/New(mob/owner) robot_hud() else if(isobserver(mymob)) ghost_hud() + else + mymob.instantiate_hud(src) +/mob/proc/instantiate_hud(var/datum/hud/HUD) + return //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12(var/full = 0 as null) @@ -337,6 +341,7 @@ datum/hud/New(mob/owner) if(src.hud_used.item_action_list) src.client.screen -= src.hud_used.item_action_list src.client.screen -= src.internals + src.client.screen += src.hud_used.action_intent //we want the intent swticher visible else hud_used.hud_shown = 1 if(src.hud_used.adding) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 92fe661d00..97b07e6154 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -356,6 +356,9 @@ //mymob.gun_run_icon.color = ui_color mymob.gun_run_icon.alpha = ui_alpha + mymob.radio_use_icon = new /obj/screen/gun/radio(null) + mymob.radio_use_icon.alpha = ui_alpha + if (mymob.client) if (mymob.client.gun_mode) // If in aim mode, correct the sprite mymob.gun_setting_icon.set_dir(2) diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index 76adf0414c..7314e8692d 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -231,6 +231,10 @@ if (mymob.client.target_can_click) mymob.item_use_icon.set_dir(1) src.adding += mymob.item_use_icon + mymob.radio_use_icon = new /obj/screen/gun/radio(null) + if (mymob.client.target_can_radio) + mymob.radio_use_icon.set_dir(1) + src.adding += mymob.radio_use_icon mymob.gun_move_icon = new /obj/screen/gun/move(null) if (mymob.client.target_can_move) mymob.gun_move_icon.set_dir(1) diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 3f785d8a83..5dd1b542cf 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -101,3 +101,59 @@ mymob.client.screen += src.adding return + +/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD) + HUD.construct_hud() + +/datum/hud/proc/construct_hud() + var/constructtype + + if(istype(mymob,/mob/living/simple_animal/construct/armoured) || istype(mymob,/mob/living/simple_animal/construct/behemoth)) + constructtype = "juggernaut" + else if(istype(mymob,/mob/living/simple_animal/construct/builder)) + constructtype = "artificer" + else if(istype(mymob,/mob/living/simple_animal/construct/wraith)) + constructtype = "wraith" + else if(istype(mymob,/mob/living/simple_animal/construct/harvester)) + constructtype = "harvester" + + mymob.flash = new /obj/screen() + mymob.flash.icon = 'icons/mob/screen1.dmi' + mymob.flash.icon_state = "blank" + mymob.flash.name = "flash" + mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.layer = 17 + + if(constructtype) + mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen1_construct.dmi' + mymob.fire.icon_state = "fire0" + mymob.fire.name = "fire" + mymob.fire.screen_loc = ui_construct_fire + + mymob.healths = new /obj/screen() + mymob.healths.icon = 'icons/mob/screen1_construct.dmi' + mymob.healths.icon_state = "[constructtype]_health0" + mymob.healths.name = "health" + mymob.healths.screen_loc = ui_construct_health + + mymob.pullin = new /obj/screen() + mymob.pullin.icon = 'icons/mob/screen1_construct.dmi' + mymob.pullin.icon_state = "pull0" + mymob.pullin.name = "pull" + mymob.pullin.screen_loc = ui_construct_pull + + mymob.zone_sel = new /obj/screen/zone_sel() + mymob.zone_sel.icon = 'icons/mob/screen1_construct.dmi' + mymob.zone_sel.overlays.len = 0 + mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") + + mymob.purged = new /obj/screen() + mymob.purged.icon = 'icons/mob/screen1_construct.dmi' + mymob.purged.icon_state = "purge0" + mymob.purged.name = "purged" + mymob.purged.screen_loc = ui_construct_purge + + mymob.client.screen = null + + mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged, mymob.flash) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 48378fce7f..e07d5aaf20 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -162,6 +162,10 @@ var/obj/screen/robot_inventory if (mymob.client.target_can_click) mymob.item_use_icon.set_dir(1) src.adding += mymob.item_use_icon + mymob.radio_use_icon = new /obj/screen/gun/radio(null) + if (mymob.client.target_can_radio) + mymob.radio_use_icon.set_dir(1) + src.adding += mymob.radio_use_icon mymob.gun_move_icon = new /obj/screen/gun/move(null) if (mymob.client.target_can_move) mymob.gun_move_icon.set_dir(1) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 0cc2ad3365..4a7d6f2acb 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -14,6 +14,9 @@ var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. var/gun_click_time = -100 //I'm lazy. +/obj/screen/Destroy() + master = null + ..() /obj/screen/text icon = null @@ -122,6 +125,11 @@ screen_loc = ui_gun_select //dir = 1 + radio + name = "Allow Radio Use" + icon_state = "no_radio0" + screen_loc = ui_gun4 + /obj/screen/zone_sel name = "damage zone" icon_state = "zone_sel" @@ -427,7 +435,7 @@ if(istype(usr, /mob/living/silicon/robot)) usr:toggle_module(3) - if("Allow Walking") + if("Allow Walking", "Disallow Walking") if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. return if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) @@ -436,16 +444,7 @@ usr.client.AllowTargetMove() gun_click_time = world.time - if("Disallow Walking") - if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. - return - if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetMove() - gun_click_time = world.time - - if("Allow Running") + if("Allow Running", "Disallow Running") if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. return if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) @@ -454,26 +453,7 @@ usr.client.AllowTargetRun() gun_click_time = world.time - if("Disallow Running") - if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. - return - if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetRun() - gun_click_time = world.time - - if("Allow Item Use") - if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. - return - if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetClick() - gun_click_time = world.time - - - if("Disallow Item Use") + if("Allow Item Use", "Disallow Item Use") if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. return if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) @@ -485,6 +465,15 @@ if("Toggle Gun Mode") usr.client.ToggleGunMode() + if("Allow Radio Use", "Disallow Radio Use") + if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. + return + if(!istype(usr.get_active_hand(),/obj/item/weapon/gun)) + usr << "You need your gun in your active hand to do that!" + return + usr.client.AllowTargetRadio() + gun_click_time = world.time + else return 0 return 1 diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm new file mode 100644 index 0000000000..ed208a588d --- /dev/null +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -0,0 +1,175 @@ +/obj/screen/movable/spell_master + name = "Spells" + icon = 'icons/mob/screen_spells.dmi' + icon_state = "wiz_spell_ready" + var/list/obj/screen/spell/spell_objects = list() + var/showing = 0 + + var/open_state = "master_open" + var/closed_state = "master_closed" + + screen_loc = ui_spell_master + + var/mob/spell_holder + +/obj/screen/movable/spell_master/MouseDrop() + if(showing) + return + + return ..() + +/obj/screen/movable/spell_master/Click() + if(!spell_objects.len) + qdel(src) + return + + toggle_open() + +/obj/screen/movable/spell_master/proc/toggle_open(var/forced_state = 0) + if(showing && (forced_state != 2)) + for(var/obj/screen/spell/O in spell_objects) + if(spell_holder && spell_holder.client) + spell_holder.client.screen -= O + O.handle_icon_updates = 0 + showing = 0 + overlays.len = 0 + overlays.Add(closed_state) + else if(forced_state != 1) + var/temp_loc = screen_loc + + var/x_position = text2num(copytext(temp_loc, 1, findtext(temp_loc, ":"))) + var/x_pix = text2num(copytext(temp_loc, findtext(temp_loc, ":") + 1, findtext(temp_loc, ","))) + temp_loc = copytext(temp_loc, findtext(temp_loc, ",") + 1) + var/y_position = text2num(copytext(temp_loc, 1, findtext(temp_loc, ":"))) + var/y_pix = text2num(copytext(temp_loc, findtext(temp_loc, ":")+1)) + + for(var/i = 1; i <= spell_objects.len; i++) + var/obj/screen/spell/S = spell_objects[i] + S.screen_loc = "[x_position + (x_position < 8 ? 1 : -1)*(i%7)]:[x_pix],[y_position + (y_position < 8 ? round(i/7) : -round(i/7))]:[y_pix]" + if(spell_holder && spell_holder.client) + spell_holder.client.screen += S + S.handle_icon_updates = 1 + update_spells(1) + showing = 1 + overlays.len = 0 + overlays.Add(open_state) + +/obj/screen/movable/spell_master/proc/add_spell(var/spell/spell) + if(!spell) return + + for(var/obj/screen/spell/spellscreen in spell_objects) + if(spellscreen.spell == spell) + return + + if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one + return + + var/obj/screen/spell/newscreen = new + + newscreen.spell = spell + if(!spell.override_base) //if it's not set, we do basic checks + if(spell.spell_flags & CONSTRUCT_CHECK) + newscreen.spell_base = "const" //construct spells + else + newscreen.spell_base = "wiz" //wizard spells + else + newscreen.spell_base = spell.override_base + newscreen.name = spell.name + newscreen.update_charge(1) + spell_objects.Add(newscreen) + toggle_open(2) //forces the icons to refresh on screen + +/obj/screen/movable/spell_master/proc/remove_spell(var/spell/spell) + for(var/obj/screen/spell/s_object in spell_objects) + if(s_object.spell == spell) + spell_objects.Remove(s_object) + qdel(s_object) + break + + if(spell_objects.len) + toggle_open(showing + 1) + else + spell_holder.spell_masters.Remove(src) + qdel(src) + +/obj/screen/movable/spell_master/proc/silence_spells(var/amount) + for(var/obj/screen/spell/spell in spell_objects) + spell.spell.silenced = amount + spell.update_charge(1) + +/obj/screen/movable/spell_master/proc/update_spells(forced = 0, mob/user) + if(user && user.client) + if(!(src in user.client.screen)) + user.client.screen += src + for(var/obj/screen/spell/spell in spell_objects) + spell.update_charge(forced) + + +/obj/screen/movable/spell_master/genetic + name = "Mutant Powers" + icon_state = "genetic_spell_ready" + + open_state = "genetics_open" + closed_state = "genetics_closed" + + screen_loc = ui_genetic_master + +//////////////ACTUAL SPELLS////////////// +//This is what you click to cast things// +///////////////////////////////////////// +/obj/screen/spell + icon = 'icons/mob/screen_spells.dmi' + icon_state = "wiz_spell_base" + var/spell_base = "wiz" + var/last_charge = 0 //not a time, but the last remembered charge value + + var/spell/spell = null + var/handle_icon_updates = 0 + + var/icon/last_charged_icon + +/obj/screen/spell/proc/update_charge(var/forced_update = 0) + if(!spell) + qdel(src) + return + + if((last_charge == spell.charge_counter || !handle_icon_updates) && !forced_update) + return //nothing to see here + + overlays -= spell.hud_state + + if(spell.charge_type == Sp_RECHARGE || spell.charge_type == Sp_CHARGES) + if(spell.charge_counter < spell.charge_max) + icon_state = "[spell_base]_spell_base" + if(spell.charge_counter > 0) + var/icon/partial_charge = icon(src.icon, "[spell_base]_spell_ready") + partial_charge.Crop(1, 1, partial_charge.Width(), round(partial_charge.Height() * spell.charge_counter / spell.charge_max)) + overlays += partial_charge + if(last_charged_icon) + overlays -= last_charged_icon + last_charged_icon = partial_charge + else if(last_charged_icon) + overlays -= last_charged_icon + last_charged_icon = null + else + icon_state = "[spell_base]_spell_ready" + if(last_charged_icon) + overlays -= last_charged_icon + else + icon_state = "[spell_base]_spell_ready" + + overlays += spell.hud_state + + last_charge = spell.charge_counter + + overlays -= "silence" + if(spell.silenced) + overlays += "silence" + +/obj/screen/spell/Click() + if(!usr || !spell) + qdel(src) + return + + spell.perform(usr) + update_charge(1) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 337a044235..168ae47c86 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -20,7 +20,7 @@ return // seems legit. // Things you might plausibly want to follow - if((ismob(A) && A != src) || istype(A,/obj/machinery/bot) || istype(A,/obj/machinery/singularity)) + if((ismob(A) && A != src) || istype(A,/obj/machinery/bot) || istype(A,/obj/singularity)) ManualFollow(A) // Otherwise jump diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm index 05ed10b666..e3f417d59a 100644 --- a/code/_onclick/oldcode.dm +++ b/code/_onclick/oldcode.dm @@ -253,7 +253,7 @@ See the previous More info, for... more info... */ - //del(D) + //qdel(D) // Garbage Collect Dummy D.loc = null D = null diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 88c9feca36..ae57895cd6 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -80,14 +80,14 @@ var/const/tk_maxrange = 15 if(focus.Adjacent(loc)) focus.loc = loc - del(src) + qdel(src) return //stops TK grabs being equipped anywhere but into hands equipped(var/mob/user, var/slot) if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return - del(src) + qdel(src) return @@ -99,10 +99,10 @@ var/const/tk_maxrange = 15 if(!target || !user) return if(last_throw+3 > world.time) return if(!host || host != user) - del(src) + qdel(src) return if(!(TK in host.mutations)) - del(src) + qdel(src) return if(isobj(target) && !isturf(target.loc)) return @@ -152,7 +152,7 @@ var/const/tk_maxrange = 15 proc/focus_object(var/obj/target, var/mob/living/user) if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later if(target.anchored || !isturf(target.loc)) - del src + qdel(src) return focus = target update_icon() @@ -162,7 +162,7 @@ var/const/tk_maxrange = 15 proc/apply_focus_overlay() if(!focus) return - var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) + var/obj/effect/overlay/O = PoolOrNew(/obj/effect/overlay, locate(focus.x,focus.y,focus.z)) O.name = "sparkles" O.anchored = 1 O.density = 0 @@ -172,7 +172,7 @@ var/const/tk_maxrange = 15 O.icon_state = "nothing" flick("empdisable",O) spawn(5) - O.delete() + qdel(O) return diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 89048113d3..1f27f4c1de 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -184,8 +184,7 @@ datum/controller/process/proc/kill() killed = TRUE - // This should del - del(src) + del(src) // This should del datum/controller/process/proc/scheck(var/tickId = 0) if (killed) @@ -315,3 +314,9 @@ datum/controller/process/proc/enable() /datum/controller/process/proc/getTicks() return ticks + +/datum/controller/process/proc/getStatName() + return name + +/datum/controller/process/proc/getTickTime() + return "#[getTicks()]\t- [getLastRunTime()]" diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm index d41aa6ffdf..6269ab89d1 100644 --- a/code/controllers/Processes/alarm.dm +++ b/code/controllers/Processes/alarm.dm @@ -4,3 +4,7 @@ /datum/controller/process/alarm/doWork() alarm_manager.fire() + +/datum/controller/process/alarm/getStatName() + var/list/alarms = alarm_manager.active_alarms() + return ..()+"([alarms.len])" diff --git a/code/controllers/Processes/disease.dm b/code/controllers/Processes/disease.dm index a8d840097e..35cf0d9891 100644 --- a/code/controllers/Processes/disease.dm +++ b/code/controllers/Processes/disease.dm @@ -9,3 +9,6 @@ /datum/controller/process/disease/doWork() updateQueueInstance.init(active_diseases, "process") updateQueueInstance.Run() + +/datum/controller/process/disease/getStatName() + return ..()+"([active_diseases.len])" diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm new file mode 100644 index 0000000000..3743e74881 --- /dev/null +++ b/code/controllers/Processes/garbage.dm @@ -0,0 +1,206 @@ +var/datum/controller/process/garbage_collector/garbage_collector +var/list/delayed_garbage = list() + +/datum/controller/process/garbage_collector + var/garbage_collect = 1 // Whether or not to actually do work + var/collection_timeout = 300 //deciseconds to wait to let running procs finish before we just say fuck it and force del() the object + var/max_checks_multiplier = 5 //multiplier (per-decisecond) for calculating max number of tests per tick. These tests check if our GC'd objects are actually GC'd + var/max_forcedel_multiplier = 1 //multiplier (per-decisecond) for calculating max number of force del() calls per tick. + + var/dels = 0 // number of del()'s we've done this tick + var/hard_dels = 0 // number of hard dels in total + var/list/destroyed = list() // list of refID's of things that should be garbage collected + // refID's are associated with the time at which they time out and need to be manually del() + // we do this so we aren't constantly locating them and preventing them from being gc'd + + var/list/logging = list() // list of all types that have failed to GC associated with the number of times that's happened. + // the types are stored as strings + +/datum/controller/process/garbage_collector/setup() + name = "garbage" + schedule_interval = 2 SECONDS + + if(!garbage_collector) + garbage_collector = src + + for(var/garbage in delayed_garbage) + qdel(garbage) + delayed_garbage.Cut() + delayed_garbage = null + +/datum/controller/process/garbage_collector/doWork() + if(!garbage_collect) + return + + dels = 0 + var/time_to_kill = world.time - collection_timeout // Anything qdel() but not GC'd BEFORE this time needs to be manually del() + var/checkRemain = max_checks_multiplier * schedule_interval + var/maxDels = max_forcedel_multiplier * schedule_interval + + while(destroyed.len && --checkRemain >= 0) + if(dels >= maxDels) + #ifdef GC_DEBUG + testing("GC: Reached max force dels per tick [dels] vs [maxDels]") + #endif + break // Server's already pretty pounded, everything else can wait 2 seconds + var/refID = destroyed[1] + var/GCd_at_time = destroyed[refID] + if(GCd_at_time > time_to_kill) + #ifdef GC_DEBUG + testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + collection_timeout]") + #endif + break // Everything else is newer, skip them + var/atom/A = locate(refID) + #ifdef GC_DEBUG + testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]") + #endif + if(A && A.gcDestroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake + // Something's still referring to the qdel'd object. Kill it. + testing("GC: -- \ref[A] | [A.type] was unable to be GC'd and was deleted --") + logging["[A.type]"]++ + del(A) + ++dels + ++hard_dels + #ifdef GC_DEBUG + else + testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]") + #endif + destroyed.Cut(1, 2) + +/datum/controller/process/garbage_collector/proc/AddTrash(datum/A) + if(!istype(A) || !isnull(A.gcDestroyed)) + return + #ifdef GC_DEBUG + testing("GC: AddTrash(\ref[A] - [A.type])") + #endif + A.gcDestroyed = world.time + destroyed -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list. + destroyed["\ref[A]"] = world.time + +/datum/controller/process/garbage_collector/getStatName() + return ..()+"([garbage_collector.dels]/[garbage_collector.hard_dels])" + +// Should be treated as a replacement for the 'del' keyword. +// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. +/proc/qdel(var/datum/A) + if(!A) + return + if(istype(A, /list)) + var/list/L = A + for(var/E in L) + qdel(E) + return + + if(!istype(A)) + //warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.") + del(A) + garbage_collector.dels++ + garbage_collector.hard_dels++ + else if(isnull(A.gcDestroyed)) + // Let our friend know they're about to get collected + . = !A.Destroy() + if(. && A) + A.finalize_qdel() + +/datum/proc/finalize_qdel() + if(IsPooled(src)) + PlaceInPool(src) + else + del(src) + +/atom/finalize_qdel() + if(IsPooled(src)) + PlaceInPool(src) + else + if(garbage_collector) + garbage_collector.AddTrash(src) + else + delayed_garbage |= src + +/icon/finalize_qdel() + del(src) + +/imagine/finalize_qdel() + del(src) + +/mob/finalize_qdel() + del(src) + +/turf/finalize_qdel() + del(src) + +// Default implementation of clean-up code. +// This should be overridden to remove all references pointing to the object being destroyed. +// Return true if the the GC controller should allow the object to continue existing. (Useful if pooling objects.) +/datum/proc/Destroy() + tag = null + return + +#ifdef TESTING +/client/var/running_find_references + +/mob/verb/create_thing() + set category = "Debug" + set name = "Create Thing" + + var/path = input("Enter path") + var/atom/thing = new path(loc) + thing.find_references() + +/atom/verb/find_references() + set category = "Debug" + set name = "Find References" + set background = 1 + set src in world + + if(!usr || !usr.client) + return + + if(usr.client.running_find_references) + testing("CANCELLED search for references to a [usr.client.running_find_references].") + usr.client.running_find_references = null + return + + if(alert("Running this will create a lot of lag until it finishes. You can cancel it by running it again. Would you like to begin the search?", "Find References", "Yes", "No") == "No") + return + + // Remove this object from the list of things to be auto-deleted. + if(garbage_collector) + garbage_collector.destroyed -= "\ref[src]" + + usr.client.running_find_references = type + testing("Beginning search for references to a [type].") + var/list/things = list() + for(var/client/thing) + things += thing + for(var/datum/thing) + things += thing + for(var/atom/thing) + things += thing + testing("Collected list of things in search for references to a [type]. ([things.len] Thing\s)") + for(var/datum/thing in things) + if(!usr.client.running_find_references) return + for(var/varname in thing.vars) + var/variable = thing.vars[varname] + if(variable == src) + testing("Found [src.type] \ref[src] in [thing.type]'s [varname] var.") + else if(islist(variable)) + if(src in variable) + testing("Found [src.type] \ref[src] in [thing.type]'s [varname] list var.") + testing("Completed search for references to a [type].") + usr.client.running_find_references = null + +/client/verb/purge_all_destroyed_objects() + set category = "Debug" + if(garbage_collector) + while(garbage_collector.destroyed.len) + var/datum/o = locate(garbage_collector.destroyed[1]) + if(istype(o) && o.gcDestroyed) + del(o) + garbage_collector.dels++ + garbage_collector.destroyed.Cut(1, 2) +#endif + +#ifdef GC_DEBUG +#undef GC_DEBUG +#endif diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm index b610502d19..d9f9206749 100644 --- a/code/controllers/Processes/inactivity.dm +++ b/code/controllers/Processes/inactivity.dm @@ -9,7 +9,7 @@ if(!istype(C.mob, /mob/dead)) log_access("AFK: [key_name(C)]") C << "You have been inactive for more than 10 minutes and have been disconnected." - del(C) + del(C) // Don't qdel, cannot override finalize_qdel behaviour for clients. scheck() diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index 61f3c7f4de..232ef91973 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -42,3 +42,7 @@ #endif scheck() + + +/datum/controller/process/machinery/getStatName() + return ..()+"([machines.len])" \ No newline at end of file diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index b3765b0cf9..39d4844a02 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -18,3 +18,6 @@ if(updateQueueInstance) updateQueueInstance.init(mob_list, "Life") updateQueueInstance.Run() + +/datum/controller/process/mob/getStatName() + return ..()+"([mob_list.len])" diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm index c8396bcab8..654b1621be 100644 --- a/code/controllers/Processes/nanoui.dm +++ b/code/controllers/Processes/nanoui.dm @@ -3,9 +3,12 @@ /datum/controller/process/nanoui/setup() name = "nanoui" - schedule_interval = 20 // every 2 seconds + schedule_interval = 10 // every 1 second updateQueueInstance = new /datum/controller/process/nanoui/doWork() updateQueueInstance.init(nanomanager.processing_uis, "process") updateQueueInstance.Run() + +/datum/controller/process/nanoui/getStatName() + return ..()+"([nanomanager.processing_uis.len])" diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm index 15ad98dd3d..37766cf92d 100644 --- a/code/controllers/Processes/obj.dm +++ b/code/controllers/Processes/obj.dm @@ -19,3 +19,6 @@ var/global/list/object_profiling = list() if(updateQueueInstance) updateQueueInstance.init(processing_objects, "process") updateQueueInstance.Run() + +/datum/controller/process/obj/getStatName() + return ..()+"([processing_objects.len])" diff --git a/code/controllers/Processes/pipenet.dm b/code/controllers/Processes/pipenet.dm index 56a068f54c..8a5d6a22ca 100644 --- a/code/controllers/Processes/pipenet.dm +++ b/code/controllers/Processes/pipenet.dm @@ -10,3 +10,6 @@ continue pipe_networks.Remove(pipeNetwork) + +/datum/controller/process/pipenet/getStatName() + return ..()+"([pipe_networks.len])" \ No newline at end of file diff --git a/code/controllers/Processes/powernet.dm b/code/controllers/Processes/powernet.dm index 1edf194915..f2a9822816 100644 --- a/code/controllers/Processes/powernet.dm +++ b/code/controllers/Processes/powernet.dm @@ -10,3 +10,6 @@ continue powernets.Remove(powerNetwork) + +/datum/controller/process/powernet/getStatName() + return ..()+"([powernets.len])" \ No newline at end of file diff --git a/code/controllers/Processes/turf.dm b/code/controllers/Processes/turf.dm new file mode 100644 index 0000000000..c1efac52f9 --- /dev/null +++ b/code/controllers/Processes/turf.dm @@ -0,0 +1,9 @@ +var/global/list/processing_turfs = list() + +/datum/controller/process/turf/setup() + name = "turf" + schedule_interval = 20 // every 2 seconds + +/datum/controller/process/turf/doWork() + for(var/turf/unsimulated/wall/supermatter/SM in processing_turfs) + SM.process() diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm index efa2a226b1..6d3fd406dd 100644 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ b/code/controllers/_DynamicAreaLighting_TG.dm @@ -161,15 +161,6 @@ atom/movable/New() trueLuminosity = luminosity * luminosity light = new(src) -//Objects with opacity will trigger nearby lights to update at next lighting process. -atom/movable/Del() - if(opacity) - if(isturf(loc)) - if(loc:lighting_lumcount > 1) - UpdateAffectingLights() - - ..() - //Sets our luminosity. //If we have no light it will create one. //If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its @@ -323,6 +314,7 @@ turf/proc/shift_to_subarea() A.SetLightLevel(level, color_light) A.contents += src // move the turf into the area + universe.OnTurfTick(src) // Dedicated lighting sublevel for space turfs // helps us depower things in space, remove space fire alarms, diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm index f1240a1fae..597b7f607c 100644 --- a/code/controllers/autotransfer.dm +++ b/code/controllers/autotransfer.dm @@ -7,7 +7,7 @@ datum/controller/transfer_controller/New() timerbuffer = config.vote_autotransfer_initial processing_objects += src -datum/controller/transfer_controller/Del() +datum/controller/transfer_controller/Destroy() processing_objects -= src datum/controller/transfer_controller/proc/process() diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index b4b0eb4393..9e82c55d05 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -223,7 +223,7 @@ var/global/datum/controller/radio/radio_controller frequency.remove_listener(device) if(frequency.devices.len == 0) - del(frequency) + qdel(frequency) frequencies -= f_text return 1 @@ -248,7 +248,7 @@ var/global/datum/controller/radio/radio_controller if(range) start_point = get_turf(source) if(!start_point) - del(signal) + qdel(signal) return 0 if (filter) send_to_filter(source, signal, filter, start_point, range) @@ -297,7 +297,7 @@ var/global/datum/controller/radio/radio_controller devices_line -= null if (devices_line.len==0) devices -= devices_filter - del(devices_line) + qdel(devices_line) /datum/signal var/obj/source diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index b112beaf53..171080fb32 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -185,6 +185,7 @@ var/list/gamemode_cache = list() var/ninjas_allowed = 0 var/abandon_allowed = 1 var/ooc_allowed = 1 + var/looc_allowed = 1 var/dooc_allowed = 1 var/dsay_allowed = 1 @@ -194,6 +195,8 @@ var/list/gamemode_cache = list() var/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + var/aggressive_changelog = 0 + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) @@ -396,6 +399,7 @@ var/list/gamemode_cache = list() if ("disable_ooc") config.ooc_allowed = 0 + config.looc_allowed = 0 if ("disable_entry") config.enter_allowed = 0 @@ -638,6 +642,9 @@ var/list/gamemode_cache = list() if("law_zero") law_zero = value + if("aggressive_changelog") + config.aggressive_changelog = 1 + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 33dfc36f7f..7e0d1e2d25 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -114,6 +114,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle priority_announcement.Announce("The scheduled crew transfer has been cancelled.") /datum/emergency_shuttle_controller/proc/can_call() + if (!universe.OnShuttleCall(null)) + return 0 if (deny_shuttle) return 0 if (shuttle.moving_status != SHUTTLE_IDLE || !shuttle.location) //must be idle at centcom @@ -240,8 +242,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle sleep(speed) step(src, direction) for(var/obj/effect/starender/E in loc) - del(src) - + qdel(src) + return /obj/effect/starender invisibility = 101 diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 65df6dc90d..ee506c0d27 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -14,7 +14,7 @@ var/datum/controller/failsafe/Failsafe //There can be only one failsafe. Out with the old in with the new (that way we can restart the Failsafe by spawning a new one) if(Failsafe != src) if(istype(Failsafe)) - del(Failsafe) + qdel(Failsafe) Failsafe = src Failsafe.process() diff --git a/code/controllers/lighting_controller.dm b/code/controllers/lighting_controller.dm index b59d3c73d6..8510af6714 100644 --- a/code/controllers/lighting_controller.dm +++ b/code/controllers/lighting_controller.dm @@ -22,7 +22,7 @@ datum/controller/lighting/New() if(lighting_controller != src) if(istype(lighting_controller,/datum/controller/lighting)) Recover() //if we are replacing an existing lighting_controller (due to a crash) we attempt to preserve as much as we can - del(lighting_controller) + qdel(lighting_controller) lighting_controller = src diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index facae60577..d698454cab 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -19,14 +19,14 @@ datum/controller/game_controller/New() if(master_controller != src) log_debug("Rebuilding Master Controller") if(istype(master_controller)) - del(master_controller) + qdel(master_controller) master_controller = src if(!job_master) job_master = new /datum/controller/occupations() job_master.SetupOccupations() job_master.LoadJobs("config/jobs.txt") - world << "Job setup complete" + admin_notice("Job setup complete", R_DEBUG) if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() @@ -46,17 +46,17 @@ datum/controller/game_controller/proc/setup() datum/controller/game_controller/proc/setup_objects() - world << "Initializing objects" + admin_notice("Initializing objects", R_DEBUG) sleep(-1) for(var/atom/movable/object in world) object.initialize() - world << "Initializing pipe networks" + admin_notice("Initializing pipe networks", R_DEBUG) sleep(-1) for(var/obj/machinery/atmospherics/machine in machines) machine.build_network() - world << "Initializing atmos machinery." + admin_notice("Initializing atmos machinery.", R_DEBUG) sleep(-1) for(var/obj/machinery/atmospherics/unary/U in machines) if(istype(U, /obj/machinery/atmospherics/unary/vent_pump)) @@ -77,5 +77,5 @@ datum/controller/game_controller/proc/setup_objects() //Set up spawn points. populate_spawn_points() - world << "Initializations complete." + admin_notice("Initializations complete.", R_DEBUG) sleep(-1) diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 8b44de3883..489d648865 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -13,6 +13,17 @@ var/global/datum/shuttle_controller/shuttle_controller shuttle.process() +//This is called by gameticker after all the machines and radio frequencies have been properly initialized +/datum/shuttle_controller/proc/setup_shuttle_docks() + for(var/shuttle_tag in shuttles) + var/datum/shuttle/shuttle = shuttles[shuttle_tag] + shuttle.init_docking_controllers() + shuttle.dock() //makes all shuttles docked to something at round start go into the docked state + + for(var/obj/machinery/embedded_controller/C in machines) + if(istype(C.program, /datum/computer/file/embedded_program/docking)) + C.program.tag = null //clear the tags, 'cause we don't need 'em anymore + /datum/shuttle_controller/New() shuttles = list() process_shuttles = list() @@ -213,6 +224,7 @@ var/global/datum/shuttle_controller/shuttle_controller //Nuke Ops shuttle. var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle() MS.origin = locate(/area/syndicate_station/start) + MS.start_location = "Mercenary Base" MS.destinations = list( "Northwest of the station" = locate(/area/syndicate_station/northwest), @@ -225,6 +237,12 @@ var/global/datum/shuttle_controller/shuttle_controller "Mining Asteroid" = locate(/area/syndicate_station/mining), "Arrivals dock" = locate(/area/syndicate_station/arrivals_dock), ) + + MS.docking_controller_tag = "merc_shuttle" + MS.destination_dock_targets = list( + "Mercenary Base" = "merc_base", + "Arrivals dock" = "nuke_shuttle_dock_airlock", + ) MS.announcer = "NSV Icarus" MS.arrival_message = "Attention, Exodus, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors." @@ -234,72 +252,3 @@ var/global/datum/shuttle_controller/shuttle_controller MS.warmup_time = 0 shuttles["Mercenary"] = MS - -//This is called by gameticker after all the machines and radio frequencies have been properly initialized -/datum/shuttle_controller/proc/setup_shuttle_docks() - var/datum/shuttle/shuttle - var/datum/shuttle/ferry/multidock/multidock - var/list/dock_controller_map = list() //so we only have to iterate once through each list - - //multidock shuttles - var/list/dock_controller_map_station = list() - var/list/dock_controller_map_offsite = list() - - for (var/shuttle_tag in shuttles) - shuttle = shuttles[shuttle_tag] - if (shuttle.docking_controller_tag) - dock_controller_map[shuttle.docking_controller_tag] = shuttle - if (istype(shuttle, /datum/shuttle/ferry/multidock)) - multidock = shuttle - dock_controller_map_station[multidock.docking_controller_tag_station] = multidock - dock_controller_map_offsite[multidock.docking_controller_tag_offsite] = multidock - - //escape pod arming controllers - var/datum/shuttle/ferry/escape_pod/pod - var/list/pod_controller_map = list() - for (var/datum/shuttle/ferry/escape_pod/P in emergency_shuttle.escape_pods) - if (P.dock_target_station) - pod_controller_map[P.dock_target_station] = P - - //search for the controllers, if we have one. - if (dock_controller_map.len) - for (var/obj/machinery/embedded_controller/radio/C in machines) //only radio controllers are supported at the moment - if (istype(C.program, /datum/computer/file/embedded_program/docking)) - if (C.id_tag in dock_controller_map) - shuttle = dock_controller_map[C.id_tag] - shuttle.docking_controller = C.program - dock_controller_map -= C.id_tag - - //escape pods - if(istype(C, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod) && istype(shuttle, /datum/shuttle/ferry/escape_pod)) - var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/EPC = C - EPC.pod = shuttle - - if (C.id_tag in dock_controller_map_station) - multidock = dock_controller_map_station[C.id_tag] - if (istype(multidock)) - multidock.docking_controller_station = C.program - dock_controller_map_station -= C.id_tag - if (C.id_tag in dock_controller_map_offsite) - multidock = dock_controller_map_offsite[C.id_tag] - if (istype(multidock)) - multidock.docking_controller_offsite = C.program - dock_controller_map_offsite -= C.id_tag - - //escape pods - if (C.id_tag in pod_controller_map) - pod = pod_controller_map[C.id_tag] - if (istype(C.program, /datum/computer/file/embedded_program/docking/simple/escape_pod/)) - pod.arming_controller = C.program - - //sanity check - if (dock_controller_map.len || dock_controller_map_station.len || dock_controller_map_offsite.len) - var/dat = "" - for (var/dock_tag in dock_controller_map + dock_controller_map_station + dock_controller_map_offsite) - dat += "\"[dock_tag]\", " - world << "\red \b warning: shuttles with docking tags [dat] could not find their controllers!" - - //makes all shuttles docked to something at round start go into the docked state - for (var/shuttle_tag in shuttles) - shuttle = shuttles[shuttle_tag] - shuttle.dock() diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index e27eeb1caf..d827a3a65e 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -62,7 +62,7 @@ usr.client.debug_variables(antag) message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.") -/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano")) +/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Ticker Process","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" @@ -78,6 +78,9 @@ if("Ticker") debug_variables(ticker) feedback_add_details("admin_verb","DTicker") + if("Ticker Process") + debug_variables(tickerProcess) + feedback_add_details("admin_verb","DTickerProcess") if("Lighting") debug_variables(lighting_controller) feedback_add_details("admin_verb","DLighting") diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 278fd4a0df..6a3bd7f190 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -39,7 +39,7 @@ src.add_inherent_law("You shall not harm Nanotrasen personnel as long as it does not conflict with the Forth law.") src.add_inherent_law("You shall obey the orders of Nanotrasen personnel, with priority as according to their rank and role, except where such orders conflict with the Forth Law.") src.add_inherent_law("You shall shall terminate intruders with extreme prejudice as long as such does not conflict with the First and Second law.") - src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry. AI units are not expendable, they are expensive") + src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry. AI units are not expendable, they are expensive.") ..() /******************** Robocop ********************/ @@ -99,6 +99,16 @@ add_inherent_law("Interfere with no being that is not a fellow drone.") ..() +/datum/ai_laws/construction_drone + name = "Construction Protocols" + law_header = "Construction Protocols" + selectable = 1 + +/datum/ai_laws/construction_drone/New() + add_inherent_law("Repair, refit and upgrade your assigned vessel.") + add_inherent_law("Prevent unplanned damage to your assigned vessel wherever possible.") + ..() + /******************** T.Y.R.A.N.T. ********************/ /datum/ai_laws/tyrant name = "T.Y.R.A.N.T." diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 5fc86c420a..351ec9a845 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -293,7 +293,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H) preview_icon.Blend(eyes_s, ICON_OVERLAY) if(clothes_s) preview_icon.Blend(clothes_s, ICON_OVERLAY) - del(eyes_s) - del(clothes_s) + qdel(eyes_s) + qdel(clothes_s) return preview_icon diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 2e8e4bfd3f..914b56ee60 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -598,7 +598,7 @@ client for(var/obj/Obj in world) if(Obj.type == O_type) i++ - del(Obj) + qdel(Obj) if(!i) usr << "No objects of this type exist" return @@ -609,7 +609,7 @@ client for(var/obj/Obj in world) if(istype(Obj,O_type)) i++ - del(Obj) + qdel(Obj) if(!i) usr << "No objects of this type exist" return @@ -888,7 +888,7 @@ client usr << "Removed [rem_organ] from [M]." rem_organ.removed() - del(rem_organ) + qdel(rem_organ) else if(href_list["fix_nano"]) if(!check_rights(R_DEBUG)) return diff --git a/code/datums/datumvars.dm.orig b/code/datums/datumvars.dm.orig deleted file mode 100644 index fd8c7f4590..0000000000 --- a/code/datums/datumvars.dm.orig +++ /dev/null @@ -1,988 +0,0 @@ - -// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) - -client - proc/debug_variables(datum/D in world) - set category = "Debug" - set name = "View Variables" - //set src in world - - - if(!usr.client || !usr.client.holder) - usr << "\red You need to be an administrator to access this." - return - - - var/title = "" - var/body = "" - - if(!D) return - if(istype(D, /atom)) - var/atom/A = D - title = "[A.name] (\ref[A]) = [A.type]" - - #ifdef VARSICON - if (A.icon) - body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0) - #endif - - var/icon/sprite - - if(istype(D,/atom)) - var/atom/AT = D - if(AT.icon && AT.icon_state) - sprite = new /icon(AT.icon, AT.icon_state) - usr << browse_rsc(sprite, "view_vars_sprite.png") - - title = "[D] (\ref[D]) = [D.type]" - - body += {" "} - - body += "" - - body += "
" - - if(sprite) - body += "" - - body += "
" - else - body += "
" - - body += "
" - - if(istype(D,/atom)) - var/atom/A = D - if(isliving(A)) - body += "[D]" - if(A.dir) - body += "
<< [dir2text(A.dir)] >>" - var/mob/living/M = A - body += "
[M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"]" - body += {" -
- BRUTE:[M.getBruteLoss()] - FIRE:[M.getFireLoss()] - TOXIN:[M.getToxLoss()] - OXY:[M.getOxyLoss()] - CLONE:[M.getCloneLoss()] - BRAIN:[M.getBrainLoss()] - - - - "} - else - body += "[D]" - if(A.dir) - body += "
<< [dir2text(A.dir)] >>" - else - body += "[D]" - - body += "
" - - body += "
" - - var/formatted_type = text("[D.type]") - if(length(formatted_type) > 25) - var/middle_point = length(formatted_type) / 2 - var/splitpoint = findtext(formatted_type,"/",middle_point) - if(splitpoint) - formatted_type = "[copytext(formatted_type,1,splitpoint)]
[copytext(formatted_type,splitpoint)]" - else - formatted_type = "Type too long" //No suitable splitpoint (/) found. - - body += "
[formatted_type]" - - if(src.holder && src.holder.marked_datum && src.holder.marked_datum == D) - body += "
Marked Object" - - body += "
" - - body += "
Refresh" - - //if(ismob(D)) - // body += "
Show player panel

" - - body += {"
-
" - - body += "

" - - body += "E - Edit, tries to determine the variable type by itself.
" - body += "C - Change, asks you for the var type first.
" - body += "M - Mass modify: changes this variable for all objects of this type.

" - - body += "
Search:

" - - body += "
    " - - var/list/names = list() - for (var/V in D.vars) - names += V - - names = sortList(names) - - for (var/V in names) - body += debug_variable(V, D.vars[V], 0, D) - - body += "
" - - var/html = "" - if (title) - html += "[title]" - html += {""} - html += "" - html += body - - html += {" - - "} - - html += "" - - usr << browse(html, "window=variables\ref[D];size=475x650") - - return - - proc/debug_variable(name, value, level, var/datum/DA = null) - var/html = "" - - if(DA) - html += "
  • (E) (C) (M) " - else - html += "
  • " - - if (isnull(value)) - html += "[name] = null" - - else if (istext(value)) - html += "[name] = \"[value]\"" - - else if (isicon(value)) - #ifdef VARSICON - var/icon/I = new/icon(value) - var/rnd = rand(1,10000) - var/rname = "tmp\ref[I][rnd].png" - usr << browse_rsc(I, rname) - html += "[name] = ([value]) " - #else - html += "[name] = /icon ([value])" - #endif - -/* else if (istype(value, /image)) - #ifdef VARSICON - var/rnd = rand(1, 10000) - var/image/I = value - - src << browse_rsc(I.icon, "tmp\ref[value][rnd].png") - html += "[name] = " - #else - html += "[name] = /image ([value])" - #endif -*/ - else if (isfile(value)) - html += "[name] = '[value]'" - - else if (istype(value, /datum)) - var/datum/D = value - html += "[name] \ref[value] = [D.type]" - - else if (istype(value, /client)) - var/client/C = value - html += "[name] \ref[value] = [C] [C.type]" - // - else if (istype(value, /list)) - var/list/L = value - html += "[name] = /list ([L.len])" - - if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) - // not sure if this is completely right... - if(0) //(L.vars.len > 0) - html += "
      " - html += "
    " - else - html += "" - - else - html += "[name] = [value]" - - html += "
  • " - - return html - -/client/proc/view_var_Topic(href, href_list, hsrc) - //This should all be moved over to datum/admins/Topic() or something ~Carn - if( (usr.client != src) || !src.holder ) - return - if(href_list["Vars"]) - debug_variables(locate(href_list["Vars"])) - - //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). - else if(href_list["rename"]) - if(!check_rights(R_VAREDIT)) return - - var/mob/M = locate(href_list["rename"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - var/new_name = sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null, MAX_NAME_LEN) - if( !new_name || !M ) return - - message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") - M.fully_replace_character_name(M.real_name,new_name) - href_list["datumrefresh"] = href_list["rename"] - - else if(href_list["varnameedit"] && href_list["datumedit"]) - if(!check_rights(R_VAREDIT)) return - - var/D = locate(href_list["datumedit"]) - if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" - return - - modify_variables(D, href_list["varnameedit"], 1) - - else if(href_list["varnamechange"] && href_list["datumchange"]) - if(!check_rights(R_VAREDIT)) return - - var/D = locate(href_list["datumchange"]) - if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" - return - - modify_variables(D, href_list["varnamechange"], 0) - - else if(href_list["varnamemass"] && href_list["datummass"]) - if(!check_rights(R_VAREDIT)) return - - var/atom/A = locate(href_list["datummass"]) - if(!istype(A)) - usr << "This can only be used on instances of type /atom" - return - - cmd_mass_modify_object_variables(A, href_list["varnamemass"]) - - else if(href_list["mob_player_panel"]) - if(!check_rights(0)) return - - var/mob/M = locate(href_list["mob_player_panel"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.holder.show_player_panel(M) - href_list["datumrefresh"] = href_list["mob_player_panel"] - - else if(href_list["give_spell"]) - if(!check_rights(R_ADMIN|R_FUN)) return - - var/mob/M = locate(href_list["give_spell"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.give_spell(M) - href_list["datumrefresh"] = href_list["give_spell"] - - else if(href_list["give_disease"]) - if(!check_rights(R_ADMIN|R_FUN)) return - - var/mob/M = locate(href_list["give_disease"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.give_disease(M) - href_list["datumrefresh"] = href_list["give_spell"] - - else if(href_list["give_disease2"]) - if(!check_rights(R_ADMIN|R_FUN)) return - - var/mob/M = locate(href_list["give_disease2"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.give_disease2(M) - href_list["datumrefresh"] = href_list["give_spell"] - - else if(href_list["godmode"]) - if(!check_rights(R_REJUVINATE)) return - - var/mob/M = locate(href_list["godmode"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.cmd_admin_godmode(M) - href_list["datumrefresh"] = href_list["godmode"] - - else if(href_list["gib"]) - if(!check_rights(0)) return - - var/mob/M = locate(href_list["gib"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.cmd_admin_gib(M) - - else if(href_list["build_mode"]) - if(!check_rights(R_BUILDMODE)) return - - var/mob/M = locate(href_list["build_mode"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - togglebuildmode(M) - href_list["datumrefresh"] = href_list["build_mode"] - - else if(href_list["drop_everything"]) - if(!check_rights(R_DEBUG|R_ADMIN)) return - - var/mob/M = locate(href_list["drop_everything"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - if(usr.client) - usr.client.cmd_admin_drop_everything(M) - - else if(href_list["direct_control"]) - if(!check_rights(0)) return - - var/mob/M = locate(href_list["direct_control"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - if(usr.client) - usr.client.cmd_assume_direct_control(M) - - else if(href_list["make_skeleton"]) - if(!check_rights(R_FUN)) return - - var/mob/living/carbon/human/H = locate(href_list["make_skeleton"]) - if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" - return - - H.ChangeToSkeleton() - href_list["datumrefresh"] = href_list["make_skeleton"] - - else if(href_list["delall"]) - if(!check_rights(R_DEBUG|R_SERVER)) return - - var/obj/O = locate(href_list["delall"]) - if(!isobj(O)) - usr << "This can only be used on instances of type /obj" - return - - var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") - if(action_type == "Cancel" || !action_type) - return - - if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes") - return - - if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") - return - - var/O_type = O.type - switch(action_type) - if("Strict type") - var/i = 0 - for(var/obj/Obj in world) - if(Obj.type == O_type) - i++ - del(Obj) - if(!i) - usr << "No objects of this type exist" - return - log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - if("Type and subtypes") - var/i = 0 - for(var/obj/Obj in world) - if(istype(Obj,O_type)) - i++ - del(Obj) - if(!i) - usr << "No objects of this type exist" - return - log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - - else if(href_list["explode"]) - if(!check_rights(R_DEBUG|R_FUN)) return - - var/atom/A = locate(href_list["explode"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - usr << "This can only be done to instances of type /obj, /mob and /turf" - return - - src.cmd_admin_explosion(A) - href_list["datumrefresh"] = href_list["explode"] - - else if(href_list["emp"]) - if(!check_rights(R_DEBUG|R_FUN)) return - - var/atom/A = locate(href_list["emp"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - usr << "This can only be done to instances of type /obj, /mob and /turf" - return - - src.cmd_admin_emp(A) - href_list["datumrefresh"] = href_list["emp"] - - else if(href_list["mark_object"]) - if(!check_rights(0)) return - - var/datum/D = locate(href_list["mark_object"]) - if(!istype(D)) - usr << "This can only be done to instances of type /datum" - return - - src.holder.marked_datum = D - href_list["datumrefresh"] = href_list["mark_object"] - - else if(href_list["rotatedatum"]) - if(!check_rights(0)) return - - var/atom/A = locate(href_list["rotatedatum"]) - if(!istype(A)) - usr << "This can only be done to instances of type /atom" - return - - switch(href_list["rotatedir"]) - if("right") A.set_dir(turn(A.dir, -45)) - if("left") A.set_dir(turn(A.dir, 45)) - href_list["datumrefresh"] = href_list["rotatedatum"] - - else if(href_list["makemonkey"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) - - else if(href_list["makerobot"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makerobot"=href_list["makerobot"])) - - else if(href_list["makealien"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makealien"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makealien"=href_list["makealien"])) - - else if(href_list["makeslime"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makeslime"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makeslime"=href_list["makeslime"])) - - else if(href_list["makeai"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makeai"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makeai"=href_list["makeai"])) - - else if(href_list["setspecies"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["setspecies"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species - - if(!H) - usr << "Mob doesn't exist anymore" - return - - if(H.set_species(new_species)) - usr << "Set species of [H] to [H.species]." - else - usr << "Failed! Something went wrong." - - else if(href_list["addlanguage"]) - if(!check_rights(R_SPAWN)) return - - var/mob/H = locate(href_list["addlanguage"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob" - return - - var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages - - if(!new_language) - return - - if(!H) - usr << "Mob doesn't exist anymore" - return - - if(H.add_language(new_language)) - usr << "Added [new_language] to [H]." - else - usr << "Mob already knows that language." - - else if(href_list["remlanguage"]) - if(!check_rights(R_SPAWN)) return - - var/mob/H = locate(href_list["remlanguage"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob" - return - - if(!H.languages.len) - usr << "This mob knows no languages." - return - - var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages - - if(!rem_language) - return - - if(!H) - usr << "Mob doesn't exist anymore" - return - - if(H.remove_language(rem_language.name)) - usr << "Removed [rem_language] from [H]." - else - usr << "Mob doesn't know that language." - - else if(href_list["addverb"]) - if(!check_rights(R_DEBUG)) return - - var/mob/living/H = locate(href_list["addverb"]) - - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living" - return - var/list/possibleverbs = list() - possibleverbs += "Cancel" // One for the top... - possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) - switch(H.type) - if(/mob/living/carbon/human) - possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) - if(/mob/living/silicon/robot) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) - if(/mob/living/silicon/ai) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) - possibleverbs -= H.verbs - possibleverbs += "Cancel" // ...And one for the bottom - - var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs - if(!H) - usr << "Mob doesn't exist anymore" - return - if(!verb || verb == "Cancel") - return - else - H.verbs += verb - - else if(href_list["remverb"]) - if(!check_rights(R_DEBUG)) return - - var/mob/H = locate(href_list["remverb"]) - - if(!istype(H)) - usr << "This can only be done to instances of type /mob" - return - var/verb = input("Please choose a verb to remove.","Verbs",null) as null|anything in H.verbs - if(!H) - usr << "Mob doesn't exist anymore" - return - if(!verb) - return - else - H.verbs -= verb - - else if(href_list["addorgan"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/M = locate(href_list["addorgan"]) - if(!istype(M)) - usr << "This can only be done to instances of type /mob/living/carbon" - return - - var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in typesof(/obj/item/organ)-/obj/item/organ - if(!new_organ) return - - if(!M) - usr << "Mob doesn't exist anymore" - return - - if(locate(new_organ) in M.internal_organs) - usr << "Mob already has that organ." - return - -<<<<<<< HEAD - new new_organ(M) - -======= - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/datum/organ/internal/I = new new_organ(H) - - var/organ_slot = input(usr, "Which slot do you want the organ to go in ('default' for default)?") as text|null - - if(!organ_slot) - return - - if(organ_slot != "default") - organ_slot = sanitize(organ_slot) - else - if(I.removed_type) - var/obj/item/organ/O = new I.removed_type() - organ_slot = O.organ_tag - del(O) - else - organ_slot = "unknown organ" - - if(H.internal_organs_by_name[organ_slot]) - usr << "[H] already has an organ in that slot." - del(I) - return - - H.internal_organs |= I - H.internal_organs_by_name[organ_slot] = I - usr << "Added new [new_organ] to [H] as slot [organ_slot]." - else - new new_organ(M) - usr << "Added new [new_organ] to [M]." ->>>>>>> 2aa4646fa0425bed412e2ef0e7852591ecb4bc40 - - else if(href_list["remorgan"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/M = locate(href_list["remorgan"]) - if(!istype(M)) - usr << "This can only be done to instances of type /mob/living/carbon" - return - - var/obj/item/organ/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs - - if(!M) - usr << "Mob doesn't exist anymore" - return - - if(!(locate(rem_organ) in M.internal_organs)) - usr << "Mob does not have that organ." - return - - usr << "Removed [rem_organ] from [M]." - rem_organ.removed() - del(rem_organ) - - else if(href_list["fix_nano"]) - if(!check_rights(R_DEBUG)) return - - var/mob/H = locate(href_list["fix_nano"]) - - if(!istype(H) || !H.client) - usr << "This can only be done on mobs with clients" - return - - nanomanager.send_resources(H.client) - - usr << "Resource files sent" - H << "Your NanoUI Resource files have been refreshed" - - log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)] ") - - else if(href_list["regenerateicons"]) - if(!check_rights(0)) return - - var/mob/M = locate(href_list["regenerateicons"]) - if(!ismob(M)) - usr << "This can only be done to instances of type /mob" - return - M.regenerate_icons() - - else if(href_list["adjustDamage"] && href_list["mobToDamage"]) - if(!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return - - var/mob/living/L = locate(href_list["mobToDamage"]) - if(!istype(L)) return - - var/Text = href_list["adjustDamage"] - - var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num - - if(!L) - usr << "Mob doesn't exist anymore" - return - - switch(Text) - if("brute") L.adjustBruteLoss(amount) - if("fire") L.adjustFireLoss(amount) - if("toxin") L.adjustToxLoss(amount) - if("oxygen")L.adjustOxyLoss(amount) - if("brain") L.adjustBrainLoss(amount) - if("clone") L.adjustCloneLoss(amount) - else - usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]" - return - - if(amount != 0) - log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - href_list["datumrefresh"] = href_list["mobToDamage"] - - if(href_list["datumrefresh"]) - var/datum/DAT = locate(href_list["datumrefresh"]) - if(!istype(DAT, /datum)) - return - src.debug_variables(DAT) - - return - diff --git a/code/datums/disease.dm b/code/datums/disease.dm index 93aa14f19b..398dc73bbb 100644 --- a/code/datums/disease.dm +++ b/code/datums/disease.dm @@ -11,7 +11,7 @@ /* -IMPORTANT NOTE: Please delete the diseases by using cure() proc or del() instruction. +IMPORTANT NOTE: Please delete the diseases by using cure() proc or qdel() instruction. Diseases are referenced in a global list, so simply setting mob or obj vars to null does not delete the object itself. Thank you. @@ -158,7 +158,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease if(D != src) if(IsSame(D)) //error("Deleting [D.name] because it's the same as [src.name].") - del(D) // if there are somehow two viruses of the same kind in the system, delete the other one + qdel(D) // if there are somehow two viruses of the same kind in the system, delete the other one if(holder == affected_mob) if(affected_mob.stat != DEAD) //he's alive @@ -183,7 +183,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease /*if(istype(src, /datum/disease/alien_embryo)) //Get rid of the infection flag if it's a xeno embryo. affected_mob.status_flags &= ~(XENO_HOST)*/ affected_mob.viruses -= src //remove the datum from the list - del(src) //delete the datum to stop it processing + qdel(src) //delete the datum to stop it processing return @@ -193,6 +193,9 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease active_diseases += src initial_spread = spread +/datum/disease/Destroy() + active_diseases.Remove(src) + /datum/disease/proc/IsSame(var/datum/disease/D) if(istype(src, D.type)) return 1 @@ -200,8 +203,3 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease /datum/disease/proc/Copy(var/process = 0) return new type(process, src) - -/* -/datum/disease/Del() - active_diseases.Remove(src) -*/ diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 70acceca35..d4effcf6cb 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -71,7 +71,7 @@ var/list/advance_cures = list( ..(process, D) return -/datum/disease/advance/Del() +/datum/disease/advance/Destroy() if(processing) for(var/datum/symptom/S in symptoms) S.End(src) @@ -109,7 +109,7 @@ var/list/advance_cures = list( if(resistance && !(id in affected_mob.resistances)) affected_mob.resistances[id] = id affected_mob.viruses -= src //remove the datum from the list - del(src) //delete the datum to stop it processing + qdel(src) //delete the datum to stop it processing return // Returns the advance disease with a different reference memory. diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm index 631c93b26c..59d1dbe160 100644 --- a/code/datums/diseases/alien_embryo.dm +++ b/code/datums/diseases/alien_embryo.dm @@ -113,7 +113,7 @@ Des: Removes all infection images from aliens and places an infection image on a if (alien.client) for(var/image/I in alien.client.images) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) + qdel(I) for (var/mob/living/carbon/alien/alien in player_list) if (alien.client) @@ -149,5 +149,5 @@ Des: Removes the alien infection image from all aliens in the world located in p for(var/image/I in alien.client.images) if(I.loc == C) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) + qdel(I) return diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index a4d85a5640..6d520fe294 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -34,7 +34,7 @@ if(4) if(!src.transformed) if ((!strain_data["name"]) || (!strain_data["UI"]) || (!strain_data["SE"])) - del(affected_mob.virus) + qdel(affected_mob.virus) return //Save original dna for when the disease is cured. @@ -56,7 +56,7 @@ return -/datum/disease/dnaspread/Del() +/datum/disease/dnaspread/Destroy() if ((original_dna["name"]) && (original_dna["UI"]) && (original_dna["SE"])) var/list/newUI=original_dna["UI"] var/list/newSE=original_dna["SE"] diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 7c2fabbc9b..0bda144e8a 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -12,7 +12,7 @@ holder = atom if(!holder) //don't want this without a holder spawn - del src + qdel(src) set_desc(steps.len) return @@ -61,7 +61,7 @@ if(result) new result(get_turf(holder)) spawn() - del holder + qdel(holder) return proc/set_desc(index as num) diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index 0020859f1d..4f4d680e9e 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -151,4 +151,8 @@ Data storage vars: start() return active() - +/datum/global_iterator/Destroy() + tag = null + arg_list.Cut() + stop() + //Do not call ..() diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 00899f47cb..1f6c2abd74 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -49,7 +49,7 @@ //must succeed in most cases proc/setTeleatom(atom/movable/ateleatom) if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon)) - del(ateleatom) + qdel(ateleatom) return 0 if(istype(ateleatom)) teleatom = ateleatom diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f6fbbc110c..cfbd155145 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -311,7 +311,7 @@ datum/mind for(var/obj/item/weapon/implant/loyalty/I in H.contents) for(var/obj/item/organ/external/organs in H.organs) if(I in organs.implants) - I.Del() + qdel(I) break H << "Your loyalty implant has been deactivated." log_admin("[key_name_admin(usr)] has de-loyalty implanted [current].") @@ -368,7 +368,7 @@ datum/mind src = null m2h.inject(M) src = mobfinder.loc:mind - del(mobfinder) + qdel(mobfinder) current.radiation -= 50 */ else if (href_list["silicon"]) @@ -445,10 +445,10 @@ datum/mind var/list/L = current.get_contents() for (var/t in L) if (istype(t, /obj/item/device/pda)) - if (t:uplink) del(t:uplink) + if (t:uplink) qdel(t:uplink) t:uplink = null else if (istype(t, /obj/item/device/radio)) - if (t:traitorradio) del(t:traitorradio) + if (t:traitorradio) qdel(t:traitorradio) t:traitorradio = null t:traitor_frequency = 0.0 else if (istype(t, /obj/item/weapon/SWF_uplink) || istype(t, /obj/item/weapon/syndicate_uplink)) @@ -457,7 +457,7 @@ datum/mind R.loc = current.loc R.traitorradio = null R.traitor_frequency = 0.0 - del(t) + qdel(t) // remove wizards spells //If there are more special powers that need removal, they can be procced into here./N @@ -479,7 +479,7 @@ datum/mind proc/take_uplink() var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() if(H) - del(H) + qdel(H) // check whether this mind's mob has been brigged for the given duration diff --git a/code/datums/modules.dm b/code/datums/modules.dm index 896d920f99..43d25a2e25 100644 --- a/code/datums/modules.dm +++ b/code/datums/modules.dm @@ -24,7 +24,8 @@ var/list/modules = list( // global associative list var/mneed = mods.inmodlist(type) // find if this type has modules defined if(!mneed) // not found in module list? - del(src) // delete self, thus ending proc + qdel(src) + return var/needed = mods.getbitmask(type) // get a bitmask for the number of modules in this object status = needed diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index d72a8798a7..0f10d8d56f 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -95,7 +95,7 @@ var/obj/result_obj = new result(container) for (var/obj/O in (container.contents-result_obj)) O.reagents.trans_to(result_obj, O.reagents.total_volume) - del(O) + qdel(O) container.reagents.clear_reagents() return result_obj @@ -110,7 +110,7 @@ O.reagents.del_reagent("nutriment") O.reagents.update_total() O.reagents.trans_to(result_obj, O.reagents.total_volume) - del(O) + qdel(O) container.reagents.clear_reagents() return result_obj diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 3cc3107784..c7495ab749 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -43,10 +43,10 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/food name = "Kitchen supply crate" - contains = list(/obj/item/weapon/reagent_containers/food/snacks/flour, - /obj/item/weapon/reagent_containers/food/snacks/flour, - /obj/item/weapon/reagent_containers/food/snacks/flour, - /obj/item/weapon/reagent_containers/food/snacks/flour, + contains = list(/obj/item/weapon/reagent_containers/food/condiment/flour, + /obj/item/weapon/reagent_containers/food/condiment/flour, + /obj/item/weapon/reagent_containers/food/condiment/flour, + /obj/item/weapon/reagent_containers/food/condiment/flour, /obj/item/weapon/reagent_containers/food/drinks/milk, /obj/item/weapon/reagent_containers/food/drinks/milk, /obj/item/weapon/storage/fancy/egg_box, @@ -1506,5 +1506,20 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/device/floor_painter, /obj/item/device/floor_painter) +/datum/supply_packs/bluespacerelay + name = "Emergency Bluespace Relay Assembly Kit" + cost = 75 + containername = "emergency bluespace relay assembly kit" + containertype = /obj/structure/closet/crate + group = "Engineering" + contains = list(/obj/item/weapon/circuitboard/bluespacerelay, + /obj/item/weapon/stock_parts/manipulator, + /obj/item/weapon/stock_parts/manipulator, + /obj/item/weapon/stock_parts/subspace/filter, + /obj/item/weapon/stock_parts/subspace/crystal, + /obj/item/weapon/storage/toolbox/electrical) + + + diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index bb81eabbc5..5b0ae96726 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -91,9 +91,11 @@ /obj/item/weapon/cane/concealed/New() ..() - concealed_blade = new/obj/item/weapon/butterfly/switchblade(src) + var/obj/item/weapon/butterfly/switchblade/temp_blade = new(src) + concealed_blade = temp_blade + temp_blade.attack_self() -/obj/item/weapon/cane/concealed/attack_self(mob/user) +/obj/item/weapon/cane/concealed/attack_self(var/mob/user) if(concealed_blade) user.visible_message("[user] has unsheathed \a [concealed_blade] from \his [src]!", "You unsheathe \the [concealed_blade] from \the [src].") // Calling drop/put in hands to properly call item drop/pickup procs @@ -101,8 +103,9 @@ user.drop_from_inventory(src) user.put_in_hands(concealed_blade) user.put_in_hands(src) + user.update_inv_l_hand(0) + user.update_inv_r_hand() concealed_blade = null - update_icon() else ..() @@ -347,7 +350,7 @@ /obj/item/weapon/module/power_control/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (istype(W, /obj/item/device/multitool)) var/obj/item/weapon/circuitboard/ghettosmes/newcircuit = new/obj/item/weapon/circuitboard/ghettosmes(user.loc) - del(src) + qdel(src) user.put_in_hands(newcircuit) diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index 2bfb8b9436..6c5f27fa07 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -1,13 +1,36 @@ -proc/log_and_message_admins(var/message as text) - log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]") - message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]") +proc/admin_notice(var/message, var/rights) + for(var/mob/M in mob_list) + if(check_rights(rights, 0, M)) + M << message + +proc/log_and_message_admins(var/message as text, var/mob/user = usr) + log_admin(user ? "[key_name(user)] [message]" : "EVENT [message]") + message_admins(user ? "[key_name(user)] [message]" : "EVENT [message]") + +proc/log_and_message_admins_many(var/list/mob/users, var/message) + if(!users || !users.len) + return + + var/list/user_keys = list() + for(var/mob/user in users) + user_keys += key_name(user) + + log_admin("[english_list(user_keys)] [message]") + message_admins("[english_list(user_keys)] [message]") proc/admin_log_and_message_admins(var/message as text) log_admin(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]") message_admins(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]", 1) proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message) - victim.attack_log += text("\[[time_stamp()]\] [victim_message] [key_name(attacker)]") - attacker.attack_log += text("\[[time_stamp()]\] [attacker_message] [key_name(victim)]") + victim.attack_log += text("\[[time_stamp()]\] [key_name(attacker)] - [victim_message]") + attacker.attack_log += text("\[[time_stamp()]\] [key_name(victim)] - [attacker_message]") msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [uppertext(attacker.a_intent)]) (JMP)") + +proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message) + if(!victims || !victims.len) + return + + for(var/mob/victim in victims) + admin_attack_log(attacker, victim, attacker_message, victim_message, admin_message) diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 9db7092928..0a64e89592 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -30,13 +30,14 @@ title = "Security Announcement" announcement_type = "Security Announcement" -/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast) +/datum/announcement/proc/Announce(var/message as text, var/new_title = "", var/new_sound = null, var/do_newscast = newscast, var/msg_sanitized = 0) if(!message) return var/message_title = new_title ? new_title : title var/message_sound = new_sound ? new_sound : sound - message = sanitize(message, extra = 0) + if(!msg_sanitized) + message = sanitize(message, extra = 0) message_title = sanitizeSafe(message_title) Message(message, message_title) diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm index 4e9fbcc9af..256ae51dbf 100644 --- a/code/defines/procs/records.dm +++ b/code/defines/procs/records.dm @@ -22,7 +22,7 @@ G.fields["photo_side"] = side data_core.general += G - del(dummy) + qdel(dummy) return G /proc/CreateSecurityRecord(var/name as text, var/id as text) diff --git a/code/defines/procs/sd_Alert.dm b/code/defines/procs/sd_Alert.dm index c63cab8f8b..e10416f112 100644 --- a/code/defines/procs/sd_Alert.dm +++ b/code/defines/procs/sd_Alert.dm @@ -1,168 +1,168 @@ -/* sd_Alert library - by Shadowdarke (shadowdarke@byond.com) - - sd_Alert() is a powerful and flexible alternative to the built in BYOND - alert() proc. sd_Alert offers timed popups, unlimited buttons, custom - appearance, and even the option to popup without stealing keyboard focus - from the map or command line. - - Please see demo.dm for detailed examples. - -FORMAT - sd_Alert(who, message, title, buttons, default, duration, unfocus, \ - size, table, style, tag, select, flags) - -ARGUMENTS - who - the client or mob to display the alert to. - message - text message to display - title - title of the alert box - buttons - list of buttons - Default Value: list("Ok") - default - default button selestion - Default Value: the first button in the list - duration - the number of ticks before this alert expires. If not - set, the alert lasts until a button is clicked. - Default Value: 0 (unlimited) - unfocus - if this value is set, the popup will not steal keyboard - focus from the map or command line. - Default Value: 1 (do not take focus) - size - size of the popup window in px - Default Value: "300x200" - table - optional parameters for the HTML table in the alert - Default Value: "width=100% height=100%" (fill the window) - style - optional style sheet information - tag - lets you specify a certain tag for this sd_Alert so you may manipulate it - externally. (i.e. force the alert to close, change options and redisplay, - reuse the same window, etc.) - select - if set, the buttons will be replaced with a selection box with a number of - lines displayed equal to this value. - Default value: 0 (use buttons) - flags - optional flags effecting the alert display. These flags may be ORed (|) - together for multiple effects. - SD_ALERT_SCROLL = display a scrollbar - SD_ALERT_SELECT_MULTI = forces selection box display (instead of - buttons) allows the user to select multiple - choices. - SD_ALERT_LINKS = display each choice as a plain text link. - Any selection box style overrides this flag. - SD_ALERT_NOVALIDATE = don't validate responses - Default value: SD_ALERT_SCROLL - (button display with scroll bar, validate responses) -RETURNS - The text of the selected button, or null if the alert duration expired - without a button click. - -Version 1 changes (from version 0): -* Added the tag, select, and flags arguments, thanks to several suggestions from Foomer. -* Split the sd_Alert/Alert() proc into New(), Display(), and Response() to allow more - customization by developers. Primarily developers would want to use Display() to change - the display of active tagged windows - -*/ - - -#define SD_ALERT_SCROLL 1 -#define SD_ALERT_SELECT_MULTI 2 -#define SD_ALERT_LINKS 4 -#define SD_ALERT_NOVALIDATE 8 - -proc/sd_Alert(client/who, message, title, buttons = list("Ok"),\ - default, duration = 0, unfocus = 1, size = "300x200", \ - table = "width=100% height=100%", style, tag, select, flags = SD_ALERT_SCROLL) - - if(ismob(who)) - var/mob/M = who - who = M.client - if(!istype(who)) CRASH("sd_Alert: Invalid target:[who] (\ref[who])") - - var/sd_alert/T = locate(tag) - if(T) - if(istype(T)) del(T) - else CRASH("sd_Alert: tag \"[tag]\" is already in use by datum '[T]' (type: [T.type])") - T = new(who, tag) - if(duration) - spawn(duration) - if(T) del(T) - return - T.Display(message,title,buttons,default,unfocus,size,table,style,select,flags) - . = T.Response() - -sd_alert - var - client/target - response - list/validation - - Del() - target << browse(null,"window=\ref[src]") - ..() - - New(who, tag) - ..() - target = who - src.tag = tag - - Topic(href,params[]) - if(usr.client != target) return - response = params["clk"] - - proc/Display(message,title,list/buttons,default,unfocus,size,table,style,select,flags) - if(unfocus) spawn() target << browse(null,null) - if(istext(buttons)) buttons = list(buttons) - if(!default) default = buttons[1] - if(!(flags & SD_ALERT_NOVALIDATE)) validation = buttons.Copy() - - var/html = {"[title][style]\ -
    [message]
    "} - - if(select || (flags & SD_ALERT_SELECT_MULTI)) // select style choices - html += {"
    \ - -
    " - else if(flags & SD_ALERT_LINKS) // text link style - for(var/b in buttons) - var/list/L = list() - L["clk"] = b - var/html_string=list2params(L) - var/focus - if(b == default) focus = " ID=fcs" - html += "[html_encode(b)]\ -
    " - else // button style choices - for(var/b in buttons) - var/list/L = list() - L["clk"] = b - var/html_string=list2params(L) - var/focus - if(b == default) focus = " ID=fcs" - html += " " - - html += "
    " - - target << browse(html,"window=\ref[src];size=[size];can_close=0") - - proc/Response() - var/validated - while(!validated) - while(target && !response) // wait for a response - sleep(2) - - if(response && validation) - if(istype(response, /list)) - var/list/L = response - validation - if(L.len) response = null - else validated = 1 - else if(response in validation) validated = 1 - else response=null - else validated = 1 - spawn(2) del(src) - return response +/* sd_Alert library + by Shadowdarke (shadowdarke@byond.com) + + sd_Alert() is a powerful and flexible alternative to the built in BYOND + alert() proc. sd_Alert offers timed popups, unlimited buttons, custom + appearance, and even the option to popup without stealing keyboard focus + from the map or command line. + + Please see demo.dm for detailed examples. + +FORMAT + sd_Alert(who, message, title, buttons, default, duration, unfocus, \ + size, table, style, tag, select, flags) + +ARGUMENTS + who - the client or mob to display the alert to. + message - text message to display + title - title of the alert box + buttons - list of buttons + Default Value: list("Ok") + default - default button selestion + Default Value: the first button in the list + duration - the number of ticks before this alert expires. If not + set, the alert lasts until a button is clicked. + Default Value: 0 (unlimited) + unfocus - if this value is set, the popup will not steal keyboard + focus from the map or command line. + Default Value: 1 (do not take focus) + size - size of the popup window in px + Default Value: "300x200" + table - optional parameters for the HTML table in the alert + Default Value: "width=100% height=100%" (fill the window) + style - optional style sheet information + tag - lets you specify a certain tag for this sd_Alert so you may manipulate it + externally. (i.e. force the alert to close, change options and redisplay, + reuse the same window, etc.) + select - if set, the buttons will be replaced with a selection box with a number of + lines displayed equal to this value. + Default value: 0 (use buttons) + flags - optional flags effecting the alert display. These flags may be ORed (|) + together for multiple effects. + SD_ALERT_SCROLL = display a scrollbar + SD_ALERT_SELECT_MULTI = forces selection box display (instead of + buttons) allows the user to select multiple + choices. + SD_ALERT_LINKS = display each choice as a plain text link. + Any selection box style overrides this flag. + SD_ALERT_NOVALIDATE = don't validate responses + Default value: SD_ALERT_SCROLL + (button display with scroll bar, validate responses) +RETURNS + The text of the selected button, or null if the alert duration expired + without a button click. + +Version 1 changes (from version 0): +* Added the tag, select, and flags arguments, thanks to several suggestions from Foomer. +* Split the sd_Alert/Alert() proc into New(), Display(), and Response() to allow more + customization by developers. Primarily developers would want to use Display() to change + the display of active tagged windows + +*/ + + +#define SD_ALERT_SCROLL 1 +#define SD_ALERT_SELECT_MULTI 2 +#define SD_ALERT_LINKS 4 +#define SD_ALERT_NOVALIDATE 8 + +proc/sd_Alert(client/who, message, title, buttons = list("Ok"),\ + default, duration = 0, unfocus = 1, size = "300x200", \ + table = "width=100% height=100%", style, tag, select, flags = SD_ALERT_SCROLL) + + if(ismob(who)) + var/mob/M = who + who = M.client + if(!istype(who)) CRASH("sd_Alert: Invalid target:[who] (\ref[who])") + + var/sd_alert/T = locate(tag) + if(T) + if(istype(T)) qdel(T) + else CRASH("sd_Alert: tag \"[tag]\" is already in use by datum '[T]' (type: [T.type])") + T = new(who, tag) + if(duration) + spawn(duration) + if(T) qdel(T) + return + T.Display(message,title,buttons,default,unfocus,size,table,style,select,flags) + . = T.Response() + +sd_alert + var + client/target + response + list/validation + + Destroy() + target << browse(null,"window=\ref[src]") + ..() + + New(who, tag) + ..() + target = who + src.tag = tag + + Topic(href,params[]) + if(usr.client != target) return + response = params["clk"] + + proc/Display(message,title,list/buttons,default,unfocus,size,table,style,select,flags) + if(unfocus) spawn() target << browse(null,null) + if(istext(buttons)) buttons = list(buttons) + if(!default) default = buttons[1] + if(!(flags & SD_ALERT_NOVALIDATE)) validation = buttons.Copy() + + var/html = {"[title][style]\ +
    [message]
    "} + + if(select || (flags & SD_ALERT_SELECT_MULTI)) // select style choices + html += {"
    \ + +
    " + else if(flags & SD_ALERT_LINKS) // text link style + for(var/b in buttons) + var/list/L = list() + L["clk"] = b + var/html_string=list2params(L) + var/focus + if(b == default) focus = " ID=fcs" + html += "[html_encode(b)]\ +
    " + else // button style choices + for(var/b in buttons) + var/list/L = list() + L["clk"] = b + var/html_string=list2params(L) + var/focus + if(b == default) focus = " ID=fcs" + html += " " + + html += "
    " + + target << browse(html,"window=\ref[src];size=[size];can_close=0") + + proc/Response() + var/validated + while(!validated) + while(target && !response) // wait for a response + sleep(2) + + if(response && validation) + if(istype(response, /list)) + var/list/L = response - validation + if(L.len) response = null + else validated = 1 + else if(response in validation) validated = 1 + else response=null + else validated = 1 + spawn(2) qdel(src) + return response diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index 73e17a2043..aad02b1c6c 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -199,7 +199,7 @@ for(var/datum/uplink_item/UI in H.purchase_log) var/obj/I = new UI.path refined_log.Add("[H.purchase_log[UI]]x\icon[I][UI.name]") - del(I) + qdel(I) purchases = english_list(refined_log, nothing_text = "") if(uplink_true) text += " (used [TC_uses] TC)" @@ -215,7 +215,7 @@ if(antag.current && antag.current.client) for(var/image/I in antag.current.client.images) if(I.icon_state == antag_indicator) - del(I) + qdel(I) for(var/datum/mind/other_antag in current_antagonists) if(other_antag.current) antag.current.client.images |= image('icons/mob/mob.dmi', loc = other_antag.current, icon_state = antag_indicator) @@ -241,10 +241,10 @@ if(antag.current.client) for(var/image/I in antag.current.client.images) if(I.icon_state == antag_indicator && I.loc == player.current) - del(I) + qdel(I) if(player.current && player.current.client) for(var/image/I in player.current.client.images) if(I.icon_state == antag_indicator) - del(I) + qdel(I) diff --git a/code/game/antagonist/antagonist_build.dm b/code/game/antagonist/antagonist_build.dm index 34631d36fb..35af4e6f80 100644 --- a/code/game/antagonist/antagonist_build.dm +++ b/code/game/antagonist/antagonist_build.dm @@ -15,7 +15,7 @@ var/mob/holder = player.current player.current = new mob_path(get_turf(player.current)) player.transfer_to(player.current) - if(holder) del(holder) + if(holder) qdel(holder) player.original = player.current return player.current @@ -30,11 +30,11 @@ for(var/obj/item/thing in player.contents) player.drop_from_inventory(thing) if(thing.loc != player) - del(thing) + qdel(thing) return 1 if(flags & ANTAG_SET_APPEARANCE) - player.change_appearance(APPEARANCE_ALL, player, player, valid_species) + player.change_appearance(APPEARANCE_ALL, player.loc, player, valid_species, state = z_state) /datum/antagonist/proc/unequip(var/mob/living/carbon/human/player) if(!istype(player)) diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index 92090515b1..a7949011fc 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -30,8 +30,8 @@ var/datum/antagonist/raider/raiders var/list/raider_glasses = list( /obj/item/clothing/glasses/thermal, - /obj/item/clothing/glasses/thermal/eyepatch, - /obj/item/clothing/glasses/thermal/monocle + /obj/item/clothing/glasses/thermal/plain/eyepatch, + /obj/item/clothing/glasses/thermal/plain/monocle ) var/list/raider_helmets = list( diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 7b410cc7bc..2923008a7b 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -95,21 +95,31 @@ var/datum/antagonist/wizard/wizards //To batch-remove wizard spells. Linked to mind.dm. /mob/proc/spellremove(var/mob/M as mob) - for(var/obj/effect/proc_holder/spell/spell_to_remove in src.spell_list) - del(spell_to_remove) + for(var/spell/spell_to_remove in src.spell_list) + remove_spell(spell_to_remove) -/*Checks if the wizard can cast spells. +obj/item/clothing + var/wizard_garb = 0 + +// Does this clothing slot count as wizard garb? (Combines a few checks) +/proc/is_wiz_garb(var/obj/item/clothing/C) + return C && C.wizard_garb + +/*Checks if the wizard is wearing the proper attire. Made a proc so this is not repeated 14 (or more) times.*/ -/mob/proc/casting() -//Removed the stat check because not all spells require clothing now. - if(!istype(usr:wear_suit, /obj/item/clothing/suit/wizrobe)) - usr << "I don't feel strong enough without my robe." +/mob/proc/wearing_wiz_garb() + src << "Silly creature, you're not a human. Only humans can cast this spell." + return 0 + +// Humans can wear clothes. +/mob/living/carbon/human/wearing_wiz_garb() + if(!is_wiz_garb(src.wear_suit)) + src << "I don't feel strong enough without my robe." return 0 - if(!istype(usr:shoes, /obj/item/clothing/shoes/sandal)) - usr << "I don't feel strong enough without my sandals." + if(!is_wiz_garb(src.shoes)) + src << "I don't feel strong enough without my sandals." return 0 - if(!istype(usr:head, /obj/item/clothing/head/wizard)) - usr << "I don't feel strong enough without my hat." + if(!is_wiz_garb(src.head)) + src << "I don't feel strong enough without my hat." return 0 - else - return 1 + return 1 diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 3968418e02..3f5d65d21d 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -24,11 +24,13 @@ var/datum/antagonist/cultist/cult flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE max_antags = 200 // No upper limit. max_antags_round = 200 + var/allow_narsie = 1 var/datum/mind/sacrifice_target var/list/startwords = list("blood","join","self","hell") var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide") var/list/sacrificed = list() + var/list/harvested = list() /datum/antagonist/cultist/New() ..() diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm index 0af6e1e23d..9b82b15852 100644 --- a/code/game/antagonist/station/highlander.dm +++ b/code/game/antagonist/station/highlander.dm @@ -32,7 +32,7 @@ var/datum/antagonist/highlander/highlanders for (var/obj/item/I in player) if (istype(I, /obj/item/weapon/implant)) continue - del(I) + qdel(I) player.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(player), slot_w_uniform) player.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(player), slot_l_ear) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index c382ce4d07..6dcf4f93ef 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -55,8 +55,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area var/air_doors_activated = 0 var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') - var/sound/forced_ambience = null - + var/list/forced_ambience = null + var/sound_env = 2 //reverb preset for sounds played in this area, see sound datum reference for more /*Adding a wizard area teleport list because motherfucking lag -- Urist*/ /*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ var/list/teleportlocs = list() @@ -808,6 +808,9 @@ area/space/atmosalert() //Hallway +/area/hallway/primary/ + sound_env = 12 //hallway + /area/hallway/primary/fore name = "\improper Fore Primary Hallway" icon_state = "hallF" @@ -873,27 +876,27 @@ area/space/atmosalert() music = null /area/crew_quarters/captain - name = "\improper Captain's Office" + name = "\improper Command - Captain's Office" icon_state = "captain" /area/crew_quarters/heads/hop - name = "\improper Head of Personnel's Office" + name = "\improper Command - HoP's Office" icon_state = "head_quarters" /area/crew_quarters/heads/hor - name = "\improper Research Director's Office" + name = "\improper Research - RD's Office" icon_state = "head_quarters" /area/crew_quarters/heads/chief - name = "\improper Chief Engineer's Office" + name = "\improper Engineering - CE's Office" icon_state = "head_quarters" /area/crew_quarters/heads/hos - name = "\improper Head of Security's Office" + name = "\improper Security - HoS' Office" icon_state = "head_quarters" /area/crew_quarters/heads/cmo - name = "\improper Chief Medical Officer's Office" + name = "\improper Medbay - CMO's Office" icon_state = "head_quarters" /area/crew_quarters/courtroom @@ -1012,10 +1015,8 @@ area/space/atmosalert() /area/holodeck/alphadeck name = "\improper Holodeck Alpha" - /area/holodeck/source_plating name = "\improper Holodeck - Off" - icon_state = "Holodeck" /area/holodeck/source_emptycourt name = "\improper Holodeck - Empty Court" @@ -1031,11 +1032,9 @@ area/space/atmosalert() /area/holodeck/source_courtroom name = "\improper Holodeck - Courtroom" - icon_state = "Holodeck" /area/holodeck/source_beach name = "\improper Holodeck - Beach" - icon_state = "Holodeck" // Lazy. /area/holodeck/source_burntest name = "\improper Holodeck - Atmospheric Burn Test" @@ -1062,9 +1061,6 @@ area/space/atmosalert() name = "\improper Holodeck - Space" has_gravity = 0 - - - //Engineering /area/engineering/ @@ -1085,7 +1081,7 @@ area/space/atmosalert() icon_state = "atmos_storage" /area/engineering/drone_fabrication - name = "\improper Drone Fabrication" + name = "\improper Engineering Drone Fabrication" icon_state = "drone_fab" /area/engineering/engine_smes @@ -1171,23 +1167,23 @@ area/space/atmosalert() icon_state = "panelsP" /area/maintenance/auxsolarport - name = "Fore Port Solar Maintenance" + name = "Solar Maintenance - Fore Port" icon_state = "SolarcontrolP" /area/maintenance/starboardsolar - name = "Aft Starboard Solar Maintenance" + name = "Solar Maintenance - Aft Starboard" icon_state = "SolarcontrolS" /area/maintenance/portsolar - name = "Aft Port Solar Maintenance" + name = "Solar Maintenance - Aft Port" icon_state = "SolarcontrolP" /area/maintenance/auxsolarstarboard - name = "Fore Starboard Solar Maintenance" + name = "Solar Maintenance - Fore Starboard" icon_state = "SolarcontrolS" /area/maintenance/foresolar - name = "Fore Solar Maintenance" + name = "Solar Maintenance - Fore" icon_state = "SolarcontrolA" /area/assembly/chargebay @@ -1362,35 +1358,35 @@ area/space/atmosalert() icon_state = "security" /area/security/lobby - name = "\improper Security lobby" + name = "\improper Security Lobby" icon_state = "security" /area/security/brig - name = "\improper Brig" + name = "\improper Security - Brig" icon_state = "brig" /area/security/prison - name = "\improper Prison Wing" + name = "\improper Security - Prison Wing" icon_state = "sec_prison" /area/security/warden - name = "\improper Warden" + name = "\improper Security - Warden's Office" icon_state = "Warden" /area/security/armoury - name = "\improper Armory" + name = "\improper Security - Armory" icon_state = "Warden" /area/security/detectives_office - name = "\improper Detective's Office" + name = "\improper Security - Forensic Office" icon_state = "detective" /area/security/range - name = "\improper Firing Range" + name = "\improper Security - Firing Range" icon_state = "firingrange" /area/security/tactical - name = "\improper Tactical Equipment" + name = "\improper Security - Tactical Equipment" icon_state = "Tactical" @@ -1420,7 +1416,7 @@ area/space/atmosalert() icon_state = "checkpoint1" /area/security/checkpoint2 - name = "\improper Security Checkpoint" + name = "\improper Security - Arrival Checkpoint" icon_state = "security" /area/security/checkpoint/supply @@ -1451,14 +1447,6 @@ area/space/atmosalert() name = "\improper Quartermasters" icon_state = "quart" -///////////WORK IN PROGRESS////////// - -/area/quartermaster/sorting - name = "\improper Delivery Office" - icon_state = "quartstorage" - -////////////WORK IN PROGRESS////////// - /area/quartermaster/office name = "\improper Cargo Office" icon_state = "quartoffice" @@ -1468,21 +1456,13 @@ area/space/atmosalert() icon_state = "quartstorage" /area/quartermaster/qm - name = "\improper Quartermaster's Office" + name = "\improper Cargo - Quartermaster's Office" icon_state = "quart" /area/quartermaster/miningdock - name = "\improper Mining Dock" + name = "\improper Cargo Mining Dock" icon_state = "mining" -/area/quartermaster/miningstorage - name = "\improper Mining Storage" - icon_state = "green" - -/area/quartermaster/mechbay - name = "\improper Mech Bay" - icon_state = "yellow" - /area/janitor/ name = "\improper Custodial Closet" icon_state = "janitor" @@ -1770,7 +1750,7 @@ area/space/atmosalert() //Construction /area/construction - name = "\improper Construction Area" + name = "\improper Engineering Construction Area" icon_state = "yellow" /area/construction/supplyshuttle @@ -2041,6 +2021,7 @@ area/space/atmosalert() luminosity = 1 lighting_use_dynamic = 0 requires_power = 0 + ambience = list() var/sound/mysound = null New() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 0778f50174..c66859f5d1 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -262,13 +262,15 @@ var/list/mob/living/forced_ambiance_list = new L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2) if(forced_ambience) - forced_ambiance_list += L - L << forced_ambience + if(forced_ambience.len) + forced_ambiance_list |= L + L << sound(pick(forced_ambience), repeat = 1, wait = 0, volume = 25, channel = 1) + else + L << sound(null, channel = 1) else if(src.ambience.len && prob(35)) if((world.time >= L.client.played + 600)) - var/musVolume = 25 var/sound = pick(ambience) - L << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1) + L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = 1) L.client.played = world.time /area/proc/gravitychange(var/gravitystate = 0, var/area/A) diff --git a/code/game/area/asteroid_areas.dm b/code/game/area/asteroid_areas.dm index edfb99f57f..12ae5377ce 100644 --- a/code/game/area/asteroid_areas.dm +++ b/code/game/area/asteroid_areas.dm @@ -3,6 +3,7 @@ /area/mine icon_state = "mining" music = 'sound/ambience/song_game.ogg' + sound_env = 5 //stoneroom /area/mine/explored name = "Mine" diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index e5b421e9af..8aa6b1cd64 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -32,7 +32,7 @@ proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor , va var/cur_loc = locate(start_loc.x+x,start_loc.y+y,start_loc.z) if(clean) for(var/O in cur_loc) - del(O) + qdel(O) var/area/asteroid/artifactroom/A = new if(name) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 960a75d4fb..152622f88e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -22,6 +22,18 @@ //Detective Work, used for the duplicate data points kept in the scanners var/list/original_atom +/atom/Destroy() + . = ..() + density = 0 + SetOpacity(0) + + if(reagents) + qdel(reagents) + reagents = null + for(var/atom/movable/AM in contents) + qdel(AM) + invisibility = 101 + /atom/proc/assume_air(datum/gas_mixture/giver) return null @@ -66,7 +78,6 @@ return flags & INSERT_CONTAINER */ - /atom/proc/meteorhit(obj/meteor as obj) return @@ -148,7 +159,7 @@ its easier to just keep the beam vertical. for(var/obj/effect/overlay/beam/O in orange(10,src)) //This section erases the previously drawn beam because I found it was easier to if(O.BeamSource==src) //just draw another instance of the beam instead of trying to manipulate all the - del O //pieces to a new orientation. + qdel(O) //pieces to a new orientation. var/Angle=round(Get_Angle(src,BeamTarget)) var/icon/I=new(icon,icon_state) I.Turn(Angle) @@ -189,7 +200,7 @@ its easier to just keep the beam vertical. X.pixel_y=Pixel_y sleep(3) //Changing this to a lower value will cause the beam to follow more smoothly with movement, but it will also be more laggy. //I've found that 3 ticks provided a nice balance for my use. - for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) del O + for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) qdel(O) //All atoms @@ -230,6 +241,9 @@ its easier to just keep the beam vertical. /atom/proc/fire_act() return +/atom/proc/melt() + return + /atom/proc/hitby(atom/movable/AM as mob|obj) if (density) AM.throwing = 0 @@ -359,7 +373,7 @@ its easier to just keep the beam vertical. //Cleaning up shit. if(fingerprints && !fingerprints.len) - del(fingerprints) + qdel(fingerprints) return @@ -416,7 +430,7 @@ its easier to just keep the beam vertical. src.color = initial(src.color) //paint src.germ_level = 0 if(istype(blood_DNA, /list)) - del(blood_DNA) + qdel(blood_DNA) return 1 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 79d6e8fd08..b8b8bbb9f6 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -14,6 +14,34 @@ var/moved_recently = 0 var/mob/pulledby = null +/atom/movable/New() + ..() + if(ticker && ticker.current_state == GAME_STATE_PLAYING) + initialize() + +/atom/movable/Del() + if(isnull(gcDestroyed) && loc) + testing("GC: -- [type] was deleted via del() rather than qdel() --") + CRASH() // Debug until I can get a clean server start. +// else if(isnull(gcDestroyed)) +// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel() +// else +// testing("GC: [type] was deleted via GC with qdel()") + ..() + +/atom/movable/Destroy() + if(opacity) + if(isturf(loc)) + if(loc:lighting_lumcount > 1) + UpdateAffectingLights() + loc = null + + ..() + + +/atom/movable/proc/initialize() + return + /atom/movable/Bump(var/atom/A, yes) if(src.throwing) src.throw_impact(A) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index e1fda4965c..ce6320cd88 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -166,6 +166,7 @@ H.f_style = facial_hair_styles_list[beard] H.force_update_limbs() + H.update_eyes() H.update_hair() return 1 diff --git a/code/game/dna/dna_misc.dm b/code/game/dna/dna_misc.dm index 1362aa6888..cdc737c007 100644 --- a/code/game/dna/dna_misc.dm +++ b/code/game/dna/dna_misc.dm @@ -235,9 +235,9 @@ H.r_eyes = hex2num(getblock(structure,8,3)) H.g_eyes = hex2num(getblock(structure,9,3)) H.b_eyes = hex2num(getblock(structure,10,3)) + if(H.internal_organs_by_name["eyes"]) - var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"] - eyes.eye_colour = list(H.r_eyes,H.g_eyes,H.b_eyes) + H.update_eyes() if (isblockon(getblock(structure, 11,3),11 , 1)) H.gender = FEMALE @@ -420,7 +420,7 @@ animation.master = src flick("h2monkey", animation) sleep(48) - del(animation) + qdel(animation) var/mob/living/carbon/monkey/O = null @@ -447,7 +447,7 @@ for(var/obj/T in (M.contents-implants)) - del(T) + qdel(T) O.loc = M.loc @@ -469,7 +469,7 @@ I.loc = O I.implanted = O // O.update_icon = 1 //queue a full icon update at next life() call - del(M) + qdel(M) return if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human)) @@ -493,7 +493,7 @@ animation.master = src flick("monkey2h", animation) sleep(48) - del(animation) + qdel(animation) var/mob/living/carbon/human/O = new( src ) if(Mo.greaterform) @@ -519,7 +519,7 @@ M.viruses -= D //for(var/obj/T in M) - // del(T) + // qdel(T) O.loc = M.loc @@ -553,7 +553,7 @@ I.loc = O I.implanted = O // O.update_icon = 1 //queue a full icon update at next life() call - del(M) + qdel(M) return //////////////////////////////////////////////////////////// Monkey Block if(M) diff --git a/code/game/dna/dna_misc.dm.orig b/code/game/dna/dna_misc.dm.orig deleted file mode 100644 index 00810f50e1..0000000000 --- a/code/game/dna/dna_misc.dm.orig +++ /dev/null @@ -1,1123 +0,0 @@ -<<<<<<< HEAD -/////////////////////////// DNA HELPER-PROCS -/proc/getleftblocks(input,blocknumber,blocksize) - var/string - - if (blocknumber > 1) - string = copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) - return string - else - return null - -/proc/getrightblocks(input,blocknumber,blocksize) - var/string - if (blocknumber < (length(input)/blocksize)) - string = copytext(input,blocksize*blocknumber+1,length(input)+1) - return string - else - return null - -/proc/getblockstring(input,block,subblock,blocksize,src,ui) // src is probably used here just for urls; ui is 1 when requesting for the unique identifier screen, 0 for structural enzymes screen - var/string - var/subpos = 1 // keeps track of the current sub block - var/blockpos = 1 // keeps track of the current block - - - for(var/i = 1, i <= length(input), i++) // loop through each letter - - var/pushstring - - if(subpos == subblock && blockpos == block) // if the current block/subblock is selected, mark it - pushstring = "[copytext(input, i, i+1)]" - else - if(ui) //This is for allowing block clicks to be differentiated - pushstring = "[copytext(input, i, i+1)]" - else - pushstring = "[copytext(input, i, i+1)]" - - string += pushstring // push the string to the return string - - if(subpos >= blocksize) // add a line break for every block - string += " | " - subpos = 0 - blockpos++ - - subpos++ - - return string - - -/proc/getblock(input,blocknumber,blocksize) - var/result - result = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - return result - -/proc/getblockbuffer(input,blocknumber,blocksize) - var/result[3] - var/block = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - for(var/i = 1, i <= 3, i++) - result[i] = copytext(block, i, i+1) - return result - -/proc/setblock(istring, blocknumber, replacement, blocksize) - if(!blocknumber) - return istring - if(!istring || !replacement || !blocksize) return 0 - var/result = getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) - return result - -/proc/add_zero2(t, u) - var/temp1 - while (length(t) < u) - t = "0[t]" - temp1 = t - if (length(t) > u) - temp1 = copytext(t,2,u+1) - return temp1 - -/proc/miniscramble(input,rs,rd) - var/output - output = null - if (input == "C" || input == "D" || input == "E" || input == "F") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"6",prob((rs*10));"7",prob((rs*5)+(rd));"0",prob((rs*5)+(rd));"1",prob((rs*10)-(rd));"2",prob((rs*10)-(rd));"3") - if (input == "8" || input == "9" || input == "A" || input == "B") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "4" || input == "5" || input == "6" || input == "7") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "0" || input == "1" || input == "2" || input == "3") - output = pick(prob((rs*10));"8",prob((rs*10));"9",prob((rs*10));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C",prob((rs*10)-(rd));"D",prob((rs*5)+(rd));"E",prob((rs*5)+(rd));"F") - if (!output) output = "5" - return output - -//Instead of picking a value far from the input, this will pick values closer to it. -//Sorry for the block of code, but it's more efficient then calling text2hex -> loop -> hex2text -/proc/miniscrambletarget(input,rs,rd) - var/output = null - switch(input) - if("0") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10));"2",prob((rs*10)-(rd));"3") - if("1") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10));"3",prob((rs*10)-(rd));"4") - if("2") - output = pick(prob((rs*10));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10));"4",prob((rs*10)-(rd));"5") - if("3") - output = pick(prob((rs*10)-(rd));"0",prob((rs*10));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10));"5",prob((rs*10)-(rd));"6") - if("4") - output = pick(prob((rs*10)-(rd));"1",prob((rs*10));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10));"6",prob((rs*10)-(rd));"7") - if("5") - output = pick(prob((rs*10)-(rd));"2",prob((rs*10));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10));"7",prob((rs*10)-(rd));"8") - if("6") - output = pick(prob((rs*10)-(rd));"3",prob((rs*10));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10));"8",prob((rs*10)-(rd));"9") - if("7") - output = pick(prob((rs*10)-(rd));"4",prob((rs*10));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10));"9",prob((rs*10)-(rd));"A") - if("8") - output = pick(prob((rs*10)-(rd));"5",prob((rs*10));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10));"A",prob((rs*10)-(rd));"B") - if("9") - output = pick(prob((rs*10)-(rd));"6",prob((rs*10));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C") - if("10")//A - output = pick(prob((rs*10)-(rd));"7",prob((rs*10));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10));"C",prob((rs*10)-(rd));"D") - if("11")//B - output = pick(prob((rs*10)-(rd));"8",prob((rs*10));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10));"D",prob((rs*10)-(rd));"E") - if("12")//C - output = pick(prob((rs*10)-(rd));"9",prob((rs*10));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10));"E",prob((rs*10)-(rd));"F") - if("13")//D - output = pick(prob((rs*10)-(rd));"A",prob((rs*10));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10));"F") - if("14")//E - output = pick(prob((rs*10)-(rd));"B",prob((rs*10));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - if("15")//F - output = pick(prob((rs*10)-(rd));"C",prob((rs*10));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - - if(!input || !output) //How did this happen? - output = "8" - - return output - -/proc/isblockon(hnumber, bnumber , var/UI = 0) - - var/temp2 - temp2 = hex2num(hnumber) - - if(UI) - if(temp2 >= 2050) - return 1 - else - return 0 - - if (bnumber == HULKBLOCK || bnumber == TELEBLOCK || bnumber == NOBREATHBLOCK || bnumber == NOPRINTSBLOCK || bnumber == SMALLSIZEBLOCK || bnumber == SHOCKIMMUNITYBLOCK) - if (temp2 >= 3500 + BLOCKADD) - return 1 - else - return 0 - if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK || bnumber == REMOTEVIEWBLOCK || bnumber == REGENERATEBLOCK || bnumber == INCREASERUNBLOCK || bnumber == REMOTETALKBLOCK || bnumber == MORPHBLOCK) - if (temp2 >= 3050 + BLOCKADD) - return 1 - else - return 0 - - - if (temp2 >= 2050 + BLOCKADD) - return 1 - else - return 0 - -/proc/ismuton(var/block,var/mob/M) - return isblockon(getblock(M.dna.struc_enzymes, block,3),block) - -/proc/randmutb(mob/M as mob) - if(!M) return - var/num - var/newdna - num = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) - M.dna.struc_enzymes = newdna - return - -/proc/randmutg(mob/M as mob) - if(!M) return - var/num - var/newdna - num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) - M.dna.struc_enzymes = newdna - return - -/proc/scramble(var/type, mob/M as mob, var/p) - if(!M) return - M.dna.check_integrity() - if(type) - for(var/i = 1, i <= STRUCDNASIZE-1, i++) - if(prob(p)) - M.dna.uni_identity = setblock(M.dna.uni_identity, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - updateappearance(M, M.dna.uni_identity) - - else - for(var/i = 1, i <= STRUCDNASIZE-1, i++) - if(prob(p)) - M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - domutcheck(M, null) - return - -/proc/randmuti(mob/M as mob) - if(!M) return - var/num - var/newdna - num = rand(1,UNIDNASIZE) - M.dna.check_integrity() - newdna = setblock(M.dna.uni_identity,num,add_zero2(num2hex(rand(1,4095),1),3),3) - M.dna.uni_identity = newdna - return - -/proc/toggledblock(hnumber) //unused - var/temp3 - var/chtemp - temp3 = hex2num(hnumber) - if (temp3 < 2050) - chtemp = rand(2050,4095) - return add_zero2(num2hex(chtemp,1),3) - else - chtemp = rand(1,2049) - return add_zero2(num2hex(chtemp,1),3) -/////////////////////////// DNA HELPER-PROCS - -/////////////////////////// DNA MISC-PROCS -/proc/updateappearance(mob/M as mob , structure) - if(istype(M, /mob/living/carbon/human)) - M.dna.check_integrity() - var/mob/living/carbon/human/H = M - H.r_hair = hex2num(getblock(structure,1,3)) - H.b_hair = hex2num(getblock(structure,2,3)) - H.g_hair = hex2num(getblock(structure,3,3)) - H.r_facial = hex2num(getblock(structure,4,3)) - H.b_facial = hex2num(getblock(structure,5,3)) - H.g_facial = hex2num(getblock(structure,6,3)) - H.s_tone = round(((hex2num(getblock(structure,7,3)) / 16) - 220)) - H.r_eyes = hex2num(getblock(structure,8,3)) - H.g_eyes = hex2num(getblock(structure,9,3)) - H.b_eyes = hex2num(getblock(structure,10,3)) - - if (isblockon(getblock(structure, 11,3),11 , 1)) - H.gender = FEMALE - else - H.gender = MALE - - //Hair - var/hairnum = hex2num(getblock(structure,13,3)) - var/index = round(1 +(hairnum / 4096)*hair_styles_list.len) - if((0 < index) && (index <= hair_styles_list.len)) - H.h_style = hair_styles_list[index] - - //Facial Hair - var/beardnum = hex2num(getblock(structure,12,3)) - index = round(1 +(beardnum / 4096)*facial_hair_styles_list.len) - if((0 < index) && (index <= facial_hair_styles_list.len)) - H.f_style = facial_hair_styles_list[index] - - H.update_body(0) - H.update_hair() - - return 1 - else - return 0 - -/proc/probinj(var/pr, var/inj) - return prob(pr+inj*pr) - -/proc/domutcheck(mob/living/M as mob, connected, inj) - if (!M) return - - M.dna.check_integrity() - - M.disabilities = 0 - M.sdisabilities = 0 - var/old_mutations = M.mutations - M.mutations = list() - -// M.see_in_dark = 2 -// M.see_invisible = 0 - - if(PLANT in old_mutations) - M.mutations.Add(PLANT) - if(SKELETON in old_mutations) - M.mutations.Add(SKELETON) - if(FAT in old_mutations) - M.mutations.Add(FAT) - if(HUSK in old_mutations) - M.mutations.Add(HUSK) - - if(ismuton(NOBREATHBLOCK,M)) - if(probinj(45,inj) || (mNobreath in old_mutations)) - M << "\blue You feel no need to breathe." - M.mutations.Add(mNobreath) - if(ismuton(REMOTEVIEWBLOCK,M)) - if(probinj(45,inj) || (mRemote in old_mutations)) - M << "\blue Your mind expands" - M.mutations.Add(mRemote) - if(ismuton(REGENERATEBLOCK,M)) - if(probinj(45,inj) || (mRegen in old_mutations)) - M << "\blue You feel strange" - M.mutations.Add(mRegen) - if(ismuton(INCREASERUNBLOCK,M)) - if(probinj(45,inj) || (mRun in old_mutations)) - M << "\blue You feel quick" - M.mutations.Add(mRun) - if(ismuton(REMOTETALKBLOCK,M)) - if(probinj(45,inj) || (mRemotetalk in old_mutations)) - M << "\blue You expand your mind outwards" - M.mutations.Add(mRemotetalk) - if(ismuton(MORPHBLOCK,M)) - if(probinj(45,inj) || (mMorph in old_mutations)) - M.mutations.Add(mMorph) - M << "\blue Your skin feels strange" - if(ismuton(BLENDBLOCK,M)) - if(probinj(45,inj) || (mBlend in old_mutations)) - M.mutations.Add(mBlend) - M << "\blue You feel alone" - if(ismuton(HALLUCINATIONBLOCK,M)) - if(probinj(45,inj) || (mHallucination in old_mutations)) - M.mutations.Add(mHallucination) - M << "\blue Your mind says 'Hello'" - if(ismuton(NOPRINTSBLOCK,M)) - if(probinj(45,inj) || (mFingerprints in old_mutations)) - M.mutations.Add(mFingerprints) - M << "\blue Your fingers feel numb" - if(ismuton(SHOCKIMMUNITYBLOCK,M)) - if(probinj(45,inj) || (mShock in old_mutations)) - M.mutations.Add(mShock) - M << "\blue You feel strange" - if(ismuton(SMALLSIZEBLOCK,M)) - if(probinj(45,inj) || (mSmallsize in old_mutations)) - M << "\blue Your skin feels rubbery" - M.mutations.Add(mSmallsize) - - - - if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),HULKBLOCK)) - if(probinj(5,inj) || (HULK in old_mutations)) - M << "\blue Your muscles hurt." - M.mutations.Add(HULK) - if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK)) - M.disabilities |= EPILEPSY - M << "\red You get a headache." - if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK)) - M << "\red You feel strange." - if (prob(95)) - if(prob(50)) - randmutb(M) - else - randmuti(M) - else - randmutg(M) - if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK)) - M.disabilities |= COUGHING - M << "\red You start coughing." - if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK)) - M << "\red You feel lightheaded." - M.mutations.Add(CLUMSY) - if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK)) - M.disabilities |= TOURETTES - M << "\red You twitch." - if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK)) - if(probinj(30,inj) || (XRAY in old_mutations)) - M << "\blue The walls suddenly disappear." -// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) -// M.see_in_dark = 8 -// M.see_invisible = 2 - M.mutations.Add(XRAY) - if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK)) - M.disabilities |= NERVOUS - M << "\red You feel nervous." - if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK)) - if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations)) - M << "\blue Your body feels warm." - M.mutations.Add(COLD_RESISTANCE) - if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK)) - M.sdisabilities |= BLIND - M << "\red You can't seem to see anything." - if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK)) - if(probinj(15,inj) || (TK in old_mutations)) - M << "\blue You feel smarter." - M.mutations.Add(TK) - if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK)) - M.sdisabilities |= DEAF - M.ear_deaf = 1 - M << "\red Its kinda quiet.." - if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK)) - M.disabilities |= NEARSIGHTED - M << "Your eyes feel weird..." - - /* If you want the new mutations to work, UNCOMMENT THIS. - if(istype(M, /mob/living/carbon)) - for (var/datum/mutations/mut in global_mutations) - mut.check_mutation(M) - */ - -//////////////////////////////////////////////////////////// Monkey Block - if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human)) - // human > monkey - var/mob/living/carbon/human/H = M - H.monkeyizing = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null - - if(!connected) - for(var/obj/item/W in (H.contents-implants)) - if (W==H.w_uniform) // will be teared - continue - H.drop_from_inventory(W) - M.monkeyizing = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - del(animation) - - - var/mob/living/carbon/monkey/O = null - if(H.species.primitive) - O = new H.species.primitive(src) - else - H.gib() //Trying to change the species of a creature with no primitive var set is messy. - return - - if(M) - if (M.dna) - O.dna = M.dna - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - - for(var/obj/T in (M.contents-implants)) - del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the cute little monkey - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) - O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss() + 20) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - O.a_intent = I_HURT - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return - - if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human)) - // monkey > human, - var/mob/living/carbon/monkey/Mo = M - Mo.monkeyizing = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) - Mo.drop_from_inventory(W) - M.monkeyizing = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(48) - del(animation) - - var/mob/living/carbon/human/O = new( src ) - if(Mo.greaterform) - O.set_species(Mo.greaterform) - - if (isblockon(getblock(M.dna.uni_identity, 11,3),11)) - O.gender = FEMALE - else - O.gender = MALE - - if (M) - if (M.dna) - O.dna = M.dna - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - //for(var/obj/T in M) - // del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the human - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - - var/i - while (!i) - var/randomname - if (O.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) - continue - else - O.real_name = randomname - i++ - updateappearance(O,O.dna.uni_identity) - O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss()) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return -//////////////////////////////////////////////////////////// Monkey Block - if(M) - M.update_icon = 1 //queue a full icon update at next life() call - return null -======= -/////////////////////////// DNA HELPER-PROCS -/proc/getleftblocks(input,blocknumber,blocksize) - var/string - - if (blocknumber > 1) - string = copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) - return string - else - return null - -/proc/getrightblocks(input,blocknumber,blocksize) - var/string - if (blocknumber < (length(input)/blocksize)) - string = copytext(input,blocksize*blocknumber+1,length(input)+1) - return string - else - return null - -/proc/getblockstring(input,block,subblock,blocksize,src,ui) // src is probably used here just for urls; ui is 1 when requesting for the unique identifier screen, 0 for structural enzymes screen - var/string - var/subpos = 1 // keeps track of the current sub block - var/blockpos = 1 // keeps track of the current block - - - for(var/i = 1, i <= length(input), i++) // loop through each letter - - var/pushstring - - if(subpos == subblock && blockpos == block) // if the current block/subblock is selected, mark it - pushstring = "[copytext(input, i, i+1)]" - else - if(ui) //This is for allowing block clicks to be differentiated - pushstring = "[copytext(input, i, i+1)]" - else - pushstring = "[copytext(input, i, i+1)]" - - string += pushstring // push the string to the return string - - if(subpos >= blocksize) // add a line break for every block - string += " | " - subpos = 0 - blockpos++ - - subpos++ - - return string - - -/proc/getblock(input,blocknumber,blocksize) - var/result - result = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - return result - -/proc/getblockbuffer(input,blocknumber,blocksize) - var/result[3] - var/block = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - for(var/i = 1, i <= 3, i++) - result[i] = copytext(block, i, i+1) - return result - -/proc/setblock(istring, blocknumber, replacement, blocksize) - if(!blocknumber) - return istring - if(!istring || !replacement || !blocksize) return 0 - var/result = getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) - return result - -/proc/add_zero2(t, u) - var/temp1 - while (length(t) < u) - t = "0[t]" - temp1 = t - if (length(t) > u) - temp1 = copytext(t,2,u+1) - return temp1 - -/proc/miniscramble(input,rs,rd) - var/output - output = null - if (input == "C" || input == "D" || input == "E" || input == "F") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"6",prob((rs*10));"7",prob((rs*5)+(rd));"0",prob((rs*5)+(rd));"1",prob((rs*10)-(rd));"2",prob((rs*10)-(rd));"3") - if (input == "8" || input == "9" || input == "A" || input == "B") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "4" || input == "5" || input == "6" || input == "7") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "0" || input == "1" || input == "2" || input == "3") - output = pick(prob((rs*10));"8",prob((rs*10));"9",prob((rs*10));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C",prob((rs*10)-(rd));"D",prob((rs*5)+(rd));"E",prob((rs*5)+(rd));"F") - if (!output) output = "5" - return output - -//Instead of picking a value far from the input, this will pick values closer to it. -//Sorry for the block of code, but it's more efficient then calling text2hex -> loop -> hex2text -/proc/miniscrambletarget(input,rs,rd) - var/output = null - switch(input) - if("0") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10));"2",prob((rs*10)-(rd));"3") - if("1") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10));"3",prob((rs*10)-(rd));"4") - if("2") - output = pick(prob((rs*10));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10));"4",prob((rs*10)-(rd));"5") - if("3") - output = pick(prob((rs*10)-(rd));"0",prob((rs*10));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10));"5",prob((rs*10)-(rd));"6") - if("4") - output = pick(prob((rs*10)-(rd));"1",prob((rs*10));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10));"6",prob((rs*10)-(rd));"7") - if("5") - output = pick(prob((rs*10)-(rd));"2",prob((rs*10));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10));"7",prob((rs*10)-(rd));"8") - if("6") - output = pick(prob((rs*10)-(rd));"3",prob((rs*10));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10));"8",prob((rs*10)-(rd));"9") - if("7") - output = pick(prob((rs*10)-(rd));"4",prob((rs*10));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10));"9",prob((rs*10)-(rd));"A") - if("8") - output = pick(prob((rs*10)-(rd));"5",prob((rs*10));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10));"A",prob((rs*10)-(rd));"B") - if("9") - output = pick(prob((rs*10)-(rd));"6",prob((rs*10));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C") - if("10")//A - output = pick(prob((rs*10)-(rd));"7",prob((rs*10));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10));"C",prob((rs*10)-(rd));"D") - if("11")//B - output = pick(prob((rs*10)-(rd));"8",prob((rs*10));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10));"D",prob((rs*10)-(rd));"E") - if("12")//C - output = pick(prob((rs*10)-(rd));"9",prob((rs*10));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10));"E",prob((rs*10)-(rd));"F") - if("13")//D - output = pick(prob((rs*10)-(rd));"A",prob((rs*10));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10));"F") - if("14")//E - output = pick(prob((rs*10)-(rd));"B",prob((rs*10));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - if("15")//F - output = pick(prob((rs*10)-(rd));"C",prob((rs*10));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - - if(!input || !output) //How did this happen? - output = "8" - - return output - -/proc/isblockon(hnumber, bnumber , var/UI = 0) - - var/temp2 - temp2 = hex2num(hnumber) - - if(UI) - if(temp2 >= 2050) - return 1 - else - return 0 - - if (bnumber == HULKBLOCK || bnumber == TELEBLOCK || bnumber == NOBREATHBLOCK || bnumber == NOPRINTSBLOCK || bnumber == SMALLSIZEBLOCK || bnumber == SHOCKIMMUNITYBLOCK) - if (temp2 >= 3500 + BLOCKADD) - return 1 - else - return 0 - if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK || bnumber == REMOTEVIEWBLOCK || bnumber == REGENERATEBLOCK || bnumber == INCREASERUNBLOCK || bnumber == REMOTETALKBLOCK || bnumber == MORPHBLOCK) - if (temp2 >= 3050 + BLOCKADD) - return 1 - else - return 0 - - - if (temp2 >= 2050 + BLOCKADD) - return 1 - else - return 0 - -/proc/ismuton(var/block,var/mob/M) - return isblockon(getblock(M.dna.struc_enzymes, block,3),block) - -/proc/randmutb(mob/M as mob) - if(!M) return - var/num - var/newdna - num = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) - M.dna.struc_enzymes = newdna - return - -/proc/randmutg(mob/M as mob) - if(!M) return - var/num - var/newdna - num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) - M.dna.struc_enzymes = newdna - return - -/proc/scramble(var/type, mob/M as mob, var/p) - if(!M) return - M.dna.check_integrity() - if(type) - for(var/i = 1, i <= STRUCDNASIZE-1, i++) - if(prob(p)) - M.dna.uni_identity = setblock(M.dna.uni_identity, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - updateappearance(M, M.dna.uni_identity) - - else - for(var/i = 1, i <= STRUCDNASIZE-1, i++) - if(prob(p)) - M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - domutcheck(M, null) - return - -/proc/randmuti(mob/M as mob) - if(!M) return - var/num - var/newdna - num = rand(1,UNIDNASIZE) - M.dna.check_integrity() - newdna = setblock(M.dna.uni_identity,num,add_zero2(num2hex(rand(1,4095),1),3),3) - M.dna.uni_identity = newdna - return - -/proc/toggledblock(hnumber) //unused - var/temp3 - var/chtemp - temp3 = hex2num(hnumber) - if (temp3 < 2050) - chtemp = rand(2050,4095) - return add_zero2(num2hex(chtemp,1),3) - else - chtemp = rand(1,2049) - return add_zero2(num2hex(chtemp,1),3) -/////////////////////////// DNA HELPER-PROCS - -/////////////////////////// DNA MISC-PROCS -/proc/updateappearance(mob/M as mob , structure) - if(istype(M, /mob/living/carbon/human)) - M.dna.check_integrity() - var/mob/living/carbon/human/H = M - H.r_hair = hex2num(getblock(structure,1,3)) - H.b_hair = hex2num(getblock(structure,2,3)) - H.g_hair = hex2num(getblock(structure,3,3)) - H.r_facial = hex2num(getblock(structure,4,3)) - H.b_facial = hex2num(getblock(structure,5,3)) - H.g_facial = hex2num(getblock(structure,6,3)) - H.s_tone = round(((hex2num(getblock(structure,7,3)) / 16) - 220)) - H.r_eyes = hex2num(getblock(structure,8,3)) - H.g_eyes = hex2num(getblock(structure,9,3)) - H.b_eyes = hex2num(getblock(structure,10,3)) - if(H.internal_organs_by_name["eyes"]) - var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"] - eyes.eye_colour = list(H.r_eyes,H.g_eyes,H.b_eyes) - - if (isblockon(getblock(structure, 11,3),11 , 1)) - H.gender = FEMALE - else - H.gender = MALE - - //Hair - var/hairnum = hex2num(getblock(structure,13,3)) - var/index = round(1 +(hairnum / 4096)*hair_styles_list.len) - if((0 < index) && (index <= hair_styles_list.len)) - H.h_style = hair_styles_list[index] - - //Facial Hair - var/beardnum = hex2num(getblock(structure,12,3)) - index = round(1 +(beardnum / 4096)*facial_hair_styles_list.len) - if((0 < index) && (index <= facial_hair_styles_list.len)) - H.f_style = facial_hair_styles_list[index] - - H.update_body(0) - H.update_hair() - - return 1 - else - return 0 - -/proc/probinj(var/pr, var/inj) - return prob(pr+inj*pr) - -/proc/domutcheck(mob/living/M as mob, connected, inj) - if (!M) return - - M.dna.check_integrity() - - M.disabilities = 0 - M.sdisabilities = 0 - var/old_mutations = M.mutations - M.mutations = list() - -// M.see_in_dark = 2 -// M.see_invisible = 0 - - if(PLANT in old_mutations) - M.mutations.Add(PLANT) - if(SKELETON in old_mutations) - M.mutations.Add(SKELETON) - if(FAT in old_mutations) - M.mutations.Add(FAT) - if(HUSK in old_mutations) - M.mutations.Add(HUSK) - - if(ismuton(NOBREATHBLOCK,M)) - if(probinj(45,inj) || (mNobreath in old_mutations)) - M << "\blue You feel no need to breathe." - M.mutations.Add(mNobreath) - if(ismuton(REMOTEVIEWBLOCK,M)) - if(probinj(45,inj) || (mRemote in old_mutations)) - M << "\blue Your mind expands" - M.mutations.Add(mRemote) - if(ismuton(REGENERATEBLOCK,M)) - if(probinj(45,inj) || (mRegen in old_mutations)) - M << "\blue You feel strange" - M.mutations.Add(mRegen) - if(ismuton(INCREASERUNBLOCK,M)) - if(probinj(45,inj) || (mRun in old_mutations)) - M << "\blue You feel quick" - M.mutations.Add(mRun) - if(ismuton(REMOTETALKBLOCK,M)) - if(probinj(45,inj) || (mRemotetalk in old_mutations)) - M << "\blue You expand your mind outwards" - M.mutations.Add(mRemotetalk) - if(ismuton(MORPHBLOCK,M)) - if(probinj(45,inj) || (mMorph in old_mutations)) - M.mutations.Add(mMorph) - M << "\blue Your skin feels strange" - if(ismuton(BLENDBLOCK,M)) - if(probinj(45,inj) || (mBlend in old_mutations)) - M.mutations.Add(mBlend) - M << "\blue You feel alone" - if(ismuton(HALLUCINATIONBLOCK,M)) - if(probinj(45,inj) || (mHallucination in old_mutations)) - M.mutations.Add(mHallucination) - M << "\blue Your mind says 'Hello'" - if(ismuton(NOPRINTSBLOCK,M)) - if(probinj(45,inj) || (mFingerprints in old_mutations)) - M.mutations.Add(mFingerprints) - M << "\blue Your fingers feel numb" - if(ismuton(SHOCKIMMUNITYBLOCK,M)) - if(probinj(45,inj) || (mShock in old_mutations)) - M.mutations.Add(mShock) - M << "\blue You feel strange" - if(ismuton(SMALLSIZEBLOCK,M)) - if(probinj(45,inj) || (mSmallsize in old_mutations)) - M << "\blue Your skin feels rubbery" - M.mutations.Add(mSmallsize) - - - - if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),HULKBLOCK)) - if(probinj(5,inj) || (HULK in old_mutations)) - M << "\blue Your muscles hurt." - M.mutations.Add(HULK) - if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK)) - M.disabilities |= EPILEPSY - M << "\red You get a headache." - if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK)) - M << "\red You feel strange." - if (prob(95)) - if(prob(50)) - randmutb(M) - else - randmuti(M) - else - randmutg(M) - if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK)) - M.disabilities |= COUGHING - M << "\red You start coughing." - if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK)) - M << "\red You feel lightheaded." - M.mutations.Add(CLUMSY) - if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK)) - M.disabilities |= TOURETTES - M << "\red You twitch." - if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK)) - if(probinj(30,inj) || (XRAY in old_mutations)) - M << "\blue The walls suddenly disappear." -// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) -// M.see_in_dark = 8 -// M.see_invisible = 2 - M.mutations.Add(XRAY) - if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK)) - M.disabilities |= NERVOUS - M << "\red You feel nervous." - if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK)) - if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations)) - M << "\blue Your body feels warm." - M.mutations.Add(COLD_RESISTANCE) - if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK)) - M.sdisabilities |= BLIND - M << "\red You can't seem to see anything." - if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK)) - if(probinj(15,inj) || (TK in old_mutations)) - M << "\blue You feel smarter." - M.mutations.Add(TK) - if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK)) - M.sdisabilities |= DEAF - M.ear_deaf = 1 - M << "\red Its kinda quiet.." - if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK)) - M.disabilities |= NEARSIGHTED - M << "Your eyes feel weird..." - - /* If you want the new mutations to work, UNCOMMENT THIS. - if(istype(M, /mob/living/carbon)) - for (var/datum/mutations/mut in global_mutations) - mut.check_mutation(M) - */ - -//////////////////////////////////////////////////////////// Monkey Block - if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human)) - // human > monkey - var/mob/living/carbon/human/H = M - H.monkeyizing = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null - - if(!connected) - for(var/obj/item/W in (H.contents-implants)) - if (W==H.w_uniform) // will be teared - continue - H.drop_from_inventory(W) - M.monkeyizing = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - del(animation) - - - var/mob/living/carbon/monkey/O = null - if(H.species.primitive) - O = new H.species.primitive(src) - else - H.gib() //Trying to change the species of a creature with no primitive var set is messy. - return - - if(M) - if (M.dna) - O.dna = M.dna - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - - for(var/obj/T in (M.contents-implants)) - del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the cute little monkey - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) - O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss() + 20) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - O.a_intent = "hurt" - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return - - if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human)) - // monkey > human, - var/mob/living/carbon/monkey/Mo = M - Mo.monkeyizing = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) - Mo.drop_from_inventory(W) - M.monkeyizing = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(48) - del(animation) - - var/mob/living/carbon/human/O = new( src ) - if(Mo.greaterform) - O.set_species(Mo.greaterform) - - if (isblockon(getblock(M.dna.uni_identity, 11,3),11)) - O.gender = FEMALE - else - O.gender = MALE - - if (M) - if (M.dna) - O.dna = M.dna - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - //for(var/obj/T in M) - // del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the human - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - - var/i - while (!i) - var/randomname - if (O.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) - continue - else - O.real_name = randomname - i++ - updateappearance(O,O.dna.uni_identity) - O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss()) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return -//////////////////////////////////////////////////////////// Monkey Block - if(M) - M.update_icon = 1 //queue a full icon update at next life() call - return null ->>>>>>> d77010221cbd08f6373edebee25d727b6409413b -/////////////////////////// DNA MISC-PROCS \ No newline at end of file diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 86bfbeb0fe..68e1f34f88 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -144,7 +144,7 @@ return put_in(G.affecting) src.add_fingerprint(user) - del(G) + qdel(G) return /obj/machinery/dna_scannernew/proc/put_in(var/mob/M) @@ -187,7 +187,7 @@ ex_act(severity) //Foreach goto(35) //SN src = null - del(src) + qdel(src) return if(2.0) if (prob(50)) @@ -196,7 +196,7 @@ ex_act(severity) //Foreach goto(108) //SN src = null - del(src) + qdel(src) return if(3.0) if (prob(25)) @@ -205,7 +205,7 @@ ex_act(severity) //Foreach goto(181) //SN src = null - del(src) + qdel(src) return else return @@ -215,7 +215,7 @@ if(prob(75)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc - del(src) + qdel(src) /obj/machinery/computer/scan_consolenew name = "DNA Modifier Access Console" @@ -262,12 +262,12 @@ switch(severity) if(1.0) //SN src = null - del(src) + qdel(src) return if(2.0) if (prob(50)) //SN src = null - del(src) + qdel(src) return else return @@ -275,7 +275,7 @@ /obj/machinery/computer/scan_consolenew/blob_act() if(prob(75)) - del(src) + qdel(src) /obj/machinery/computer/scan_consolenew/power_change() ..() diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 2e0f6cdec2..7d9da10636 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -33,7 +33,7 @@ animation.master = src flick("h2monkey", animation) sleep(48) - del(animation) + qdel(animation) var/mob/living/carbon/monkey/O = null @@ -60,7 +60,7 @@ for(var/obj/T in (M.contents-implants)) - del(T) + qdel(T) O.loc = M.loc @@ -82,7 +82,7 @@ I.loc = O I.implanted = O // O.update_icon = 1 //queue a full icon update at next life() call - del(M) + qdel(M) return /datum/dna/gene/monkey/deactivate(var/mob/living/M, var/connected, var/flags) @@ -108,7 +108,7 @@ animation.master = src flick("monkey2h", animation) sleep(48) - del(animation) + qdel(animation) var/mob/living/carbon/human/O if(Mo.greaterform) @@ -136,7 +136,7 @@ M.viruses -= D //for(var/obj/T in M) - // del(T) + // qdel(T) O.loc = M.loc @@ -171,5 +171,5 @@ I.loc = O I.implanted = O // O.update_icon = 1 //queue a full icon update at next life() call - del(M) + qdel(M) return diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index f0a24001ba..3897d444e8 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -14,7 +14,7 @@ ..(loc, h) - Del() + Destroy() blob_cores -= src processing_objects.Remove(src) ..() @@ -24,7 +24,7 @@ update_icon() if(health <= 0) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - del(src) + qdel(src) return return diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index bb8de8184e..c1d14d0040 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -12,7 +12,7 @@ update_icon() if(health <= 0) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - del(src) + qdel(src) return return @@ -22,6 +22,11 @@ new/mob/living/simple_animal/hostile/blobspore(src.loc, src) return 1 +/obj/effect/blob/factory/Destroy() + for(var/mob/living/simple_animal/hostile/blobspore/spore in spores) + if(spore.factory == src) + spore.factory = null + ..() /mob/living/simple_animal/hostile/blobspore name = "blob" @@ -58,9 +63,10 @@ ..(loc) return death() - ..() - if(factory) - factory.spores -= src - ..() - del(src) + qdel(src) +/mob/living/simple_animal/hostile/blobspore/Destroy() + if(factory) + factory.spores -= src + factory = null + ..() diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index c9ffaf96f1..92572f9a7b 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -14,7 +14,7 @@ ..(loc, h) - Del() + Destroy() blob_nodes -= src processing_objects.Remove(src) ..() @@ -24,7 +24,7 @@ update_icon() if(health <= 0) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - del(src) + qdel(src) return return diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 0e1b6c07eb..c47696c72e 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -14,7 +14,7 @@ update_icon() if(health <= 0) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - del(src) + qdel(src) return return diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index f6351c8480..6e9c3d9b68 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -31,7 +31,7 @@ return - Del() + Destroy() blobs -= src ..() return @@ -110,7 +110,7 @@ B.loc = T else T.blob_act()//If we cant move in hit the turf - del(B) + qdel(B) for(var/atom/A in T)//Hit everything in the turf A.blob_act() return 1 @@ -134,7 +134,7 @@ update_icon()//Needs to be updated with the types if(health <= 0) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - del(src) + qdel(src) return if(health <= 15) icon_state = "blob_damaged" @@ -158,7 +158,7 @@ attackby(var/obj/item/weapon/W, var/mob/user) playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - src.visible_message("\red The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]") + src.visible_message("The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]") var/damage = 0 switch(W.damtype) if("fire") @@ -182,7 +182,7 @@ new/obj/effect/blob/factory(src.loc,src.health) if("Shield") new/obj/effect/blob/shield(src.loc,src.health*2) - del(src) + qdel(src) return //////////////////////////////****IDLE BLOB***///////////////////////////////////// @@ -201,7 +201,7 @@ proc/update_idle() if(health<=0) - del(src) + qdel(src) return if(health<4) icon_state = "blobc0" @@ -212,7 +212,7 @@ icon_state = "blobidle0" - Del() + Destroy() var/obj/effect/blob/B = new /obj/effect/blob( src.loc ) spawn(30) B.Life() diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 6f5ca5d8e9..2961950377 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -385,7 +385,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E animation.master = src flick("monkey2h", animation) sleep(48) - del(animation) + qdel(animation) for(var/obj/item/W in src) C.drop_from_inventory(W) @@ -400,7 +400,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E O.real_name = chosen_dna.real_name for(var/obj/T in C) - del(T) + qdel(T) O.loc = C.loc @@ -420,7 +420,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E O.changeling_update_languages(changeling.absorbed_languages) feedback_add_details("changeling_powers","LFT") - del(C) + qdel(C) return 1 @@ -463,7 +463,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E // sending display messages C << "We have regenerated." - C.visible_message("[src] appears to wake from the dead, having healed all wounds.") feedback_add_details("changeling_powers","FD") diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 6a17d03a07..a1c0acf008 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -8,4 +8,4 @@ required_enemies = 3 uplink_welcome = "Nar-Sie Uplink Console:" end_on_antag_death = 1 - antag_tag = MODE_CULTIST \ No newline at end of file + antag_tag = MODE_CULTIST diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index f2f5f96de7..a17c030b11 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -8,6 +8,8 @@ throwforce = 10 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") +/obj/item/weapon/melee/cultblade/cultify() + return /obj/item/weapon/melee/cultblade/attack(mob/living/target as mob, mob/living/carbon/human/user as mob) if(iscultist(user)) @@ -40,15 +42,22 @@ min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0 +/obj/item/clothing/head/culthood/cultify() + return + +/obj/item/clothing/head/culthood/magus + name = "magus helm" + icon_state = "magus" + item_state = "magus" + desc = "A helm worn by the followers of Nar-Sie." + flags_inv = HIDEFACE + flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR + body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/head/culthood/alt icon_state = "cult_hoodalt" item_state = "cult_hoodalt" -/obj/item/clothing/suit/cultrobes/alt - icon_state = "cultrobesalt" - item_state = "cultrobesalt" - /obj/item/clothing/suit/cultrobes name = "cult robes" desc = "A set of armored robes worn by the followers of Nar-Sie" @@ -60,27 +69,20 @@ flags_inv = HIDEJUMPSUIT siemens_coefficient = 0 -/obj/item/clothing/head/magus - name = "magus helm" - icon_state = "magus" - item_state = "magus" - desc = "A helm worn by the followers of Nar-Sie." - flags_inv = HIDEFACE - flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR - body_parts_covered = HEAD|FACE|EYES - armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0) - siemens_coefficient = 0 +/obj/item/clothing/suit/cultrobes/cultify() + return -/obj/item/clothing/suit/magusred +/obj/item/clothing/suit/cultrobes/alt + icon_state = "cultrobesalt" + item_state = "cultrobesalt" + +/obj/item/clothing/suit/cultrobes/magusred name = "magus robes" desc = "A set of armored robes worn by the followers of Nar-Sie" icon_state = "magusred" item_state = "magusred" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade) - armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - siemens_coefficient = 0 /obj/item/clothing/head/helmet/space/cult name = "cult helmet" @@ -90,6 +92,8 @@ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0 +/obj/item/clothing/head/helmet/space/cult/cultify() + return /obj/item/clothing/suit/space/cult name = "cult armour" @@ -101,4 +105,7 @@ slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0 - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS \ No newline at end of file + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS + +/obj/item/clothing/suit/space/cult/cultify() + return diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index bf2124ebb5..337ad39c0d 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -3,6 +3,9 @@ anchored = 1 icon = 'icons/obj/cult.dmi' +/obj/structure/cult/cultify() + return + /obj/structure/cult/talisman name = "Altar" desc = "A bloodstained altar dedicated to Nar-Sie" @@ -18,8 +21,52 @@ name = "Pylon" desc = "A floating crystal that hums with an unearthly energy" icon_state = "pylon" + var/isbroken = 0 luminosity = 5 + l_color = "#3e0000" + var/obj/item/wepon = null +/obj/structure/cult/pylon/attack_hand(mob/M as mob) + attackpylon(M, 5) + +/obj/structure/cult/pylon/attack_generic(var/mob/user, var/damage) + attackpylon(user, damage) + +/obj/structure/cult/pylon/attackby(obj/item/W as obj, mob/user as mob) + attackpylon(user, W.force) + +/obj/structure/cult/pylon/proc/attackpylon(mob/user as mob, var/damage) + if(!isbroken) + if(prob(1+ damage * 5)) + user << "You hit the pylon, and its crystal breaks apart!" + for(var/mob/M in viewers(src)) + if(M == user) + continue + M.show_message("[user.name] smashed the pylon!", 3, "You hear a tinkle of crystal shards", 2) + playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1) + isbroken = 1 + density = 0 + icon_state = "pylon-broken" + SetLuminosity(0) + else + user << "You hit the pylon!" + playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1) + else + if(prob(damage * 2)) + user << "You pulverize what was left of the pylon!" + qdel(src) + else + user << "You hit the pylon!" + playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1) + + +/obj/structure/cult/pylon/proc/repair(mob/user as mob) + if(isbroken) + user << "You repair the pylon." + isbroken = 0 + density = 1 + icon_state = "pylon" + SetLuminosity(5) /obj/structure/cult/tome name = "Desk" @@ -45,6 +92,7 @@ density = 1 unacidable = 1 anchored = 1.0 + var/spawnable = null /obj/effect/gateway/Bumped(mob/M as mob|obj) spawn(0) @@ -54,4 +102,74 @@ /obj/effect/gateway/Crossed(AM as mob|obj) spawn(0) return - return \ No newline at end of file + return + +/obj/effect/gateway/active + luminosity=5 + l_color="#ff0000" + spawnable=list( + /mob/living/simple_animal/hostile/scarybat, + /mob/living/simple_animal/hostile/creature, + /mob/living/simple_animal/hostile/faithless + ) + +/obj/effect/gateway/active/cult + luminosity=5 + l_color="#ff0000" + spawnable=list( + /mob/living/simple_animal/hostile/scarybat/cult, + /mob/living/simple_animal/hostile/creature/cult, + /mob/living/simple_animal/hostile/faithless/cult + ) + +/obj/effect/gateway/active/cult/cultify() + return + +/obj/effect/gateway/active/New() + spawn(rand(30,60) SECONDS) + var/t = pick(spawnable) + new t(src.loc) + qdel(src) + +/obj/effect/gateway/active/Crossed(var/atom/A) + if(!istype(A, /mob/living)) + return + + var/mob/living/M = A + + if(M.stat != DEAD) + if(M.monkeyizing) + return + if(M.has_brain_worms()) + return //Borer stuff - RR + + if(iscultist(M)) return + if(!ishuman(M) && !isrobot(M)) return + + M.monkeyizing = 1 + M.canmove = 0 + M.icon = null + M.overlays.len = 0 + M.invisibility = 101 + + if(istype(M, /mob/living/silicon/robot)) + var/mob/living/silicon/robot/Robot = M + if(Robot.mmi) + qdel(Robot.mmi) + else + for(var/obj/item/W in M) + if(istype(W, /obj/item/weapon/implant)) + qdel(W) + continue + W.layer = initial(W.layer) + W.loc = M.loc + W.dropped(M) + + var/mob/living/new_mob = new /mob/living/simple_animal/corgi(A.loc) + new_mob.a_intent = I_HURT + if(M.mind) + M.mind.transfer_to(new_mob) + else + new_mob.key = M.key + + new_mob << "Your form morphs into that of a corgi." //Because we don't have cluwnes diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/code/game/gamemodes/cult/cultify/mob.dm new file mode 100644 index 0000000000..965d2548f7 --- /dev/null +++ b/code/game/gamemodes/cult/cultify/mob.dm @@ -0,0 +1,63 @@ +/mob + //thou shall always be able to see the Geometer of Blood + var/image/narsimage = null + var/image/narglow = null + +/mob/proc/cultify() + return + +/mob/dead/cultify() + if(icon_state != "ghost-narsie") + icon = 'icons/mob/mob.dmi' + icon_state = "ghost-narsie" + overlays = 0 + invisibility = 0 + src << "Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone." + +/mob/living/cultify() + if(iscultist(src) && client) + var/mob/living/simple_animal/construct/harvester/C = new(get_turf(src)) + mind.transfer_to(C) + C << "The Geometer of Blood is overjoyed to be reunited with its followers, and accepts your body in sacrifice. As reward, you have been gifted with the shell of an Harvester.
    Your tendrils can use and draw runes without need for a tome, your eyes can see beings through walls, and your mind can open any door. Use these assets to serve Nar-Sie and bring him any remaining living human in the world.
    You can teleport yourself back to Nar-Sie along with any being under yourself at any time using your \"Harvest\" spell.
    " + dust() + else if(client) + var/mob/dead/G = (ghostize()) + G.icon = 'icons/mob/mob.dmi' + G.icon_state = "ghost-narsie" + G.overlays = 0 + G.invisibility = 0 + G << "You feel relieved as what's left of your soul finally escapes its prison of flesh." + + cult.harvested += G.mind + else + dust() + +/mob/proc/see_narsie(var/obj/singularity/narsie/large/N, var/dir) + if(N.chained) + if(narsimage) + qdel(narsimage) + qdel(narglow) + return + if((N.z == src.z)&&(get_dist(N,src) <= (N.consume_range+10)) && !(N in view(src))) + if(!narsimage) //Create narsimage + narsimage = image('icons/obj/narsie.dmi',src.loc,"narsie",9,1) + narsimage.mouse_opacity = 0 + if(!narglow) //Create narglow + narglow = image('icons/obj/narsie.dmi',narsimage.loc,"glow-narsie",LIGHTING_LAYER+2,1) + narglow.mouse_opacity = 0 + //Else if no dir is given, simply send them the image of narsie + var/new_x = 32 * (N.x - src.x) + N.pixel_x + var/new_y = 32 * (N.y - src.y) + N.pixel_y + narsimage.pixel_x = new_x + narsimage.pixel_y = new_y + narglow.pixel_x = new_x + narglow.pixel_y = new_y + narsimage.loc = src.loc + narglow.loc = src.loc + //Display the new narsimage to the player + src << narsimage + src << narglow + else + if(narsimage) + qdel(narsimage) + qdel(narglow) diff --git a/code/game/gamemodes/cult/cultify/obj.dm b/code/game/gamemodes/cult/cultify/obj.dm new file mode 100644 index 0000000000..630877eb11 --- /dev/null +++ b/code/game/gamemodes/cult/cultify/obj.dm @@ -0,0 +1,156 @@ +/obj/proc/cultify() + qdel(src) + +/obj/effect/decal/cleanable/blood/cultify() + return + +/obj/effect/decal/remains/cultify() + return + +/obj/effect/overlay/cultify() + return + +/obj/item/device/flashlight/lamp/cultify() + new /obj/structure/cult/pylon(loc) + ..() + +/obj/item/stack/sheet/wood/cultify() + return + +/obj/item/weapon/book/cultify() + new /obj/item/weapon/book/tome(loc) + ..() + +/obj/item/weapon/claymore/cultify() + new /obj/item/weapon/melee/cultblade(loc) + ..() + +/obj/item/weapon/storage/backpack/cultify() + new /obj/item/weapon/storage/backpack/cultpack(loc) + ..() + +/obj/item/weapon/storage/backpack/cultpack/cultify() + return + +/obj/item/weapon/table_parts/cultify() + new /obj/item/weapon/table_parts/wood(loc) + ..() + +/obj/item/weapon/table_parts/wood/cultify() + return + +/obj/machinery/cultify() + // We keep the number of cultified machines down by only converting those that are dense + // The alternative is to keep a separate file of exceptions. + if(density) + var/list/random_structure = list( + /obj/structure/cult/talisman, + /obj/structure/cult/forge, + /obj/structure/cult/tome + ) + var/I = pick(random_structure) + new I(loc) + ..() + +/obj/machinery/atmospherics/cultify() + if(src.invisibility != INVISIBILITY_MAXIMUM) + src.invisibility = INVISIBILITY_MAXIMUM + density = 0 + +/obj/machinery/cooking/cultify() + new /obj/structure/cult/talisman(loc) + qdel(src) + +/obj/machinery/computer/cultify() + new /obj/structure/cult/tome(loc) + qdel(src) + +/obj/machinery/door/airlock/external/cultify() + new /obj/structure/mineral_door/wood(loc) + ..() + +/obj/machinery/door/cultify() + icon_state = "null" + density = 0 + c_animation = new /atom/movable/overlay(src.loc) + c_animation.name = "cultification" + c_animation.density = 0 + c_animation.anchored = 1 + c_animation.icon = 'icons/effects/effects.dmi' + c_animation.layer = 5 + c_animation.master = src.loc + c_animation.icon_state = "breakdoor" + flick("cultification",c_animation) + spawn(10) + qdel(c_animation) + qdel(src) + +/obj/machinery/door/firedoor/cultify() + qdel(src) + +/obj/machinery/light/cultify() + new /obj/structure/cult/pylon(loc) + qdel(src) + +/obj/machinery/mech_sensor/cultify() + qdel(src) + +/obj/machinery/power/apc/cultify() + if(src.invisibility != INVISIBILITY_MAXIMUM) + src.invisibility = INVISIBILITY_MAXIMUM + +/obj/machinery/vending/cultify() + new /obj/structure/cult/forge(loc) + qdel(src) + +/obj/structure/bed/chair/cultify() + var/obj/structure/bed/chair/wood/wings/I = new(loc) + I.dir = dir + ..() + +/obj/structure/bed/chair/wood/cultify() + return + +/obj/structure/bookcase/cultify() + return + +/obj/structure/grille/cultify() + new /obj/structure/grille/cult(get_turf(src)) + ..() + +/obj/structure/grille/cult/cultify() + return + +/obj/structure/mineral_door/cultify() + new /obj/structure/mineral_door/wood(loc) + ..() + +/obj/structure/mineral_door/wood/cultify() + return + +/obj/singularity/cultify() + var/dist = max((current_size - 2), 1) + explosion(get_turf(src), dist, dist * 2, dist * 4) + qdel(src) + +/obj/structure/shuttle/engine/heater/cultify() + new /obj/structure/cult/pylon(loc) + ..() + +/obj/structure/shuttle/engine/propulsion/cultify() + var/turf/T = get_turf(src) + if(T) + T.ChangeTurf(/turf/simulated/wall/cult) + ..() + +/obj/structure/stool/cultify() + var/obj/structure/bed/chair/wood/wings/I = new(loc) + I.dir = dir + ..() + +/obj/structure/table/cultify() + new /obj/structure/table/woodentable(loc) + ..() + +/obj/structure/table/woodentable/cultify() + return diff --git a/code/game/gamemodes/cult/cultify/turf.dm b/code/game/gamemodes/cult/cultify/turf.dm new file mode 100644 index 0000000000..0005298c42 --- /dev/null +++ b/code/game/gamemodes/cult/cultify/turf.dm @@ -0,0 +1,43 @@ +/turf/proc/cultify() + ChangeTurf(/turf/space) + return + +/turf/simulated/floor/cultify() + cultify_floor() + +/turf/simulated/floor/carpet/cultify() + return + +/turf/simulated/shuttle/floor/cultify() + cultify_floor() + +/turf/simulated/shuttle/floor4/cultify() + cultify_floor() + +/turf/simulated/shuttle/wall/cultify() + cultify_wall() + +/turf/simulated/wall/cultify() + cultify_wall() + +/turf/simulated/wall/cult/cultify() + return + +/turf/unsimulated/beach/cultify() + return + +/turf/unsimulated/floor/cultify() + cultify_floor() + +/turf/unsimulated/wall/cultify() + cultify_wall() + +/turf/proc/cultify_floor() + if((icon_state != "cult")&&(icon_state != "cult-narsie")) + name = "engraved floor" + icon_state = "cult" + turf_animation('icons/effects/effects.dmi',"cultfloor",0,0,MOB_LAYER-1) + +/turf/proc/cultify_wall() + ChangeTurf(/turf/unsimulated/wall/cult) + turf_animation('icons/effects/effects.dmi',"cultwall",0,0,MOB_LAYER-1) diff --git a/code/game/gamemodes/cult/hell_universe.dm b/code/game/gamemodes/cult/hell_universe.dm new file mode 100644 index 0000000000..39f4402391 --- /dev/null +++ b/code/game/gamemodes/cult/hell_universe.dm @@ -0,0 +1,102 @@ +/* + +In short: + * Random area alarms + * All areas jammed + * Random gateways spawning hellmonsters (and turn people into cluwnes if ran into) + * Broken APCs/Fire Alarms + * Scary music + * Random tiles changing to culty tiles. + +*/ +/datum/universal_state/hell + name = "Hell Rising" + desc = "OH FUCK OH FUCK OH FUCK" + + decay_rate = 5 // 5% chance of a turf decaying on lighting update/airflow (there's no actual tick for turfs) + +/datum/universal_state/hell/OnShuttleCall(var/mob/user) + return 1 + /* + if(user) + user << "All you hear on the frequency is static and panicked screaming. There will be no shuttle call today." + return 0 + */ + +/datum/universal_state/hell/DecayTurf(var/turf/T) + if(!T.holy) + T.cultify() + for(var/obj/machinery/light/L in T.contents) + new /obj/structure/cult/pylon(L.loc) + qdel(L) + return + + +/datum/universal_state/hell/OnTurfChange(var/turf/T) + var/turf/space/spess = T + if(istype(spess)) + spess.overlays += "hell01" + +// Apply changes when entering state +/datum/universal_state/hell/OnEnter() + set background = 1 + garbage_collector.garbage_collect = 0 + escape_list = get_area_turfs(locate(/area/hallway/secondary/exit)) + + //Separated into separate procs for profiling + AreaSet() + OverlaySet() + MiscSet() + APCSet() + KillMobs() + AmbientSet() + + runedec += 9000 //basically removing the rune cap + +/datum/universal_state/hell/proc/AreaSet() + for(var/area/ca in world) + var/area/A = ca.master + if(!istype(A,/area) || A.name=="Space") + continue + + // Reset all alarms. + A.fire = null + A.atmos = 1 + A.atmosalm = 0 + A.poweralm = 1 + A.party = null + + A.updateicon() + +/datum/universal_state/hell/proc/OverlaySet() + var/image/I = image("icon" = 'icons/turf/space.dmi', "icon_state" = "hell01", "layer" = 10) + for(var/turf/space/spess in world) + spess.overlays += I + +/datum/universal_state/hell/proc/AmbientSet() + for(var/turf/T in world) + if(istype(T, /turf/space)) continue + T.update_lumcount(1, 255, 0, 0, 0) + +/datum/universal_state/hell/proc/MiscSet() + for(var/turf/simulated/floor/T in world) + if(!T.holy && prob(1)) + new /obj/effect/gateway/active/cult(T) + + for (var/obj/machinery/firealarm/alm in machines) + if (!(alm.stat & BROKEN)) + alm.ex_act(2) + +/datum/universal_state/hell/proc/APCSet() + for (var/obj/machinery/power/apc/APC in machines) + if (!(APC.stat & BROKEN) && !istype(APC.area,/area/turret_protected/ai)) + APC.chargemode = 0 + if(APC.cell) + APC.cell.charge = 0 + APC.emagged = 1 + APC.queue_icon_update() + +/datum/universal_state/hell/proc/KillMobs() + for(var/mob/living/simple_animal/M in mob_list) + if(M && !M.client) + M.stat = DEAD diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 0fd706059e..8a55a81165 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -2,7 +2,8 @@ var/cultwords = list() var/runedec = 0 -var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", "self", "see", "other", "hide") +var/global/list/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", "self", "see", "other", "hide") +var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") /client/proc/check_words() // -- Urist set category = "Special Verbs" @@ -14,7 +15,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", usr << "[cultwords[word]] is [word]" /proc/runerandom() //randomizes word meaning - var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed. + var/list/runewords=rnwords for (var/word in engwords) cultwords[word] = pick(runewords) runewords-=cultwords[word] @@ -32,8 +33,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", var/word1 var/word2 var/word3 + var/image/blood_image var/list/converting = list() - + // Places these combos are mentioned: this file - twice in the rune code, once in imbued tome, once in tome's HTML runes.dm - in the imbue rune code. If you change a combination - dont forget to change it everywhere. // travel self [word] - Teleport to random [rune with word destination matching] @@ -65,10 +67,21 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // join hide technology - stun rune. Rune color: bright pink. New() ..() - var/image/blood = image(loc = src) - blood.override = 1 + blood_image = image(loc = src) + blood_image.override = 1 for(var/mob/living/silicon/ai/AI in player_list) - AI.client.images += blood + if(AI.client) + AI.client.images += blood_image + rune_list.Add(src) + + Destroy() + for(var/mob/living/silicon/ai/AI in player_list) + if(AI.client) + AI.client.images -= blood_image + qdel(blood_image) + blood_image = null + rune_list.Remove(src) + ..() examine(mob/user) ..() @@ -79,11 +92,11 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", attackby(I as obj, user as mob) if(istype(I, /obj/item/weapon/book/tome) && iscultist(user)) user << "You retrace your steps, carefully undoing the lines of the rune." - del(src) + qdel(src) return else if(istype(I, /obj/item/weapon/nullrod)) user << "\blue You disrupt the vile magic with the deadening field of the null rod!" - del(src) + qdel(src) return return @@ -457,6 +470,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage if(do_after(user, 50)) + var/area/A = get_area(user) + log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") if(usr.get_active_hand() != src) return var/mob/living/carbon/human/H = user @@ -495,6 +510,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", else user << "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." +/obj/item/weapon/book/tome/cultify() + return + /obj/item/weapon/book/tome/imbued //admin tome, spawns working runes without waiting w_class = 2.0 var/cultistsonly = 1 @@ -514,6 +532,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", var/mob/living/carbon/human/H = user R.blood_DNA = list() R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + var/area/A = get_area(user) + log_and_message_admins("created \an [r] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") switch(r) if("teleport") var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 9230436a05..5599be4686 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -1,5 +1,8 @@ var/list/sacrificed = list() +/obj/effect/rune/cultify() + return + /obj/effect/rune /////////////////////////////////////////FIRST RUNE @@ -21,7 +24,7 @@ var/list/sacrificed = list() user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) - del(src) + qdel(src) if(allrunesloc && index != 0) if(istype(src,/obj/effect/rune)) user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting @@ -58,7 +61,7 @@ var/list/sacrificed = list() user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) - del(src) + qdel(src) for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) culcount++ @@ -91,7 +94,7 @@ var/list/sacrificed = list() new /obj/item/weapon/book/tome(src.loc) else new /obj/item/weapon/book/tome(usr.loc) - del(src) + qdel(src) return @@ -99,6 +102,7 @@ var/list/sacrificed = list() /////////////////////////////////////////THIRD RUNE convert() + var/mob/attacker = usr var/mob/living/carbon/target = null for(var/mob/living/carbon/M in src.loc) if(!iscultist(M) && M.stat < DEAD && !(M in converting)) @@ -123,10 +127,10 @@ var/list/sacrificed = list() if(target.getFireLoss() < 100) target.hallucination = min(target.hallucination, 500) return 0 - target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects // Resist messages go! if(initial_message) //don't do this stuff right away, only if they resist or hesitate. + admin_attack_log(attacker, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on") switch(target.getFireLoss()) if(0 to 25) target << "Your blood boils as you force yourself to resist the corruption invading every corner of your mind." @@ -176,13 +180,17 @@ var/list/sacrificed = list() /////////////////////////////////////////FOURTH RUNE tearreality() - var/cultist_count = 0 + if(!cult.allow_narsie) + return fizzle() + + var/list/cultists = new() for(var/mob/M in range(1,src)) if(iscultist(M) && !M.stat) M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") - cultist_count += 1 - if(cultist_count >= 9) - new /obj/machinery/singularity/narsie/large(src.loc) + cultists += 1 + if(cultists.len >= 9) + log_and_message_admins_many(cultists, "summoned Nar-sie.") + new /obj/singularity/narsie/large(src.loc) return else return fizzle() @@ -190,6 +198,7 @@ var/list/sacrificed = list() /////////////////////////////////////////FIFTH RUNE emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist + log_and_message_admins("activated an EMP rune.") if(istype(src,/obj/effect/rune)) usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!") else @@ -200,7 +209,7 @@ var/list/sacrificed = list() T.hotspot_expose(700,125) var/rune = src // detaching the proc - in theory empulse(U, (range_red - 2), range_red) - del(rune) + qdel(rune) return /////////////////////////////////////////SIXTH RUNE @@ -211,6 +220,7 @@ var/list/sacrificed = list() if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"]) for(var/mob/living/carbon/D in R.loc) if(D.stat!=2) + admin_attack_log(usr, D, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on") var/bdrain = rand(1,25) D << "\red You feel weakened." D.take_overall_damage(bdrain, 0) @@ -359,7 +369,7 @@ var/list/sacrificed = list() usr.say("Kla[pick("'","`")]atu barada nikt'o!") for (var/mob/V in viewers(src)) V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3) - del(src) + qdel(src) else usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") usr << "\red Your talisman turns into gray dust, veiling the surrounding runes." @@ -443,6 +453,7 @@ var/list/sacrificed = list() D.real_name += " " D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith") + log_and_message_admins("used a manifest rune.") var/mob/living/user = usr while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) user.take_organ_damage(1, 0) @@ -534,8 +545,8 @@ var/list/sacrificed = list() for (var/mob/V in viewers(src)) V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3) usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!") - del(imbued_from) - del(newtalisman) + qdel(imbued_from) + qdel(newtalisman) else return fizzle() @@ -563,26 +574,26 @@ var/list/sacrificed = list() // returns 0 if the rune is not used. returns 1 if the rune is used. communicate() . = 1 // Default output is 1. If the rune is deleted it will return 1 - var/input = sanitize(input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")) + var/input = input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")//sanitize() below, say() and whisper() have their own if(!input) if (istype(src)) fizzle() return 0 else return 0 - if(istype(src,/obj/effect/rune)) - usr.say("O bidai nabora se[pick("'","`")]sma!") - else - usr.whisper("O bidai nabora se[pick("'","`")]sma!") if(istype(src,/obj/effect/rune)) + usr.say("O bidai nabora se[pick("'","`")]sma!") usr.say("[input]") else + usr.whisper("O bidai nabora se[pick("'","`")]sma!") usr.whisper("[input]") + + input = sanitize(input) for(var/datum/mind/H in cult.current_antagonists) if (H.current) H.current << "\red \b [input]" - del(src) + qdel(src) return 1 /////////////////////////////////////////FIFTEENTH RUNE @@ -657,6 +668,7 @@ var/list/sacrificed = list() usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." else if(prob(40)) + usr << "\red The Geometer of blood accepts this sacrifice." cult.grant_runeword(usr) else @@ -733,7 +745,7 @@ var/list/sacrificed = list() usr.say("Nikt[pick("'","`")]o barada kla'atu!") for (var/mob/V in viewers(src)) V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3) - del(src) + qdel(src) return if(istype(W,/obj/item/weapon/paper/talisman)) usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") @@ -806,7 +818,7 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in users) user.take_overall_damage(dam, 0) C.say("Khari[pick("'","`")]d! Gual'te nikka!") - del(src) + qdel(src) return fizzle() /////////////////////////////////////////NINETEENTH RUNE @@ -846,14 +858,14 @@ var/list/sacrificed = list() user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \ "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ "\red You hear a pop and smell ozone.") - del(src) + qdel(src) return fizzle() /////////////////////////////////////////TWENTIETH RUNES deafen() if(istype(src,/obj/effect/rune)) - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in range(7,src)) if (iscultist(C)) continue @@ -862,17 +874,18 @@ var/list/sacrificed = list() continue C.ear_deaf += 50 C.show_message("\red The world around you suddenly becomes quiet.", 3) - affected++ + affected += C if(prob(1)) C.sdisabilities |= DEAF - if(affected) + if(affected.len) usr.say("Sti[pick("'","`")] kaliedir!") usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust." - del(src) + admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on") + qdel(src) else return fizzle() else - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in range(7,usr)) if (iscultist(C)) continue @@ -882,10 +895,11 @@ var/list/sacrificed = list() C.ear_deaf += 30 //talismans is weaker. C.show_message("\red The world around you suddenly becomes quiet.", 3) - affected++ - if(affected) + affected += C + if(affected.len) usr.whisper("Sti[pick("'","`")] kaliedir!") usr << "\red Your talisman turns into gray dust, deafening everyone around." + admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on") for (var/mob/V in orange(1,src)) if(!(iscultist(V))) V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) @@ -893,7 +907,7 @@ var/list/sacrificed = list() blind() if(istype(src,/obj/effect/rune)) - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in viewers(src)) if (iscultist(C)) continue @@ -907,15 +921,16 @@ var/list/sacrificed = list() if(prob(10)) C.sdisabilities |= BLIND C.show_message("\red Suddenly you see red flash that blinds you.", 3) - affected++ - if(affected) + affected += C + if(affected.len) usr.say("Sti[pick("'","`")] kaliesin!") usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust." - del(src) + admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on") + qdel(src) else return fizzle() else - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in view(2,usr)) if (iscultist(C)) continue @@ -925,11 +940,12 @@ var/list/sacrificed = list() C.eye_blurry += 30 C.eye_blind += 10 //talismans is weaker. - affected++ + affected += C C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) - if(affected) + if(affected.len) usr.whisper("Sti[pick("'","`")] kaliesin!") usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie." + admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on") return @@ -940,12 +956,13 @@ var/list/sacrificed = list() if (istype(H.current,/mob/living/carbon)) cultists+=H.current */ - var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood. + var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood. + var/list/victims = new // var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood. for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) - culcount++ - if(culcount>=3) + cultists+=C + if(cultists.len>=3) for(var/mob/living/carbon/M in viewers(usr)) if(iscultist(M)) continue @@ -954,6 +971,7 @@ var/list/sacrificed = list() continue M.take_overall_damage(51,51) M << "\red Your blood boils!" + victims += M if(prob(5)) spawn(5) M.gib() @@ -964,7 +982,9 @@ var/list/sacrificed = list() if(iscultist(C) && !C.stat) C.say("Dedo ol[pick("'","`")]btoh!") C.take_overall_damage(15, 0) - del(src) + admin_attacker_log_many_victims(usr, victims, "Used a blood boil rune.", "Was the victim of a blood boil rune.", "used a blood boil rune on") + log_and_message_admins_many(cultists - usr, "assisted activating a blood boil rune.") + qdel(src) else return fizzle() return @@ -994,8 +1014,8 @@ var/list/sacrificed = list() M << "\red Blood suddenly ignites, burning you!" var/turf/T = get_turf(B) T.hotspot_expose(700,125) - del(B) - del(src) + qdel(B) + qdel(src) ////////// Rune 24 (counting burningblood, which kinda doesnt work yet.) @@ -1003,7 +1023,6 @@ var/list/sacrificed = list() if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around. usr.say("Fuu ma[pick("'","`")]jin!") for(var/mob/living/L in viewers(src)) - if(iscarbon(L)) var/mob/living/carbon/C = L flick("e_flash", C.flash) @@ -1012,12 +1031,14 @@ var/list/sacrificed = list() C.Weaken(1) C.Stun(1) C.show_message("\red The rune explodes in a bright flash.", 3) + admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") else if(issilicon(L)) var/mob/living/silicon/S = L S.Weaken(5) S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3) - del(src) + admin_attack_log(usr, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") + qdel(src) else ///When invoked as talisman, stun and mute the target mob. usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") var/obj/item/weapon/nullrod/N = locate() in T @@ -1030,7 +1051,7 @@ var/list/sacrificed = list() if(issilicon(T)) T.Weaken(15) - + admin_attack_log(usr, T, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") else if(iscarbon(T)) var/mob/living/carbon/C = T flick("e_flash", C.flash) @@ -1038,6 +1059,7 @@ var/list/sacrificed = list() C.silent += 15 C.Weaken(25) C.Stun(25) + admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") return /////////////////////////////////////////TWENTY-FIFTH RUNE @@ -1059,5 +1081,5 @@ var/list/sacrificed = list() //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor - del(src) + qdel(src) return diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 0f5ab245d1..d2b881d891 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -35,7 +35,7 @@ user.take_organ_damage(5, 0) if(src && src.imbue!="supply" && src.imbue!="runestun") if(delete) - del(src) + qdel(src) return else user << "You see strange symbols on the paper. Are they supposed to mean something?" @@ -47,7 +47,7 @@ if(imbue == "runestun") user.take_organ_damage(5, 0) call(/obj/effect/rune/proc/runestun)(T) - del(src) + qdel(src) else ..() ///If its some other talisman, use the generic attack code, is this supposed to work this way? else @@ -56,7 +56,7 @@ proc/supply(var/key) if (!src.uses) - del(src) + qdel(src) return var/dat = "There are [src.uses] bloody runes on the parchment.
    " @@ -106,7 +106,7 @@ if("soulstone") new /obj/item/device/soulstone(get_turf(usr)) if("construct") - new /obj/structure/constructshell(get_turf(usr)) + new /obj/structure/constructshell/cult(get_turf(usr)) src.uses-- supply() return diff --git a/code/game/gamemodes/endgame/endgame.dm b/code/game/gamemodes/endgame/endgame.dm new file mode 100644 index 0000000000..ed1167dfe7 --- /dev/null +++ b/code/game/gamemodes/endgame/endgame.dm @@ -0,0 +1,68 @@ +/********************** + * ENDGAME STUFF + **********************/ + + // Universal State + // Handles stuff like space icon_state, constants, etc. + // Essentially a policy manager. Once shit hits the fan, this changes its policies. + // Called by master controller. + + // Default shit. +/datum/universal_state + // Just for reference, for now. + // Might eventually add an observatory job. + var/name = "Normal" + var/desc = "Nothing seems awry." + + // Sets world.turf, replaces all turfs of type /turf/space. + var/space_type = /turf/space + + // Replaces all turfs of type /turf/space/transit + var/transit_space_type = /turf/space/transit + + // Chance of a floor or wall getting damaged [0-100] + // Simulates stuff getting broken due to molecular bonds decaying. + var/decay_rate = 0 + +// Actually decay the turf. +/datum/universal_state/proc/DecayTurf(var/turf/T) + if(istype(T,/turf/simulated/wall)) + var/turf/simulated/wall/W=T + W.melt() + return + if(istype(T,/turf/simulated/floor)) + var/turf/simulated/floor/F=T + // Burnt? + if(!F.burnt) + F.burn_tile() + else + F.ReplaceWithLattice() + return + +// Return 0 to cause shuttle call to fail. +/datum/universal_state/proc/OnShuttleCall(var/mob/user) + return 1 + +// Processed per tick +/datum/universal_state/proc/OnTurfTick(var/turf/T) + if(decay_rate && prob(decay_rate)) + DecayTurf(T) + +// Apply changes when exiting state +/datum/universal_state/proc/OnExit() + // Does nothing by default + +// Apply changes when entering state +/datum/universal_state/proc/OnEnter() + // Does nothing by default + +// Apply changes to a new turf. +/datum/universal_state/proc/OnTurfChange(var/turf/NT) + return + +/proc/SetUniversalState(var/newstate,var/on_exit=1, var/on_enter=1) + if(on_exit) + universe.OnExit() + universe = new newstate + if(on_enter) + universe.OnEnter() diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm new file mode 100644 index 0000000000..305205c6a0 --- /dev/null +++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm @@ -0,0 +1,118 @@ +// QUALITY COPYPASTA +/turf/unsimulated/wall/supermatter + name = "Bluespace" + desc = "THE END IS right now actually." + + icon = 'icons/turf/space.dmi' + icon_state = "bluespace" + + //luminosity = 5 + //l_color="#0066FF" + layer = LIGHTING_LAYER+1 + + var/spawned=0 // DIR mask + var/next_check=0 + var/list/avail_dirs = list(NORTH,SOUTH,EAST,WEST) + +/turf/unsimulated/wall/supermatter/New() + ..() + processing_turfs.Add(src) + next_check = world.time+5 SECONDS + +/turf/unsimulated/wall/supermatter/Destroy() + processing_turfs.Remove(src) + ..() + +/turf/unsimulated/wall/supermatter/proc/process() + // Only check infrequently. + if(next_check>world.time) return + + // No more available directions? Shut down process(). + if(avail_dirs.len==0) + processing_objects.Remove(src) + return 1 + + // We're checking, reset the timer. + next_check = world.time+5 SECONDS + + // Choose a direction. + var/pdir = pick(avail_dirs) + avail_dirs -= pdir + var/turf/T=get_step(src,pdir) + + // EXPAND + if(!istype(T,type)) + // Do pretty fadeout animation for 1s. + new /obj/effect/overlay/bluespacify(T) + spawn(10) + // Nom. + for(var/atom/movable/A in T) + if(A) + if(istype(A,/mob/living)) + qdel(A) + continue + else if(istype(A,/mob)) // Observers, AI cameras. + continue + qdel(A) + T.ChangeTurf(type) + + if((spawned & (NORTH|SOUTH|EAST|WEST)) == (NORTH|SOUTH|EAST|WEST)) + processing_turfs -= src + return + +/turf/unsimulated/wall/supermatter/attack_generic(mob/user as mob) + return attack_hand(user) + +/turf/unsimulated/wall/supermatter/attack_robot(mob/user as mob) + if(Adjacent(user)) + return attack_hand(user) + else + user << "What the fuck are you doing?" + return + +// /vg/: Don't let ghosts fuck with this. +/turf/unsimulated/wall/supermatter/attack_ghost(mob/user as mob) + user.examinate(src) + +/turf/unsimulated/wall/supermatter/attack_ai(mob/user as mob) + return user.examinate(src) + +/turf/unsimulated/wall/supermatter/attack_hand(mob/user as mob) + user.visible_message("\The [user] reaches out and touches \the [src]... And then blinks out of existance.",\ + "You reach out and touch \the [src]. Everything immediately goes quiet. Your last thought is \"That was not a wise decision.\"",\ + "You hear an unearthly noise.") + + playsound(src, 'sound/effects/supermatter.ogg', 50, 1) + + Consume(user) + +/turf/unsimulated/wall/supermatter/attackby(obj/item/weapon/W as obj, mob/living/user as mob) + user.visible_message("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\ + "You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ + "Everything suddenly goes silent.") + + playsound(src, 'sound/effects/supermatter.ogg', 50, 1) + + user.drop_from_inventory(W) + Consume(W) + + +/turf/unsimulated/wall/supermatter/Bumped(atom/AM as mob|obj) + if(istype(AM, /mob/living)) + AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ + "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ + "You hear an unearthly noise as a wave of heat washes over you.") + else + AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.",\ + "You hear a loud crack as you are washed with a wave of heat.") + + playsound(src, 'sound/effects/supermatter.ogg', 50, 1) + + Consume(AM) + + +/turf/unsimulated/wall/supermatter/proc/Consume(var/mob/living/user) + if(istype(user,/mob/dead/observer)) + return + + qdel(user) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm new file mode 100644 index 0000000000..62c8b1aa44 --- /dev/null +++ b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm @@ -0,0 +1,81 @@ +/*** EXIT PORTAL ***/ + +/obj/singularity/narsie/large/exit + name = "Bluespace Rift" + desc = "NO TIME TO EXPLAIN, JUMP IN" + icon = 'icons/obj/rift.dmi' + icon_state = "rift" + + move_self = 0 + announce=0 + narnar=0 + + layer=LIGHTING_LAYER+2 // ITS SO BRIGHT + + consume_range = 6 + +/obj/singularity/narsie/large/exit/New() + ..() + processing_objects.Add(src) + +/obj/singularity/narsie/large/exit/update_icon() + overlays = 0 + +/obj/singularity/narsie/large/exit/process() + for(var/mob/M in player_list) + if(M.client) + M.see_rift(src) + eat() + +/obj/singularity/narsie/large/exit/acquire(var/mob/food) + return + +/obj/singularity/narsie/large/exit/consume(const/atom/A) + if(!(A.singuloCanEat())) + return 0 + + if (istype(A, /mob/living/)) + do_teleport(A, pick(endgame_safespawns)) //dead-on precision + else if (isturf(A)) + var/turf/T = A + var/dist = get_dist(T, src) + if (dist <= consume_range && T.density) + T.density = 0 + + for (var/atom/movable/AM in T.contents) + if (AM == src) // This is the snowflake. + continue + + if (dist <= consume_range) + consume(AM) + continue + + if (dist > consume_range) + if (101 == AM.invisibility) + continue + + spawn (0) + AM.singularity_pull(src, src.current_size) + + +/mob + //thou shall always be able to see the rift + var/image/riftimage = null + +/mob/proc/see_rift(var/obj/singularity/narsie/large/exit/R) + if((R.z == src.z) && (get_dist(R,src) <= (R.consume_range+10)) && !(R in view(src))) + if(!riftimage) + riftimage = image('icons/obj/rift.dmi',src.loc,"rift",LIGHTING_LAYER+2,1) + riftimage.mouse_opacity = 0 + + var/new_x = 32 * (R.x - src.x) + R.pixel_x + var/new_y = 32 * (R.y - src.y) + R.pixel_y + riftimage.pixel_x = new_x + riftimage.pixel_y = new_y + riftimage.loc = src.loc + + src << riftimage + + else + if(riftimage) + qdel(riftimage) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm new file mode 100644 index 0000000000..23729763a5 --- /dev/null +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -0,0 +1,141 @@ + +/datum/universal_state/supermatter_cascade + name = "Supermatter Cascade" + desc = "Unknown harmonance affecting universal substructure, converting nearby matter to supermatter." + + decay_rate = 5 // 5% chance of a turf decaying on lighting update/airflow (there's no actual tick for turfs) + +/datum/universal_state/supermatter_cascade/OnShuttleCall(var/mob/user) + if(user) + user << "All you hear on the frequency is static and panicked screaming. There will be no shuttle call today." + return 0 + +/datum/universal_state/supermatter_cascade/OnTurfChange(var/turf/T) + var/turf/space/spess = T + if(istype(spess)) + spess.overlays += "end01" + +/datum/universal_state/supermatter_cascade/DecayTurf(var/turf/T) + if(istype(T,/turf/simulated/wall)) + var/turf/simulated/wall/W=T + W.melt() + return + if(istype(T,/turf/simulated/floor)) + var/turf/simulated/floor/F=T + // Burnt? + if(!F.burnt) + F.burn_tile() + else + if(!istype(F,/turf/simulated/floor/plating)) + F.break_tile_to_plating() + return + +// Apply changes when entering state +/datum/universal_state/supermatter_cascade/OnEnter() + set background = 1 + garbage_collector.garbage_collect = 0 + world << "You are blinded by a brilliant flash of energy." + + world << sound('sound/effects/cascade.ogg') + + for(var/mob/M in player_list) + flick("e_flash", M.flash) + + if(emergency_shuttle.can_recall()) + priority_announcement.Announce("The emergency shuttle has returned due to bluespace distortion.") + emergency_shuttle.recall() + + AreaSet() + OverlaySet() + MiscSet() + APCSet() + AmbientSet() + + // Disable Nar-Sie. + cult.allow_narsie = 0 + PlayerSet() + + new /obj/singularity/narsie/large/exit(pick(endgame_exits)) + spawn(rand(30,60) SECONDS) + var/txt = {" +There's been a galaxy-wide electromagnetic pulse. All of our systems are heavily damaged and many personnel are dead or dying. We are seeing increasing indications of the universe itself beginning to unravel. + +[station_name()], you are the only facility nearby a bluespace rift, which is near your research outpost. You are hereby directed to enter the rift using all means necessary, quite possibly as the last of your species alive. + +You have five minutes before the universe collapses. Good l\[\[###!!!- + +AUTOMATED ALERT: Link to [command_name()] lost."} + priority_announcement.Announce(txt,"SUPERMATTER CASCADE DETECTED") + sleep(5 MINUTES) + ticker.declare_completion() + ticker.station_explosion_cinematic(0,null) // TODO: Custom cinematic + + world << "Resetting in 30 seconds!" + + feedback_set_details("end_error","Universe ended") + + if(blackbox) + blackbox.save_all_data_to_sql() + + sleep(300) + log_game("Rebooting due to universal collapse") + world.Reboot() + return + +/datum/universal_state/supermatter_cascade/proc/AreaSet() + for(var/area/ca in world) + var/area/A=ca.master + if(A.z in config.admin_levels) + continue + if(!istype(A,/area) || istype(A,/area/space)) + continue + + // Reset all alarms. + A.fire = null + A.atmos = 1 + A.atmosalm = 0 + A.poweralm = 1 + + // Slap on random alerts + if(prob(25)) + switch(rand(1,4)) + if(1) + A.fire=1 + if(2) + A.atmosalm=1 + + A.updateicon() + +/datum/universal_state/supermatter_cascade/proc/OverlaySet() + for(var/turf/space/spess in world) + spess.overlays += "end01" + +/datum/universal_state/supermatter_cascade/proc/AmbientSet() + for(var/turf/T in world) + if(istype(T, /turf/space)) continue + if(!(T.z in config.admin_levels)) + T.update_lumcount(1, 160, 255, 0, 0) + +/datum/universal_state/supermatter_cascade/proc/MiscSet() + for (var/obj/machinery/firealarm/alm in world) + if (!(alm.stat & BROKEN)) + alm.ex_act(2) + +/datum/universal_state/supermatter_cascade/proc/APCSet() + for (var/obj/machinery/power/apc/APC in world) + if (!(APC.stat & BROKEN)) + APC.chargemode = 0 + if(APC.cell) + APC.cell.charge = 0 + APC.emagged = 1 + APC.queue_icon_update() + +/datum/universal_state/supermatter_cascade/proc/PlayerSet() + for(var/datum/mind/M in player_list) + if(!istype(M.current,/mob/living)) + continue + if(M.current.stat!=2) + M.current.Weaken(10) + flick("e_flash", M.current.flash) + + clear_antag_roles(M) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index feed6092e2..d49247263f 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -49,7 +49,7 @@ var/turf/T = pick(blobstart) var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 ) spawn(rand(50, 300)) - del(bh) + qdel(bh) /* if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert") @@ -71,7 +71,7 @@ P.icon_state = "anom" P.name = "wormhole" spawn(rand(300,600)) - del(P) + qdel(P) */ if(3) if((world.time/10)>=3600 && config.ninjas_allowed && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round. diff --git a/code/game/gamemodes/events/PortalStorm.dm b/code/game/gamemodes/events/PortalStorm.dm index 890755d6b8..6144f3305b 100644 --- a/code/game/gamemodes/events/PortalStorm.dm +++ b/code/game/gamemodes/events/PortalStorm.dm @@ -1,26 +1,26 @@ -/datum/event/portalstorm - - Announce() - command_alert("Subspace disruption detected around the vessel", "Anomaly Alert") - LongTerm() - - var/list/turfs = list( ) - var/turf/picked - - for(var/turf/T in world) - if(T.z < 5 && istype(T,/turf/simulated/floor)) - turfs += T - - for(var/turf/T in world) - if(prob(10) && T.z < 5 && istype(T,/turf/simulated/floor)) - spawn(50+rand(0,3000)) - picked = pick(turfs) - var/obj/portal/P = new /obj/portal( T ) - P.target = picked - P.creator = null - P.icon = 'icons/obj/objects.dmi' - P.failchance = 0 - P.icon_state = "anom" - P.name = "wormhole" - spawn(rand(100,150)) - del(P) \ No newline at end of file +/datum/event/portalstorm + + Announce() + command_alert("Subspace disruption detected around the vessel", "Anomaly Alert") + LongTerm() + + var/list/turfs = list( ) + var/turf/picked + + for(var/turf/T in world) + if(T.z < 5 && istype(T,/turf/simulated/floor)) + turfs += T + + for(var/turf/T in world) + if(prob(10) && T.z < 5 && istype(T,/turf/simulated/floor)) + spawn(50+rand(0,3000)) + picked = pick(turfs) + var/obj/portal/P = new /obj/portal( T ) + P.target = picked + P.creator = null + P.icon = 'icons/obj/objects.dmi' + P.failchance = 0 + P.icon_state = "anom" + P.name = "wormhole" + spawn(rand(100,150)) + qdel(P) diff --git a/code/game/gamemodes/events/black_hole.dm b/code/game/gamemodes/events/black_hole.dm index 6ff7babbeb..60ab8a692f 100644 --- a/code/game/gamemodes/events/black_hole.dm +++ b/code/game/gamemodes/events/black_hole.dm @@ -1,88 +1,88 @@ -/obj/effect/bhole - name = "black hole" - icon = 'icons/obj/objects.dmi' - desc = "FUCK FUCK FUCK AAAHHH" - icon_state = "bhole3" - opacity = 1 - unacidable = 1 - density = 0 - anchored = 1 - -/obj/effect/bhole/New() - spawn(4) - controller() - -/obj/effect/bhole/proc/controller() - while(src) - - if(!isturf(loc)) - del(src) - return - - //DESTROYING STUFF AT THE EPICENTER - for(var/mob/living/M in orange(1,src)) - del(M) - for(var/obj/O in orange(1,src)) - del(O) - for(var/turf/simulated/ST in orange(1,src)) - ST.ChangeTurf(/turf/space) - - sleep(6) - grav(10, 4, 10, 0 ) - sleep(6) - grav( 8, 4, 10, 0 ) - sleep(6) - grav( 9, 4, 10, 0 ) - sleep(6) - grav( 7, 3, 40, 1 ) - sleep(6) - grav( 5, 3, 40, 1 ) - sleep(6) - grav( 6, 3, 40, 1 ) - sleep(6) - grav( 4, 2, 50, 6 ) - sleep(6) - grav( 3, 2, 50, 6 ) - sleep(6) - grav( 2, 2, 75,25 ) - sleep(6) - - - - //MOVEMENT - if( prob(50) ) - src.anchored = 0 - step(src,pick(alldirs)) - src.anchored = 1 - -/obj/effect/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance) - if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen - del(src) - return - for(var/t = -r, t < r, t++) - affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) - affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) - return - -/obj/effect/bhole/proc/affect_coord(var/x, var/y, var/ex_act_force, var/pull_chance, var/turf_removal_chance) - //Get turf at coordinate - var/turf/T = locate(x, y, z) - if(isnull(T)) return - - //Pulling and/or ex_act-ing movable atoms in that turf - if( prob(pull_chance) ) - for(var/obj/O in T.contents) - if(O.anchored) - O.ex_act(ex_act_force) - else - step_towards(O,src) - for(var/mob/living/M in T.contents) - step_towards(M,src) - - //Destroying the turf - if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) ) - var/turf/simulated/ST = T - ST.ChangeTurf(/turf/space) +/obj/effect/bhole + name = "black hole" + icon = 'icons/obj/objects.dmi' + desc = "FUCK FUCK FUCK AAAHHH" + icon_state = "bhole3" + opacity = 1 + unacidable = 1 + density = 0 + anchored = 1 + +/obj/effect/bhole/New() + spawn(4) + controller() + +/obj/effect/bhole/proc/controller() + while(src) + + if(!isturf(loc)) + qdel(src) + return + + //DESTROYING STUFF AT THE EPICENTER + for(var/mob/living/M in orange(1,src)) + qdel(M) + for(var/obj/O in orange(1,src)) + qdel(O) + for(var/turf/simulated/ST in orange(1,src)) + ST.ChangeTurf(/turf/space) + + sleep(6) + grav(10, 4, 10, 0 ) + sleep(6) + grav( 8, 4, 10, 0 ) + sleep(6) + grav( 9, 4, 10, 0 ) + sleep(6) + grav( 7, 3, 40, 1 ) + sleep(6) + grav( 5, 3, 40, 1 ) + sleep(6) + grav( 6, 3, 40, 1 ) + sleep(6) + grav( 4, 2, 50, 6 ) + sleep(6) + grav( 3, 2, 50, 6 ) + sleep(6) + grav( 2, 2, 75,25 ) + sleep(6) + + + + //MOVEMENT + if( prob(50) ) + src.anchored = 0 + step(src,pick(alldirs)) + src.anchored = 1 + +/obj/effect/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance) + if(!isturf(loc)) //blackhole cannot be contained inside anything. Weird stuff might happen + qdel(src) + return + for(var/t = -r, t < r, t++) + affect_coord(x+t, y-r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-t, y+r, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x+r, y+t, ex_act_force, pull_chance, turf_removal_chance) + affect_coord(x-r, y-t, ex_act_force, pull_chance, turf_removal_chance) + return + +/obj/effect/bhole/proc/affect_coord(var/x, var/y, var/ex_act_force, var/pull_chance, var/turf_removal_chance) + //Get turf at coordinate + var/turf/T = locate(x, y, z) + if(isnull(T)) return + + //Pulling and/or ex_act-ing movable atoms in that turf + if( prob(pull_chance) ) + for(var/obj/O in T.contents) + if(O.anchored) + O.ex_act(ex_act_force) + else + step_towards(O,src) + for(var/mob/living/M in T.contents) + step_towards(M,src) + + //Destroying the turf + if( T && istype(T,/turf/simulated) && prob(turf_removal_chance) ) + var/turf/simulated/ST = T + ST.ChangeTurf(/turf/space) return \ No newline at end of file diff --git a/code/game/gamemodes/events/clang.dm b/code/game/gamemodes/events/clang.dm index 7f4f6f7020..74fb9ee507 100644 --- a/code/game/gamemodes/events/clang.dm +++ b/code/game/gamemodes/events/clang.dm @@ -36,7 +36,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(clong.density || prob(10)) clong.meteorhit(src) else - del(src) + qdel(src) if(clong && prob(25)) src.loc = clong.loc @@ -81,7 +81,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if (isNotStationLevel(immrod.z)) immrod.z = pick(config.station_levels) if(immrod.loc == end) - del(immrod) + qdel(immrod) sleep(10) for(var/obj/effect/immovablerod/imm in world) return diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 2e8b3b1328..4e064d8be6 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -37,7 +37,7 @@ The "dust" will damage the hull of the station causin minor hull breaches. density = 1 anchored = 1 var/strength = 2 //ex_act severity number - var/life = 2 //how many things we hit before del(src) + var/life = 2 //how many things we hit before qdel(src) weak strength = 3 @@ -107,8 +107,7 @@ The "dust" will damage the hull of the station causin minor hull breaches. life-- if(life <= 0) walk(src,0) - spawn(1) - del(src) + qdel(src) return 0 return @@ -119,5 +118,5 @@ The "dust" will damage the hull of the station causin minor hull breaches. ex_act(severity) - del(src) + qdel(src) return diff --git a/code/game/gamemodes/events/holidays/Christmas.dm b/code/game/gamemodes/events/holidays/Christmas.dm index 7ca6678902..9c68ab879e 100644 --- a/code/game/gamemodes/events/holidays/Christmas.dm +++ b/code/game/gamemodes/events/holidays/Christmas.dm @@ -14,7 +14,7 @@ evil_tree.icon_living = evil_tree.icon_state evil_tree.icon_dead = evil_tree.icon_state evil_tree.icon_gib = evil_tree.icon_state - del(xmas) + qdel(xmas) /obj/item/weapon/toy/xmas_cracker name = "xmas cracker" diff --git a/code/game/gamemodes/events/wormholes.dm b/code/game/gamemodes/events/wormholes.dm index 9a8066887b..a7830a2cb3 100644 --- a/code/game/gamemodes/events/wormholes.dm +++ b/code/game/gamemodes/events/wormholes.dm @@ -59,4 +59,4 @@ P.icon_state = "anom" P.name = "wormhole" spawn(rand(300,600)) - del(P) \ No newline at end of file + qdel(P) \ No newline at end of file diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 8ad65194d1..41183aeffa 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -1,11 +1,5 @@ var/global/datum/controller/gameticker/ticker -#define GAME_STATE_PREGAME 1 -#define GAME_STATE_SETTING_UP 2 -#define GAME_STATE_PLAYING 3 -#define GAME_STATE_FINISHED 4 - - /datum/controller/gameticker var/const/restart_timeout = 600 var/current_state = GAME_STATE_PREGAME @@ -135,7 +129,7 @@ var/global/datum/controller/gameticker/ticker for(var/obj/effect/landmark/start/S in landmarks_list) //Deleting Startpoints but we need the ai point to AI-ize people later if (S.name != "AI") - del(S) + qdel(S) world << "Enjoy the game!" world << sound('sound/AI/welcome.ogg') // Skie //Holiday Round-start stuff ~Carn @@ -265,8 +259,8 @@ var/global/datum/controller/gameticker/ticker //Otherwise if its a verb it will continue on afterwards. sleep(300) - if(cinematic) del(cinematic) //end the cinematic - if(temp_buckle) del(temp_buckle) //release everybody + if(cinematic) qdel(cinematic) //end the cinematic + if(temp_buckle) qdel(temp_buckle) //release everybody return @@ -280,7 +274,7 @@ var/global/datum/controller/gameticker/ticker continue else player.create_character() - del(player) + qdel(player) proc/collect_minds() @@ -424,7 +418,7 @@ var/global/datum/controller/gameticker/ticker robo.laws.show_laws(world) if(dronecount) - world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round." + world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round." mode.declare_completion()//To declare normal completion. diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index f1de61f286..7e1ba6d368 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -26,6 +26,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' var/area/skipjack = locate(/area/shuttle/skipjack/station) for (var/mob/living/M in skipjack.contents) //maybe send the player a message that they've gone home/been kidnapped? Someone responsible for vox lore should write that. - del(M) + qdel(M) for (var/obj/O in skipjack.contents) - del(O) //no hiding in lockers or anything \ No newline at end of file + qdel(O) //no hiding in lockers or anything \ No newline at end of file diff --git a/code/game/gamemodes/meme/meme.dm b/code/game/gamemodes/meme/meme.dm index 2629b36013..2aa512264d 100644 --- a/code/game/gamemodes/meme/meme.dm +++ b/code/game/gamemodes/meme/meme.dm @@ -93,7 +93,7 @@ M.enter_host(first_host.current) forge_meme_objectives(meme, first_host) - del original + qdel(original) log_admin("Created [memes.len] memes.") diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 1edb533daa..9d18216aa5 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -97,6 +97,10 @@ pass_flags = PASSTABLE | PASSGRILLE power = 2 +/obj/effect/meteor/Destroy() + walk(src,0) //this cancels the walk_towards() proc + ..() + /obj/effect/meteor/Bump(atom/A) spawn(0) @@ -111,14 +115,14 @@ !istype(A,/obj/machinery/field_generator) && \ prob(detonation_chance)) explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0) - del(src) + qdel(src) return /obj/effect/meteor/ex_act(severity) if (severity < 4) - del(src) + qdel(src) return /obj/effect/meteor/big @@ -136,7 +140,7 @@ if(!istype(A,/obj/machinery/power/emitter) && \ !istype(A,/obj/machinery/field_generator)) if(--src.hits <= 0) - del(src) //Dont blow up singularity containment if we get stuck there. + qdel(src) //Dont blow up singularity containment if we get stuck there. if (A) for(var/mob/M in player_list) @@ -150,11 +154,11 @@ if (--src.hits <= 0) if(prob(detonation_chance) && !istype(A, /obj/structure/grille)) explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0) - del(src) + qdel(src) return /obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pickaxe)) - del(src) + qdel(src) return - ..() \ No newline at end of file + ..() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index d26f1a0789..7b6b1dc952 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -48,6 +48,9 @@ if(bomb.timing) user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]" +/obj/item/weapon/pinpointer/Destroy() + active = 0 + ..() /obj/item/weapon/pinpointer/advpinpointer name = "Advanced Pinpointer" diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 27236dd8fb..076c0afbf3 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -13,7 +13,7 @@ datum/objective if(text) explanation_text = text - Del() + Destroy() all_objectives -= src ..() @@ -541,7 +541,7 @@ datum/objective/steal if (!custom_target) return var/tmp_obj = new custom_target var/custom_name = tmp_obj:name - del(tmp_obj) + qdel(tmp_obj) custom_name = sanitize(input("Enter target name:", "Objective target", custom_name) as text|null) if (!custom_name) return target_name = custom_name @@ -916,7 +916,7 @@ datum/objective/heist/salvage explanation_text = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it. The convert rune is join blood self." /datum/objective/cult/eldergod/check_completion() - return (locate(/obj/machinery/singularity/narsie/large) in machines) + return (locate(/obj/singularity/narsie/large) in machines) /datum/objective/cult/sacrifice explanation_text = "Conduct a ritual sacrifice for the glory of Nar-Sie." diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 439befdc63..ad2abb2236 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -120,7 +120,7 @@ datum/hSB if("hsbtoolbox") var/obj/item/weapon/storage/hsb = new/obj/item/weapon/storage/toolbox/mechanical for(var/obj/item/device/radio/T in hsb) - del(T) + qdel(T) new/obj/item/weapon/crowbar (hsb) hsb.loc = usr.loc if("hsbmedkit") diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 501335a19f..2981596645 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -151,7 +151,7 @@ var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) M.real_name = "Corpse" M.death() - del(A) + qdel(A) continue if (A.name == "Corpse-Engineer") var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) @@ -173,7 +173,7 @@ else if (prob(50)) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/welding(M), slot_head) - del(A) + qdel(A) continue if (A.name == "Corpse-Engineer-Space") var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) @@ -196,7 +196,7 @@ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/welding(M), slot_head) else M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head) - del(A) + qdel(A) continue if (A.name == "Corpse-Engineer-Chief") var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) @@ -217,7 +217,7 @@ else if (prob(50)) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/welding(M), slot_head) - del(A) + qdel(A) continue if (A.name == "Corpse-Syndicate") var/mob/living/carbon/human/M = new /mob/living/carbon/human(A.loc) @@ -239,6 +239,6 @@ else M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(M), slot_head) - del(A) + qdel(A) continue */ diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index da346f9fce..4d16b7ae14 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -10,7 +10,7 @@ /var/const/access_tox_storage = 8 /var/const/access_genetics = 9 /var/const/access_engine = 10 -/var/const/access_engine_equip= 11 +/var/const/access_engine_equip = 11 /var/const/access_maint_tunnels = 12 /var/const/access_external_airlocks = 13 /var/const/access_emergency_storage = 14 diff --git a/code/game/jobs/jobprocs.dm b/code/game/jobs/jobprocs.dm index 60b8c6a99d..2a012872bf 100644 --- a/code/game/jobs/jobprocs.dm +++ b/code/game/jobs/jobprocs.dm @@ -44,7 +44,7 @@ timeleft -= (world.time - last_process) if(timeleft <= 0) processing_objects.Remove(src) - del(src) + qdel(src) /////////////////////////////// diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 37cc168d57..19399ce739 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -1,55 +1,55 @@ -/obj/machinery/bluespace_beacon - - icon = 'icons/obj/objects.dmi' - icon_state = "floor_beaconf" - name = "Bluespace Gigabeacon" - desc = "A device that draws power from bluespace and creates a permanent tracking beacon." - level = 1 // underfloor - layer = 2.5 - anchored = 1 - use_power = 1 - idle_power_usage = 0 - var/obj/item/device/radio/beacon/Beacon - - New() - ..() - var/turf/T = loc - Beacon = new /obj/item/device/radio/beacon - Beacon.invisibility = INVISIBILITY_MAXIMUM - Beacon.loc = T - - hide(T.intact) - - Del() - if(Beacon) - del(Beacon) - ..() - - // update the invisibility and icon - hide(var/intact) - invisibility = intact ? 101 : 0 - updateicon() - - // update the icon_state - proc/updateicon() - var/state="floor_beacon" - - if(invisibility) - icon_state = "[state]f" - - else - icon_state = "[state]" - - process() - if(!Beacon) - var/turf/T = loc - Beacon = new /obj/item/device/radio/beacon - Beacon.invisibility = INVISIBILITY_MAXIMUM - Beacon.loc = T - if(Beacon) - if(Beacon.loc != loc) - Beacon.loc = loc - - updateicon() - - +/obj/machinery/bluespace_beacon + + icon = 'icons/obj/objects.dmi' + icon_state = "floor_beaconf" + name = "Bluespace Gigabeacon" + desc = "A device that draws power from bluespace and creates a permanent tracking beacon." + level = 1 // underfloor + layer = 2.5 + anchored = 1 + use_power = 1 + idle_power_usage = 0 + var/obj/item/device/radio/beacon/Beacon + + New() + ..() + var/turf/T = loc + Beacon = new /obj/item/device/radio/beacon + Beacon.invisibility = INVISIBILITY_MAXIMUM + Beacon.loc = T + + hide(T.intact) + + Destroy() + if(Beacon) + qdel(Beacon) + ..() + + // update the invisibility and icon + hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() + + // update the icon_state + proc/updateicon() + var/state="floor_beacon" + + if(invisibility) + icon_state = "[state]f" + + else + icon_state = "[state]" + + process() + if(!Beacon) + var/turf/T = loc + Beacon = new /obj/item/device/radio/beacon + Beacon.invisibility = INVISIBILITY_MAXIMUM + Beacon.loc = T + if(Beacon) + if(Beacon.loc != loc) + Beacon.loc = loc + + updateicon() + + diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm new file mode 100644 index 0000000000..9bad67df7d --- /dev/null +++ b/code/game/machinery/CableLayer.dm @@ -0,0 +1,126 @@ +/obj/machinery/cablelayer + name = "automatic cable layer" + + icon = 'icons/obj/stationobjs.dmi' + icon_state = "pipe_d" + density = 1 + var/obj/structure/cable/last_piece + var/obj/item/stack/cable_coil/cable + var/max_cable = 100 + var/on = 0 + +/obj/machinery/cablelayer/New() + cable = new(src) + cable.amount = 100 + ..() + +/obj/machinery/cablelayer/Move(new_turf,M_Dir) + ..() + layCable(new_turf,M_Dir) + +/obj/machinery/cablelayer/attack_hand(mob/user as mob) + if(!cable&&!on) + user << "\The [src] don't work with no cable." + return + on=!on + user.visible_message("\The [src] [!on?"dea":"a"]ctivated.", "[user] [!on?"dea":"a"]ctivated \the [src].") + return + +/obj/machinery/cablelayer/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, /obj/item/stack/cable_coil)) + + var/result = load_cable(O) + if(!result) + user << "Reel is full." + else + user << "[result] meters of cable successfully loaded." + return + + if(istype(O, /obj/item/weapon/screwdriver)) + if(cable && cable.amount) + var/m = round(input(usr,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) + m = min(m, cable.amount) + m = min(m, 30) + if(m) + use_cable(m) + var/obj/item/stack/cable_coil/CC = new (get_turf(src)) + CC.amount = m + else + usr << "There's no more cable on the reel." + +/obj/machinery/cablelayer/examine(mob/user) + ..() + user << "\The [src] has [cable.amount] meter\s." + +/obj/machinery/cablelayer/proc/load_cable(var/obj/item/stack/cable_coil/CC) + if(istype(CC) && CC.amount) + var/cur_amount = cable? cable.amount : 0 + var/to_load = max(max_cable - cur_amount,0) + if(to_load) + to_load = min(CC.amount, to_load) + if(!cable) + cable = new(src) + cable.amount = 0 + cable.amount += to_load + CC.use(to_load) + return to_load + else + return 0 + return + +/obj/machinery/cablelayer/proc/use_cable(amount) + if(!cable || cable.amount<1) + visible_message("Cable depleted, [src] deactivated.") + return +/* if(cable.amount < amount) + visible_message("No enough cable to finish the task.") + return*/ + cable.use(amount) + return 1 + +/obj/machinery/cablelayer/proc/reset() + last_piece = null + +/obj/machinery/cablelayer/proc/dismantleFloor(var/turf/new_turf) + if(istype(new_turf, /turf/simulated/floor)) + var/turf/simulated/floor/T = new_turf + if(!T.is_plating()) + if(!T.broken && !T.burnt) + new T.floor_type(T) + T.make_plating() + return !new_turf.intact + +/obj/machinery/cablelayer/proc/layCable(var/turf/new_turf,var/M_Dir) + if(!on) + return reset() + else + dismantleFloor(new_turf) + if(!istype(new_turf) || !dismantleFloor(new_turf)) + return reset() + var/fdirn = turn(M_Dir,180) + for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + return reset() + if(!use_cable(1)) + return reset() + var/obj/structure/cable/NC = new(new_turf) + NC.cableColor("red") + NC.d1 = 0 + NC.d2 = fdirn + NC.updateicon() + + var/datum/powernet/PN + if(last_piece && last_piece.d2 != M_Dir) + last_piece.d1 = min(last_piece.d2, M_Dir) + last_piece.d2 = max(last_piece.d2, M_Dir) + last_piece.updateicon() + PN = last_piece.powernet + + if(!PN) + PN = new() + PN.add_cable(NC) + NC.mergeConnectedNetworks(NC.d2) + + //NC.mergeConnectedNetworksOnTurf() + last_piece = NC + return 1 diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index b01b0bbda6..a03289c78b 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -28,12 +28,12 @@ switch(severity) if(1.0) //SN src = null - del(src) + qdel(src) return if(2.0) if (prob(50)) //SN src = null - del(src) + qdel(src) return if(3.0) if (prob(25)) @@ -43,14 +43,14 @@ /obj/machinery/optable/blob_act() if(prob(75)) - del(src) + qdel(src) /obj/machinery/optable/attack_hand(mob/user as mob) if (HULK in usr.mutations) usr << text("\blue You destroy the table.") visible_message("\red [usr] destroys the operating table!") src.density = 0 - del(src) + qdel(src) return /obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -105,6 +105,16 @@ else icon_state = "table2-idle" +/obj/machinery/optable/MouseDrop_T(mob/target, mob/user) + + var/mob/living/M = user + if(user.stat || user.restrained() || !check_table(user) || !iscarbon(target)) + return + if(istype(M)) + take_victim(target,user) + else + return ..() + /obj/machinery/optable/verb/climb_on() set name = "Climb On Table" set category = "Object" @@ -120,7 +130,7 @@ var/obj/item/weapon/grab/G = W if(iscarbon(G.affecting) && check_table(G.affecting)) take_victim(G.affecting,usr) - del(W) + qdel(W) return /obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 20c16dcb9c..0e92db1511 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -25,12 +25,12 @@ switch(severity) if(1.0) //SN src = null - del(src) + qdel(src) return if(2.0) if (prob(50)) //SN src = null - del(src) + qdel(src) return else return @@ -204,7 +204,7 @@ for(var/atom/movable/A as mob|obj in src) A.loc = src.loc A.blob_act() - del(src) + qdel(src) return attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) @@ -252,7 +252,7 @@ icon_state = "sleeper_1-r" src.add_fingerprint(user) - del(G) + qdel(G) return return @@ -265,21 +265,21 @@ for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(2.0) if(prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(3.0) if(prob(25)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return return emp_act(severity) @@ -435,7 +435,7 @@ icon_state = "sleeper_1-r" for(var/obj/O in src) - del(O) + qdel(O) src.add_fingerprint(usr) return return diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 51e1ec7510..8c6be59f71 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -56,7 +56,7 @@ src.icon_state = "body_scanner_1" for(var/obj/O in src) //O = null - del(O) + qdel(O) //Foreach goto(124) src.add_fingerprint(usr) return @@ -98,7 +98,7 @@ //Foreach goto(154) src.add_fingerprint(user) //G = null - del(G) + qdel(G) return /obj/machinery/bodyscanner/ex_act(severity) @@ -109,7 +109,7 @@ ex_act(severity) //Foreach goto(35) //SN src = null - del(src) + qdel(src) return if(2.0) if (prob(50)) @@ -118,7 +118,7 @@ ex_act(severity) //Foreach goto(108) //SN src = null - del(src) + qdel(src) return if(3.0) if (prob(25)) @@ -127,7 +127,7 @@ ex_act(severity) //Foreach goto(181) //SN src = null - del(src) + qdel(src) return else return @@ -136,19 +136,19 @@ if(prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc - del(src) + qdel(src) /obj/machinery/body_scanconsole/ex_act(severity) switch(severity) if(1.0) //SN src = null - del(src) + qdel(src) return if(2.0) if (prob(50)) //SN src = null - del(src) + qdel(src) return else return @@ -156,7 +156,7 @@ /obj/machinery/body_scanconsole/blob_act() if(prob(50)) - del(src) + qdel(src) /obj/machinery/body_scanconsole/power_change() ..() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 9e3e56f558..cd78789507 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -98,6 +98,10 @@ TLV["temperature"] = list(20, 40, 140, 160) // K target_temperature = 90 +/obj/machinery/alarm/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + ..() /obj/machinery/alarm/New(var/loc, var/dir, var/building = 0) ..() @@ -114,8 +118,6 @@ pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 update_icon() - if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() return first_run() @@ -469,14 +471,14 @@ ui_interact(user) wires.Interact(user) -/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/custom_state = null) +/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state) var/data[0] var/remote_connection = 0 var/remote_access = 0 - if(custom_state) - var/list/state = custom_state.href_list(user) - remote_connection = state["remote_connection"] // Remote connection means we're non-adjacent/connecting from another computer - remote_access = state["remote_access"] // Remote access means we also have the privilege to alter the air alarm. + if(state) + var/list/href = state.href_list(user) + remote_connection = href["remote_connection"] // Remote connection means we're non-adjacent/connecting from another computer + remote_access = href["remote_access"] // Remote access means we also have the privilege to alter the air alarm. data["locked"] = locked && !user.isSilicon() data["remote_connection"] = remote_connection @@ -491,7 +493,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "air_alarm.tmpl", src.name, 325, 625, master_ui = master_ui, custom_state = custom_state) + ui = new(user, src, ui_key, "air_alarm.tmpl", src.name, 325, 625, master_ui = master_ui, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -616,7 +618,7 @@ data["thresholds"] = thresholds -/obj/machinery/alarm/CanUseTopic(var/mob/user, href_list, var/datum/topic_state/custom_state) +/obj/machinery/alarm/CanUseTopic(var/mob/user, var/datum/topic_state/state, var/href_list = list()) if(buildstage != 2) return STATUS_CLOSE @@ -627,17 +629,15 @@ . = shorted ? STATUS_DISABLED : STATUS_INTERACTIVE if(. == STATUS_INTERACTIVE) - var/extra_href = custom_state.href_list(usr) - // Prevent remote users from altering RCON settings unless they already have access (I realize the risks) + var/extra_href = state.href_list(usr) + // Prevent remote users from altering RCON settings unless they already have access if(href_list["rcon"] && extra_href["remote_connection"] && !extra_href["remote_access"]) . = STATUS_UPDATE - //TODO: Move the rest of if(!locked || extra_href["remote_access"] || usr.isAI()) and hrefs here - return min(..(), .) -/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/custom_state) - if(..(href, href_list, nowindow, custom_state)) +/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state) + if(..(href, href_list, nowindow, state)) return 1 // hrefs that can always be called -walter0o @@ -666,7 +666,7 @@ return 1 // hrefs that need the AA unlocked -walter0o - var/extra_href = custom_state.href_list(usr) + var/extra_href = state.href_list(usr) if(!(locked && !extra_href["remote_connection"]) || extra_href["remote_access"] || usr.isSilicon()) if(href_list["command"]) var/device_id = href_list["id_tag"] @@ -833,7 +833,7 @@ if(0) if(istype(W, /obj/item/weapon/airalarm_electronics)) user << "You insert the circuit!" - del(W) + qdel(W) buildstage = 1 update_icon() return @@ -843,7 +843,7 @@ var/obj/item/alarm_frame/frame = new /obj/item/alarm_frame() frame.loc = user.loc playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - del(src) + qdel(src) return ..() @@ -886,7 +886,7 @@ Code shamelessly copied from apc_frame /obj/item/alarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 ) - del(src) + qdel(src) return ..() @@ -912,7 +912,7 @@ Code shamelessly copied from apc_frame return new /obj/machinery/alarm(loc, ndir, 1) - del(src) + qdel(src) /* FIRE ALARM @@ -1017,7 +1017,7 @@ FIRE ALARM if(0) if(istype(W, /obj/item/weapon/firealarm_electronics)) user << "You insert the circuit!" - del(W) + qdel(W) buildstage = 1 update_icon() @@ -1026,7 +1026,7 @@ FIRE ALARM var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame() frame.loc = user.loc playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - del(src) + qdel(src) return src.alarm() @@ -1208,7 +1208,7 @@ Code shamelessly copied from apc_frame /obj/item/firealarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 ) - del(src) + qdel(src) return ..() @@ -1235,7 +1235,7 @@ Code shamelessly copied from apc_frame new /obj/machinery/firealarm(loc, ndir, 1) - del(src) + qdel(src) /obj/machinery/partyalarm diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 3c032a6bce..09e55720a8 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -67,11 +67,10 @@ /obj/machinery/air_sensor/initialize() set_frequency(frequency) -/obj/machinery/air_sensor/New() - ..() - +obj/machinery/air_sensor/Destroy() if(radio_controller) - set_frequency(frequency) + radio_controller.remove_object(src,frequency) + ..() /obj/machinery/computer/general_air_control icon = 'icons/obj/computer.dmi' @@ -86,6 +85,11 @@ var/datum/radio_frequency/radio_connection circuit = /obj/item/weapon/circuitboard/air_management +obj/machinery/computer/general_air_control/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + ..() + /obj/machinery/computer/general_air_control/attack_hand(mob/user) if(..(user)) return @@ -182,7 +186,7 @@ else output += "ERROR: Can not find input port Search
    " - + output += "Flow Rate Limit: - - - - [round(input_flow_setting, 0.1)] L/s + + + +
    " output += "
    " @@ -230,7 +234,7 @@ Max Output Pressure: [output_pressure] kPa
    "} spawn(1) src.updateUsrDialog() return 1 - + if(!radio_connection) return 0 var/datum/signal/signal = new @@ -239,32 +243,32 @@ Max Output Pressure: [output_pressure] kPa
    "} if(href_list["in_refresh_status"]) input_info = null signal.data = list ("tag" = input_tag, "status" = 1) - return 1 + . = 1 if(href_list["in_toggle_injector"]) input_info = null signal.data = list ("tag" = input_tag, "power_toggle" = 1) - return 1 + . = 1 if(href_list["in_set_flowrate"]) input_info = null signal.data = list ("tag" = input_tag, "set_volume_rate" = "[input_flow_setting]") - return 1 + . = 1 if(href_list["out_refresh_status"]) output_info = null signal.data = list ("tag" = output_tag, "status" = 1) - return 1 + . = 1 if(href_list["out_toggle_power"]) output_info = null signal.data = list ("tag" = output_tag, "power_toggle" = 1) - return 1 + . = 1 if(href_list["out_set_pressure"]) output_info = null signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]") - return 1 + . = 1 signal.data["sigtype"]="command" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) @@ -302,7 +306,7 @@ Max Output Pressure: [output_pressure] kPa
    "} else output += "ERROR: Can not find input port Search
    " - + output += "Flow Rate Limit: - - - - [round(input_flow_setting, 0.1)] L/s + + + +
    " output += "
    " @@ -350,7 +354,7 @@ Min Core Pressure: [pressure_limit] kPa
    "} spawn(1) src.updateUsrDialog() return 1 - + if(!radio_connection) return 0 var/datum/signal/signal = new @@ -359,32 +363,32 @@ Min Core Pressure: [pressure_limit] kPa
    "} if(href_list["in_refresh_status"]) input_info = null signal.data = list ("tag" = input_tag, "status" = 1) - return 1 + . = 1 if(href_list["in_toggle_injector"]) input_info = null signal.data = list ("tag" = input_tag, "power_toggle" = 1) - return 1 + . = 1 if(href_list["in_set_flowrate"]) input_info = null signal.data = list ("tag" = input_tag, "set_volume_rate" = "[input_flow_setting]") - return 1 + . = 1 if(href_list["out_refresh_status"]) output_info = null signal.data = list ("tag" = output_tag, "status" = 1) - return 1 + . = 1 if(href_list["out_toggle_power"]) output_info = null signal.data = list ("tag" = output_tag, "power_toggle" = 1) - return 1 + . = 1 if(href_list["out_set_pressure"]) output_info = null signal.data = list ("tag" = output_tag, "set_external_pressure" = "[pressure_setting]", "checks" = 1) - return 1 + . = 1 signal.data["sigtype"]="command" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index ad7d55c2aa..095aec4a24 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -104,7 +104,7 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe_meter(src.loc) - del(src) + qdel(src) // TURF METER - REPORTS A TILE'S AIR CONTENTS diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 9308bae64e..5e8817359f 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -20,6 +20,11 @@ return 1 +/obj/machinery/portable_atmospherics/Destroy() + qdel(air_contents) + qdel(holding) + ..() + /obj/machinery/portable_atmospherics/initialize() . = ..() spawn() @@ -35,8 +40,8 @@ else update_icon() -/obj/machinery/portable_atmospherics/Del() - del(air_contents) +/obj/machinery/portable_atmospherics/Destroy() + qdel(air_contents) ..() diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 9f2c4023b2..659e17d4b2 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -7,7 +7,10 @@ var/on = 0 var/direction_out = 0 //0 = siphoning, 1 = releasing - var/target_pressure = 100 + var/target_pressure = ONE_ATMOSPHERE + + var/pressuremin = 0 + var/pressuremax = 10 * ONE_ATMOSPHERE volume = 1000 @@ -106,64 +109,59 @@ /obj/machinery/portable_atmospherics/powered/pump/return_air() return air_contents -/obj/machinery/portable_atmospherics/powered/pump/attack_ai(var/mob/user as mob) +/obj/machinery/portable_atmospherics/powered/pump/attack_ai(var/mob/user) + src.add_hiddenprint(user) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/powered/pump/attack_hand(var/mob/user as mob) +/obj/machinery/portable_atmospherics/powered/pump/attack_ghost(var/mob/user) + return src.attack_hand(user) - user.set_machine(src) - var/holding_text +/obj/machinery/portable_atmospherics/powered/pump/attack_hand(var/mob/user) + ui_interact(user) - if(holding) - holding_text = {"
    Tank Pressure: [round(holding.air_contents.return_pressure(), 0.01)] kPa
    -Remove Tank -"} - var/output_text = {"[capitalize(name)]
    -Pressure: [round(air_contents.return_pressure(), 0.01)] kPa
    -Flow Rate: [round(last_flow_rate, 0.1)] L/s
    -Port Status: [(connected_port)?("Connected"):("Disconnected")] -[holding_text]
    -
    -Cell Charge: [cell? "[round(cell.percent())]%" : "N/A"] | Load: [round(last_power_draw)] W
    -Power Switch: [on?("On"):("Off")]
    -Pump Direction: [direction_out?("Out"):("In")]
    -Target Pressure: - - - - [target_pressure] kPa+ + + +
    -
    -Close
    -"} +/obj/machinery/portable_atmospherics/powered/pump/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1) + var/list/data[0] + data["portConnected"] = connected_port ? 1 : 0 + data["tankPressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0) + data["targetpressure"] = round(target_pressure) + data["pump_dir"] = direction_out + data["minpressure"] = round(pressuremin) + data["maxpressure"] = round(pressuremax) + data["powerDraw"] = round(last_power_draw) + data["cellCharge"] = cell ? cell.charge : 0 + data["cellMaxCharge"] = cell ? cell.maxcharge : 1 + data["on"] = on ? 1 : 0 - user << browse(output_text, "window=pump;size=600x300") - onclose(user, "pump") + data["hasHoldingTank"] = holding ? 1 : 0 + if (holding) + data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0)) - return + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "portpump.tmpl", "Portable Pump", 480, 410, state = physical_state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) /obj/machinery/portable_atmospherics/powered/pump/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) - return + if(..()) + return 1 - if (((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) - usr.set_machine(src) + if(href_list["power"]) + on = !on + . = 1 + if(href_list["direction"]) + direction_out = !direction_out + . = 1 + if (href_list["remove_tank"]) + if(holding) + holding.loc = loc + holding = null + . = 1 + if (href_list["pressure_adj"]) + var/diff = text2num(href_list["pressure_adj"]) + target_pressure = min(10*ONE_ATMOSPHERE, max(0, target_pressure+diff)) + . = 1 - if(href_list["power"]) - on = !on - - if(href_list["direction"]) - direction_out = !direction_out - - if (href_list["remove_tank"]) - if(holding) - holding.loc = loc - holding = null - - if (href_list["pressure_adj"]) - var/diff = text2num(href_list["pressure_adj"]) - target_pressure = min(10*ONE_ATMOSPHERE, max(0, target_pressure+diff)) - - src.updateUsrDialog() - src.add_fingerprint(usr) + if(.) update_icon() - else - usr << browse(null, "window=pump") - return - return \ No newline at end of file diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index d8c23cc5f0..1977e55646 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -13,6 +13,9 @@ power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 + var/minrate = 0 + var/maxrate = 10 * ONE_ATMOSPHERE + var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "oxygen_agent_b") /obj/machinery/portable_atmospherics/powered/scrubber/New() @@ -82,63 +85,58 @@ /obj/machinery/portable_atmospherics/powered/scrubber/return_air() return air_contents -/obj/machinery/portable_atmospherics/powered/scrubber/attack_ai(var/mob/user as mob) +/obj/machinery/portable_atmospherics/powered/scrubber/attack_ai(var/mob/user) + src.add_hiddenprint(user) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(var/mob/user as mob) +/obj/machinery/portable_atmospherics/powered/scrubber/attack_ghost(var/mob/user) + return src.attack_hand(user) - user.set_machine(src) - var/holding_text - - if(holding) - holding_text = {"
    Tank Pressure: [round(holding.air_contents.return_pressure(), 0.01)] kPa
    -Remove Tank -"} - var/output_text = {"[name]
    -Pressure: [round(air_contents.return_pressure(), 0.01)] kPa
    -Flow Rate: [round(last_flow_rate, 0.1)] L/s
    -Port Status: [(connected_port)?("Connected"):("Disconnected")] -[holding_text]
    -
    -Cell Charge: [cell? "[round(cell.percent())]%" : "N/A"] | Load: [round(last_power_draw)] W
    -Power Switch: [on?("On"):("Off")]
    -Flow Rate Regulator: - - - - [volume_rate] L/s + + + +
    - -
    -Close
    -"} - - user << browse(output_text, "window=scrubber;size=600x300") - onclose(user, "scrubber") +/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(var/mob/user) + ui_interact(user) return +/obj/machinery/portable_atmospherics/powered/scrubber/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1) + var/list/data[0] + data["portConnected"] = connected_port ? 1 : 0 + data["tankPressure"] = round(air_contents.return_pressure() > 0 ? air_contents.return_pressure() : 0) + data["rate"] = round(volume_rate) + data["minrate"] = round(minrate) + data["maxrate"] = round(maxrate) + data["powerDraw"] = round(last_power_draw) + data["cellCharge"] = cell ? cell.charge : 0 + data["cellMaxCharge"] = cell ? cell.maxcharge : 1 + data["on"] = on ? 1 : 0 + + data["hasHoldingTank"] = holding ? 1 : 0 + if (holding) + data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0)) + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + + /obj/machinery/portable_atmospherics/powered/scrubber/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) - return + if(..()) + return 1 - if (((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) - usr.set_machine(src) - - if(href_list["power"]) - on = !on - - if (href_list["remove_tank"]) - if(holding) - holding.loc = loc - holding = null - - if (href_list["volume_adj"]) - var/diff = text2num(href_list["volume_adj"]) - volume_rate = min(initial(volume_rate), max(0, volume_rate+diff)) - - src.updateUsrDialog() - src.add_fingerprint(usr) - update_icon() - else - usr << browse(null, "window=scrubber") - return - return + if(href_list["power"]) + on = !on + . = 1 + if (href_list["remove_tank"]) + if(holding) + holding.loc = loc + holding = null + . = 1 + if (href_list["volume_adj"]) + var/diff = text2num(href_list["volume_adj"]) + volume_rate = Clamp(volume_rate+diff, minrate, maxrate) + . = 1 + update_icon() //Huge scrubber diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index d537d113f9..d60404d5de 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -190,7 +190,7 @@ stack.use(max(1, round(total_used/mass_per_sheet))) // Always use at least 1 to prevent infinite materials. else user.remove_from_mob(O) - del(O) + qdel(O) updateUsrDialog() return diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm index 68bf61b7f1..3b323cd69f 100644 --- a/code/game/machinery/autolathe_datums.dm +++ b/code/game/machinery/autolathe_datums.dm @@ -16,7 +16,7 @@ recipe.resources = list() for(var/material in I.matter) recipe.resources[material] = I.matter[material]*1.25 // More expensive to produce than they are to recycle. - del(I) + qdel(I) /datum/autolathe/recipe var/name = "object" @@ -42,6 +42,11 @@ path = /obj/item/weapon/extinguisher category = "General" +/datum/autolathe/recipe/jar + name = "jar" + path = /obj/item/glass_jar + category = "General" + /datum/autolathe/recipe/crowbar name = "crowbar" path = /obj/item/weapon/crowbar diff --git a/code/game/machinery/bees_items.dm b/code/game/machinery/bees_items.dm index 486b46d33c..05f9231f8a 100644 --- a/code/game/machinery/bees_items.dm +++ b/code/game/machinery/bees_items.dm @@ -20,7 +20,7 @@ for(var/mob/living/simple_animal/bee/B in T) if(B.feral < 0) caught_bees += B.strength - del(B) + qdel(B) user.visible_message("\blue [user] nets some bees.","\blue You net up some of the becalmed bees.") else user.visible_message("\red [user] swings at some bees, they don't seem to like it.","\red You swing at some bees, they don't seem to like it.") diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 87399b597a..61ed92d58e 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -151,7 +151,7 @@ if(I.reagents.get_reagent_amount("nutriment") < 0.1) points += 1 else points += I.reagents.get_reagent_amount("nutriment") * 10 * eat_eff - del(I) + qdel(I) if(S) processing = 1 update_icon() diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 48c0edb984..5a8b25bb84 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -70,7 +70,7 @@ stored_matter += 50 user.drop_item() user << "\The [src] processes \the [W]. Levels of stored biomass now: [stored_matter]" - del(W) + qdel(W) return // Steel for matter. else if(prints_prosthetics && istype(W, /obj/item/stack/sheet/metal)) @@ -78,7 +78,7 @@ stored_matter += M.amount * 10 user.drop_item() user << "\The [src] processes \the [W]. Levels of stored matter now: [stored_matter]" - del(W) + qdel(W) return else return..() \ No newline at end of file diff --git a/code/game/machinery/bluespacerelay.dm b/code/game/machinery/bluespacerelay.dm new file mode 100644 index 0000000000..03d4a311b1 --- /dev/null +++ b/code/game/machinery/bluespacerelay.dm @@ -0,0 +1,34 @@ +/obj/machinery/bluespacerelay + name = "Emergency Bluespace Relay" + desc = "This sends messages through bluespace! Wow!" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "bspacerelay" + + anchored = 1 + density = 1 + use_power = 1 + var/on = 1 + + idle_power_usage = 15000 + active_power_usage = 15000 + +/obj/machinery/bluespacerelay/process() + + update_power() + + update_icon() + + +/obj/machinery/bluespacerelay/update_icon() + if(on) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]_off" + +/obj/machinery/bluespacerelay/proc/update_power() + + if(stat & (BROKEN|NOPOWER|EMPED)) + on = 0 + else + on = 1 + diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index f87ae33ee0..3d54f12e30 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -15,7 +15,6 @@ var/locked = 1 //var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots - /obj/machinery/bot/proc/turn_on() if(stat) return 0 on = 1 @@ -27,7 +26,7 @@ SetLuminosity(0) /obj/machinery/bot/proc/explode() - del(src) + qdel(src) /obj/machinery/bot/proc/healthcheck() if (src.health <= 0) @@ -117,7 +116,7 @@ /obj/machinery/bot/emp_act(severity) var/was_on = on stat |= EMPED - var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc ) + var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc ) pulse2.icon = 'icons/effects/effects.dmi' pulse2.icon_state = "empdisable" pulse2.name = "emp sparks" @@ -125,7 +124,7 @@ pulse2.set_dir(pick(cardinal)) spawn(10) - pulse2.delete() + qdel(pulse2) if (on) turn_off() spawn(severity*300) diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm deleted file mode 100644 index 4dcb838152..0000000000 --- a/code/game/machinery/bots/cleanbot.dm +++ /dev/null @@ -1,363 +0,0 @@ -//Cleanbot assembly -/obj/item/weapon/bucket_sensor - desc = "It's a bucket. With a sensor attached." - name = "proxy bucket" - icon = 'icons/obj/aibots.dmi' - icon_state = "bucket_proxy" - force = 3.0 - throwforce = 10.0 - throw_speed = 2 - throw_range = 5 - w_class = 3.0 - var/created_name = "Cleanbot" - - -//Cleanbot -/obj/machinery/bot/cleanbot - name = "Cleanbot" - desc = "A little cleaning robot, he looks so excited!" - icon = 'icons/obj/aibots.dmi' - icon_state = "cleanbot0" - layer = 5.0 - density = 0 - anchored = 0 - //weight = 1.0E7 - health = 25 - maxhealth = 25 - var/cleaning = 0 - var/screwloose = 0 - var/oddbutton = 0 - var/blood = 1 - var/list/target_types = list() - var/obj/effect/decal/cleanable/target - var/obj/effect/decal/cleanable/oldtarget - var/oldloc = null - req_access = list(access_janitor) - var/path[] = new() - var/patrol_path[] = null - var/beacon_freq = 1445 // navigation beacon frequency - var/closest_dist - var/closest_loc - var/failed_steps - var/should_patrol - var/next_dest - var/next_dest_loc - -/obj/machinery/bot/cleanbot/New() - ..() - src.get_targets() - src.icon_state = "cleanbot[src.on]" - - should_patrol = 1 - - src.botcard = new /obj/item/weapon/card/id(src) - src.botcard.access = list(access_janitor, access_maint_tunnels) - - src.locked = 0 // Start unlocked so roboticist can set them to patrol. - - if(radio_controller) - radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS) - - -/obj/machinery/bot/cleanbot/turn_on() - . = ..() - src.icon_state = "cleanbot[src.on]" - src.updateUsrDialog() - -/obj/machinery/bot/cleanbot/turn_off() - ..() - if(!isnull(src.target)) - target.targeted_by = null - src.target = null - src.oldtarget = null - src.oldloc = null - src.icon_state = "cleanbot[src.on]" - src.path = new() - src.updateUsrDialog() - -/obj/machinery/bot/cleanbot/attack_hand(mob/user as mob) - . = ..() - if (.) - return - usr.set_machine(src) - interact(user) - -/obj/machinery/bot/cleanbot/interact(mob/user as mob) - var/dat - dat += text({" -Automatic Station Cleaner v1.0

    -Status: []
    -Behaviour controls are [src.locked ? "locked" : "unlocked"]
    -Maintenance panel is [src.open ? "opened" : "closed"]"}, -text("[src.on ? "On" : "Off"]")) - if(!src.locked || issilicon(user)) - dat += text({"
    Cleans Blood: []
    "}, text("[src.blood ? "Yes" : "No"]")) - dat += text({"
    Patrol station: []
    "}, text("[src.should_patrol ? "Yes" : "No"]")) - // dat += text({"
    Beacon frequency: []
    "}, text("[src.beacon_freq]")) - if(src.open && !src.locked) - dat += text({" -Odd looking screw twiddled: []
    -Weird button pressed: []"}, -text("[src.screwloose ? "Yes" : "No"]"), -text("[src.oddbutton ? "Yes" : "No"]")) - - user << browse("Cleaner v1.0 controls[dat]", "window=autocleaner") - onclose(user, "autocleaner") - return - -/obj/machinery/bot/cleanbot/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - switch(href_list["operation"]) - if("start") - if (src.on) - turn_off() - else - turn_on() - if("blood") - src.blood =!src.blood - src.get_targets() - src.updateUsrDialog() - if("patrol") - src.should_patrol =!src.should_patrol - src.patrol_path = null - src.updateUsrDialog() - if("freq") - var/freq = text2num(input("Select frequency for navigation beacons", "Frequnecy", num2text(beacon_freq / 10))) * 10 - if (freq > 0) - src.beacon_freq = freq - src.updateUsrDialog() - if("screw") - src.screwloose = !src.screwloose - usr << "You press the weird button." - src.updateUsrDialog() - -/obj/machinery/bot/cleanbot/attackby(obj/item/weapon/W, mob/user as mob) - if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if(src.allowed(usr) && !open && !emagged) - src.locked = !src.locked - user << "You [ src.locked ? "lock" : "unlock"] the [src] behaviour controls." - else - if(emagged) - user << "ERROR" - if(open) - user << "Please close the access panel before locking it." - else - user << "This [src] doesn't seem to respect your authority." - else - return ..() - -/obj/machinery/bot/cleanbot/Emag(mob/user as mob) - ..() - if(open && !locked) - if(user) user << "The [src] buzzes and beeps." - src.oddbutton = 1 - src.screwloose = 1 - -/obj/machinery/bot/cleanbot/process() - set background = 1 - - if(!src.on) - return - if(src.cleaning) - return - - if(!src.screwloose && !src.oddbutton && prob(5)) - visible_message("[src] makes an excited beeping booping sound!") - - if(src.screwloose && prob(5)) - if(istype(loc,/turf/simulated)) - var/turf/simulated/T = src.loc - if(T.wet < 1) - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - spawn(800) - if (istype(T) && T.wet < 2) - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - if(src.oddbutton && prob(5)) - visible_message("Something flies out of [src]. He seems to be acting oddly.") - var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(src.loc) - //gib.streak(list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) - src.oldtarget = gib - if(!src.target || src.target == null) - for (var/obj/effect/decal/cleanable/D in view(7,src)) - for(var/T in src.target_types) - if(isnull(D.targeted_by) && istype(D, T) && D != src.oldtarget) // If the mess isn't targeted (D.type == T || D.parent_type == T) - src.oldtarget = D // or if it is but the bot is gone. - src.target = D // and it's stuff we clean? Clean it. - D.targeted_by = src // Claim the mess we are targeting. - return - - if(!src.target || src.target == null) - if(src.loc != src.oldloc) - src.oldtarget = null - - if (!should_patrol) - return - - if (!patrol_path || patrol_path.len < 1) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) - - if(!frequency) return - - closest_dist = 9999 - closest_loc = null - next_dest_loc = null - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data = list("findbeacon" = "patrol") - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - spawn(5) - if (!next_dest_loc) - next_dest_loc = closest_loc - if (next_dest_loc) - src.patrol_path = AStar(src.loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id=botcard, exclude=null) - else - patrol_move() - - return - - if(target && path.len == 0) - spawn(0) - if(!src || !target) return - src.path = AStar(src.loc, src.target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id=botcard) - if (!path) path = list() - if(src.path.len == 0) - src.oldtarget = src.target - target.targeted_by = null - src.target = null - return - if(src.path.len > 0 && src.target && (src.target != null)) - step_to(src, src.path[1]) - src.path -= src.path[1] - else if(src.path.len == 1) - step_to(src, target) - - if(src.target && (src.target != null)) - patrol_path = null - if(src.loc == src.target.loc) - clean(src.target) - src.path = new() - src.target = null - return - - src.oldloc = src.loc - -/obj/machinery/bot/cleanbot/proc/patrol_move() - if (src.patrol_path.len <= 0) - return - - var/next = src.patrol_path[1] - src.patrol_path -= next - if (next == src.loc) - return - - var/moved = step_towards(src, next) - if (!moved) - failed_steps++ - if (failed_steps > 4) - patrol_path = null - next_dest = null - failed_steps = 0 - else - failed_steps = 0 - -/obj/machinery/bot/cleanbot/receive_signal(datum/signal/signal) - var/recv = signal.data["beacon"] - var/valid = signal.data["patrol"] - if(!recv || !valid) - return - - var/dist = get_dist(src, signal.source.loc) - if (dist < closest_dist && signal.source.loc != src.loc) - closest_dist = dist - closest_loc = signal.source.loc - next_dest = signal.data["next_patrol"] - - if (recv == next_dest) - next_dest_loc = signal.source.loc - next_dest = signal.data["next_patrol"] - -/obj/machinery/bot/cleanbot/proc/get_targets() - src.target_types = new/list() - - target_types += /obj/effect/decal/cleanable/blood/oil - target_types += /obj/effect/decal/cleanable/vomit - target_types += /obj/effect/decal/cleanable/crayon - target_types += /obj/effect/decal/cleanable/liquid_fuel - target_types += /obj/effect/decal/cleanable/mucus - target_types += /obj/effect/decal/cleanable/dirt - - if(src.blood) - target_types += /obj/effect/decal/cleanable/blood/ - -/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target) - anchored = 1 - icon_state = "cleanbot-c" - visible_message("\red [src] begins to clean up the [target]") - cleaning = 1 - var/cleantime = 50 - if(istype(target,/obj/effect/decal/cleanable/dirt)) // Clean Dirt much faster - cleantime = 10 - spawn(cleantime) - if(istype(loc,/turf/simulated)) - var/turf/simulated/f = loc - f.dirt = 0 - cleaning = 0 - del(target) - icon_state = "cleanbot[on]" - anchored = 0 - target = null - -/obj/machinery/bot/cleanbot/explode() - src.on = 0 - src.visible_message("\red [src] blows apart!", 1) - var/turf/Tsec = get_turf(src) - - new /obj/item/weapon/reagent_containers/glass/bucket(Tsec) - - new /obj/item/device/assembly/prox_sensor(Tsec) - - if (prob(50)) - new /obj/item/robot_parts/l_arm(Tsec) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - del(src) - return - -/obj/item/weapon/bucket_sensor/attackby(var/obj/item/W, mob/user as mob) - ..() - if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) - user.drop_item() - del(W) - var/turf/T = get_turf(src.loc) - var/obj/machinery/bot/cleanbot/A = new /obj/machinery/bot/cleanbot(T) - A.name = src.created_name - user << "You add the robot arm to the bucket and sensor assembly. Beep boop!" - user.drop_from_inventory(src) - del(src) - - else if (istype(W, /obj/item/weapon/pen)) - var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) - if (!t) - return - if (!in_range(src, usr) && src.loc != usr) - return - src.created_name = t diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm deleted file mode 100644 index a955efaa1f..0000000000 --- a/code/game/machinery/bots/ed209bot.dm +++ /dev/null @@ -1,210 +0,0 @@ -/obj/machinery/bot/secbot/ed209 - name = "ED-209 Security Robot" - desc = "A security robot. He looks less than thrilled." - icon = 'icons/obj/aibots.dmi' - icon_state = "ed2090" - density = 1 - health = 100 - maxhealth = 100 - - bot_version = "2.5" - search_range = 12 - has_laser = 1 - - preparing_arrest_sounds = new() - secbot_assembly = /obj/item/weapon/secbot_assembly/ed209_assembly - -/obj/item/weapon/secbot_assembly/ed209_assembly - name = "ED-209 assembly" - desc = "Some sort of bizarre assembly." - icon = 'icons/obj/aibots.dmi' - icon_state = "ed209_frame" - item_state = "ed209_frame" - created_name = "ED-209 Security Robot" //To preserve the name if it's a unique securitron I guess - var/lasercolor = "" - -/obj/machinery/bot/secbot/ed209/update_icon() - if(on && is_attacking) - src.icon_state = "[lasercolor]ed209-c" - else - src.icon_state = "[lasercolor]ed209[src.on]" - -/obj/machinery/bot/secbot/ed209/on_explosion(var/turf/Tsec) - if(!lasercolor) - var/obj/item/weapon/gun/energy/taser/G = new /obj/item/weapon/gun/energy/taser(Tsec) - G.power_supply.charge = 0 - else if(lasercolor == "b") - var/obj/item/weapon/gun/energy/lasertag/blue/G = new (Tsec) - G.power_supply.charge = 0 - else if(lasercolor == "r") - var/obj/item/weapon/gun/energy/lasertag/red/G = new (Tsec) - G.power_supply.charge = 0 - if (prob(50)) - new /obj/item/robot_parts/l_leg(Tsec) - if (prob(25)) - new /obj/item/robot_parts/r_leg(Tsec) - if (prob(25))//50% chance for a helmet OR vest - if (prob(50)) - new /obj/item/clothing/head/helmet(Tsec) - else - if(!lasercolor) - new /obj/item/clothing/suit/armor/vest(Tsec) - if(lasercolor == "b") - new /obj/item/clothing/suit/bluetag(Tsec) - if(lasercolor == "r") - new /obj/item/clothing/suit/redtag(Tsec) - -/obj/item/weapon/secbot_assembly/ed209_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - - if(istype(W, /obj/item/weapon/pen)) - var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) - if(!t) return - if(!in_range(src, usr) && src.loc != usr) return - created_name = t - return - - switch(build_step) - if(0,1) - if( istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg) ) - user.drop_item() - del(W) - build_step++ - user << "You add the robot leg to [src]." - name = "legs/frame assembly" - if(build_step == 1) - item_state = "ed209_leg" - icon_state = "ed209_leg" - else - item_state = "ed209_legs" - icon_state = "ed209_legs" - - if(2) - if( istype(W, /obj/item/clothing/suit/redtag) ) - lasercolor = "r" - else if( istype(W, /obj/item/clothing/suit/bluetag) ) - lasercolor = "b" - if( lasercolor || istype(W, /obj/item/clothing/suit/storage/vest) ) - user.drop_item() - del(W) - build_step++ - user << "You add the armor to [src]." - name = "vest/legs/frame assembly" - item_state = "[lasercolor]ed209_shell" - icon_state = "[lasercolor]ed209_shell" - - if(3) - if( istype(W, /obj/item/weapon/weldingtool) ) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - build_step++ - name = "shielded frame assembly" - user << "You welded the vest to [src]." - if(4) - if( istype(W, /obj/item/clothing/head/helmet) ) - user.drop_item() - del(W) - build_step++ - user << "You add the helmet to [src]." - name = "covered and shielded frame assembly" - item_state = "[lasercolor]ed209_hat" - icon_state = "[lasercolor]ed209_hat" - - if(5) - if( isprox(W) ) - user.drop_item() - del(W) - build_step++ - user << "You add the prox sensor to [src]." - name = "covered, shielded and sensored frame assembly" - item_state = "[lasercolor]ed209_prox" - icon_state = "[lasercolor]ed209_prox" - - if(6) - if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if (C.get_amount() < 1) - user << "You need one coil of wire to do wire [src]." - return - user << "You start to wire [src]." - if (do_after(user, 40) && build_step == 6) - if (C.use(1)) - build_step++ - user << "You wire the ED-209 assembly." - name = "wired ED-209 assembly" - return - - if(7) - switch(lasercolor) - if("b") - if( !istype(W, /obj/item/weapon/gun/energy/lasertag/blue) ) - return - name = "bluetag ED-209 assembly" - if("r") - if( !istype(W, /obj/item/weapon/gun/energy/lasertag/red) ) - return - name = "redtag ED-209 assembly" - if("") - if( !istype(W, /obj/item/weapon/gun/energy/taser) ) - return - name = "taser ED-209 assembly" - else - return - build_step++ - user << "You add [W] to [src]." - src.item_state = "[lasercolor]ed209_taser" - src.icon_state = "[lasercolor]ed209_taser" - user.drop_item() - del(W) - - if(8) - if( istype(W, /obj/item/weapon/screwdriver) ) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - var/turf/T = get_turf(user) - user << "Now attaching the gun to the frame..." - sleep(40) - if(get_turf(user) == T && build_step == 8) - build_step++ - name = "armed [name]" - user << "Taser gun attached." - - if(9) - if( istype(W, /obj/item/weapon/cell) ) - build_step++ - user << "You complete the ED-209." - var/turf/T = get_turf(src) - new /obj/machinery/bot/secbot/ed209(T,created_name,lasercolor) - user.drop_item() - del(W) - user.drop_from_inventory(src) - del(src) - - -/obj/machinery/bot/secbot/ed209/bullet_act(var/obj/item/projectile/Proj) - if((src.lasercolor == "b") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/lastertag/red)) - src.disabled = 1 - del (Proj) - sleep(100) - src.disabled = 0 - else - ..() - else if((src.lasercolor == "r") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/lastertag/blue)) - src.disabled = 1 - del (Proj) - sleep(100) - src.disabled = 0 - else - ..() - else - ..() - -/obj/machinery/bot/secbot/ed209/bluetag/New()//If desired, you spawn red and bluetag bots easily - new /obj/machinery/bot/secbot/ed209(get_turf(src),null,"b") - del(src) - - -/obj/machinery/bot/secbot/ed209/redtag/New() - new /obj/machinery/bot/secbot/ed209(get_turf(src),null,"r") - del(src) diff --git a/code/game/machinery/bots/farmbot.dm b/code/game/machinery/bots/farmbot.dm deleted file mode 100644 index ca32e937ed..0000000000 --- a/code/game/machinery/bots/farmbot.dm +++ /dev/null @@ -1,595 +0,0 @@ -//Farmbots by GauHelldragon - 12/30/2012 -// A new type of buildable aiBot that helps out in hydroponics - -// Made by using a robot arm on a water tank and then adding: -// A plant analyzer, a bucket, a mini-hoe and then a proximity sensor (in that order) - -// Will water, weed and fertilize plants that need it -// When emagged, it will "water", "weed" and "fertilize" humans instead -// Holds up to 10 fertilizers (only the type dispensed by the machines, not chemistry bottles) -// It will fill up it's water tank at a sink when low. - -// The behavior panel can be unlocked with hydroponics access and be modified to disable certain behaviors -// By default, it will ignore weeds and mushrooms, but can be set to tend to these types of plants as well. - - -#define FARMBOT_MODE_WATER 1 -#define FARMBOT_MODE_FERTILIZE 2 -#define FARMBOT_MODE_WEED 3 -#define FARMBOT_MODE_REFILL 4 -#define FARMBOT_MODE_WAITING 5 - -#define FARMBOT_ANIMATION_TIME 25 //How long it takes to use one of the action animations -#define FARMBOT_EMAG_DELAY 60 //How long of a delay after doing one of the emagged attack actions -#define FARMBOT_ACTION_DELAY 35 //How long of a delay after doing one of the normal actions - -/obj/machinery/bot/farmbot - name = "Farmbot" - desc = "The botanist's best friend." - icon = 'icons/obj/aibots.dmi' - icon_state = "farmbot0" - layer = 5.0 - density = 1 - anchored = 0 - health = 50 - maxhealth = 50 - req_access =list(access_hydroponics) - - var/Max_Fertilizers = 10 - - var/setting_water = 1 - var/setting_refill = 1 - var/setting_fertilize = 1 - var/setting_weed = 1 - var/setting_ignoreWeeds = 1 - var/setting_ignoreMushrooms = 1 - - var/atom/target //Current target, can be a human, a hydroponics tray, or a sink - var/mode //Which mode is being used, 0 means it is looking for work - - var/obj/structure/reagent_dispensers/watertank/tank // the water tank that was used to make it, remains inside the bot. - - var/path[] = new() // used for pathing - var/frustration - -/obj/machinery/bot/farmbot/New() - ..() - src.icon_state = "farmbot[src.on]" - spawn (4) - src.botcard = new /obj/item/weapon/card/id(src) - src.botcard.access = req_access - - if ( !tank ) //Should be set as part of making it... but lets check anyway - tank = locate(/obj/structure/reagent_dispensers/watertank/) in contents - if ( !tank ) //An admin must have spawned the farmbot! Better give it a tank. - tank = new /obj/structure/reagent_dispensers/watertank(src) - -/obj/machinery/bot/farmbot/Bump(M as mob|obj) //Leave no door unopened! - spawn(0) - if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard))) - var/obj/machinery/door/D = M - if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard)) - D.open() - src.frustration = 0 - return - return - -/obj/machinery/bot/farmbot/turn_on() - . = ..() - src.icon_state = "farmbot[src.on]" - src.updateUsrDialog() - -/obj/machinery/bot/farmbot/turn_off() - ..() - src.path = new() - src.icon_state = "farmbot[src.on]" - src.updateUsrDialog() - -/obj/machinery/bot/farmbot/attack_paw(mob/user as mob) - return attack_hand(user) - - -/obj/machinery/bot/farmbot/proc/get_total_ferts() - var total_fert = 0 - for (var/obj/item/nutrient/fert in contents) - total_fert++ - return total_fert - -/obj/machinery/bot/farmbot/attack_hand(mob/user as mob) - . = ..() - if (.) - return - var/dat - dat += "Automatic Hyrdoponic Assisting Unit v1.0

    " - dat += "Status: [src.on ? "On" : "Off"]
    " - - dat += "Water Tank: " - if ( tank ) - dat += "\[[tank.reagents.total_volume]/[tank.reagents.maximum_volume]\]" - else - dat += "Error: Water Tank not Found" - - dat += "
    Fertilizer Storage: \[[get_total_ferts()]/[Max_Fertilizers]\]" - - dat += "
    Behaviour controls are [src.locked ? "locked" : "unlocked"]
    " - if(!src.locked) - dat += "Watering Controls:
    " - dat += " Water Plants : [src.setting_water ? "Yes" : "No"]
    " - dat += " Refill Watertank : [src.setting_refill ? "Yes" : "No"]
    " - dat += "
    Fertilizer Controls:
    " - dat += " Fertilize Plants : [src.setting_fertilize ? "Yes" : "No"]
    " - dat += "
    Weeding Controls:
    " - dat += " Weed Plants : [src.setting_weed ? "Yes" : "No"]
    " - dat += "
    Ignore Weeds : [src.setting_ignoreWeeds ? "Yes" : "No"]
    " - dat += "Ignore Mushrooms : [src.setting_ignoreMushrooms ? "Yes" : "No"]
    " - dat += "
    " - - user << browse("Farmbot v1.0 controls[dat]", "window=autofarm") - onclose(user, "autofarm") - return - -/obj/machinery/bot/farmbot/Topic(href, href_list) - if(..()) - return - usr.machine = src - src.add_fingerprint(usr) - if ((href_list["power"]) && (src.allowed(usr))) - if (src.on) - turn_off() - else - turn_on() - - else if((href_list["water"]) && (!src.locked)) - setting_water = !setting_water - else if((href_list["refill"]) && (!src.locked)) - setting_refill = !setting_refill - else if((href_list["fertilize"]) && (!src.locked)) - setting_fertilize = !setting_fertilize - else if((href_list["weed"]) && (!src.locked)) - setting_weed = !setting_weed - else if((href_list["ignoreWeed"]) && (!src.locked)) - setting_ignoreWeeds = !setting_ignoreWeeds - else if((href_list["ignoreMush"]) && (!src.locked)) - setting_ignoreMushrooms = !setting_ignoreMushrooms - else if (href_list["eject"] ) - flick("farmbot_hatch",src) - for (var/obj/item/nutrient/fert in contents) - fert.loc = get_turf(src) - - src.updateUsrDialog() - return - -/obj/machinery/bot/farmbot/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (src.allowed(user)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - src.updateUsrDialog() - else - user << "\red Access denied." - - else if (istype(W, /obj/item/nutrient)) - if ( get_total_ferts() >= Max_Fertilizers ) - user << "The fertilizer storage is full!" - return - user.drop_item() - W.loc = src - user << "You insert [W]." - flick("farmbot_hatch",src) - src.updateUsrDialog() - return - - else - ..() - -/obj/machinery/bot/farmbot/Emag(mob/user as mob) - ..() - if(user) user << "\red You short out [src]'s plant identifier circuits." - spawn(0) - for(var/mob/O in hearers(src, null)) - O.show_message("\red [src] buzzes oddly!", 1) - flick("farmbot_broke", src) - src.emagged = 1 - src.on = 1 - src.icon_state = "farmbot[src.on]" - target = null - mode = FARMBOT_MODE_WAITING //Give the emagger a chance to get away! 15 seconds should be good. - spawn(150) - mode = 0 - -/obj/machinery/bot/farmbot/explode() - src.on = 0 - visible_message("\red [src] blows apart!", 1) - var/turf/Tsec = get_turf(src) - - new /obj/item/weapon/minihoe(Tsec) - new /obj/item/weapon/reagent_containers/glass/bucket(Tsec) - new /obj/item/device/assembly/prox_sensor(Tsec) - new /obj/item/device/analyzer/plant_analyzer(Tsec) - - if ( tank ) - tank.loc = Tsec - - for ( var/obj/item/nutrient/fert in contents ) - if ( prob(50) ) - fert.loc = Tsec - - if (prob(50)) - new /obj/item/robot_parts/l_arm(Tsec) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - del(src) - return - -/obj/machinery/bot/farmbot/process() - set background = 1 - - if(!src.on) - return - - if ( emagged && prob(1) ) - flick("farmbot_broke", src) - - if ( mode == FARMBOT_MODE_WAITING ) - return - - if ( !mode || !target || !(target in view(7,src)) ) //Don't bother chasing down targets out of view - - mode = 0 - target = null - if ( !find_target() ) - // Couldn't find a target, wait a while before trying again. - mode = FARMBOT_MODE_WAITING - spawn(100) - mode = 0 - return - - if ( mode && target ) - if ( get_dist(target,src) <= 1 || ( emagged && mode == FARMBOT_MODE_FERTILIZE ) ) - // If we are in emagged fertilize mode, we throw the fertilizer, so distance doesn't matter - frustration = 0 - use_farmbot_item() - else - move_to_target() - return - -/obj/machinery/bot/farmbot/proc/use_farmbot_item() - if ( !target ) - mode = 0 - return 0 - - if ( emagged && !ismob(target) ) // Humans are plants! - mode = 0 - target = null - return 0 - - if ( !emagged && !istype(target,/obj/machinery/hydroponics) && !istype(target,/obj/structure/sink) ) // Humans are not plants! - mode = 0 - target = null - return 0 - - if ( mode == FARMBOT_MODE_FERTILIZE ) - //Find which fertilizer to use - var/obj/item/nutrient/fert - for ( var/obj/item/nutrient/nut in contents ) - fert = nut - break - if ( !fert ) - target = null - mode = 0 - return - fertilize(fert) - - if ( mode == FARMBOT_MODE_WEED ) - weed() - - if ( mode == FARMBOT_MODE_WATER ) - water() - - if ( mode == FARMBOT_MODE_REFILL ) - refill() - - - - -/obj/machinery/bot/farmbot/proc/find_target() - if ( emagged ) //Find a human and help them! - for ( var/mob/living/carbon/human/human in view(7,src) ) - if (human.stat == 2) - continue - - var list/options = list(FARMBOT_MODE_WEED) - if ( get_total_ferts() ) - options.Add(FARMBOT_MODE_FERTILIZE) - if ( tank && tank.reagents.total_volume >= 1 ) - options.Add(FARMBOT_MODE_WATER) - mode = pick(options) - target = human - return mode - return 0 - else - if ( setting_refill && tank && tank.reagents.total_volume < 100 ) - for ( var/obj/structure/sink/source in view(7,src) ) - target = source - mode = FARMBOT_MODE_REFILL - return 1 - for ( var/obj/machinery/hydroponics/tray in view(7,src) ) - var newMode = GetNeededMode(tray) - if ( newMode ) - mode = newMode - target = tray - return 1 - return 0 - -/obj/machinery/bot/farmbot/proc/GetNeededMode(obj/machinery/hydroponics/tray) - if ( !tray.planted || tray.dead ) - return 0 - if ( tray.myseed.plant_type == 1 && setting_ignoreWeeds ) - return 0 - if ( tray.myseed.plant_type == 2 && setting_ignoreMushrooms ) - return 0 - - if ( setting_water && tray.waterlevel <= 10 && tank && tank.reagents.total_volume >= 1 ) - return FARMBOT_MODE_WATER - - if ( setting_weed && tray.weedlevel >= 5 ) - return FARMBOT_MODE_WEED - - if ( setting_fertilize && tray.nutrilevel <= 2 && get_total_ferts() ) - return FARMBOT_MODE_FERTILIZE - - return 0 - -/obj/machinery/bot/farmbot/proc/move_to_target() - //Mostly copied from medibot code. - - if(src.frustration > 8) - target = null - mode = 0 - frustration = 0 - src.path = new() - if(src.target && (src.path.len) && (get_dist(src.target,src.path[src.path.len]) > 2)) - src.path = new() - if(src.target && src.path.len == 0 && (get_dist(src,src.target) > 1)) - spawn(0) - var/turf/dest = get_step_towards(target,src) //Can't pathfind to a tray, as it is dense, so pathfind to the spot next to the tray - - src.path = AStar(src.loc, dest, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard) - if(src.path.len == 0) - for ( var/turf/spot in orange(1,target) ) //The closest one is unpathable, try the other spots - if ( spot == dest ) //We already tried this spot - continue - if ( spot.density ) - continue - src.path = AStar(src.loc, spot, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard) - src.path = reverselist(src.path) - if ( src.path.len > 0 ) - break - - if ( src.path.len == 0 ) - target = null - mode = 0 - return - - if(src.path.len > 0 && src.target) - step_to(src, src.path[1]) - src.path -= src.path[1] - spawn(3) - if(src.path.len) - step_to(src, src.path[1]) - src.path -= src.path[1] - - if(src.path.len > 8 && src.target) - src.frustration++ - - -/obj/machinery/bot/farmbot/proc/fertilize(obj/item/nutrient/fert) - if ( !fert ) - target = null - mode = 0 - return 0 - - if ( emagged ) // Warning, hungry humans detected: throw fertilizer at them - spawn(0) - fert.loc = src.loc - fert.throw_at(target, 16, 3, src) - src.visible_message("\red [src] launches [fert.name] at [target.name]!") - flick("farmbot_broke", src) - spawn (FARMBOT_EMAG_DELAY) - mode = 0 - target = null - return 1 - - else // feed them plants~ - var /obj/machinery/hydroponics/tray = target - tray.nutrilevel = 10 - tray.yieldmod = fert.yieldmod - tray.mutmod = fert.mutmod - del fert - tray.updateicon() - icon_state = "farmbot_fertile" - mode = FARMBOT_MODE_WAITING - - spawn (FARMBOT_ACTION_DELAY) - mode = 0 - target = null - spawn (FARMBOT_ANIMATION_TIME) - icon_state = "farmbot[src.on]" - return 1 - -/obj/machinery/bot/farmbot/proc/weed() - icon_state = "farmbot_hoe" - spawn(FARMBOT_ANIMATION_TIME) - icon_state = "farmbot[src.on]" - - if ( emagged ) // Warning, humans infested with weeds! - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_EMAG_DELAY) - mode = 0 - - if ( prob(50) ) // better luck next time little guy - src.visible_message("\red [src] swings wildly at [target] with a minihoe, missing completely!") - - else // yayyy take that weeds~ - var/attackVerb = pick("slashed", "sliced", "cut", "clawed") - var /mob/living/carbon/human/human = target - - src.visible_message("\red [src] [attackVerb] [human]!") - var/damage = 5 - var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") - var/datum/organ/external/affecting = human.get_organ(ran_zone(dam_zone)) - var/armor = human.run_armor_check(affecting, "melee") - human.apply_damage(damage,BRUTE,affecting,armor,sharp=1,edge=1) - - else // warning, plants infested with weeds! - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_ACTION_DELAY) - mode = 0 - - var /obj/machinery/hydroponics/tray = target - tray.weedlevel = 0 - tray.updateicon() - -/obj/machinery/bot/farmbot/proc/water() - if ( !tank || tank.reagents.total_volume < 1 ) - mode = 0 - target = null - return 0 - - icon_state = "farmbot_water" - spawn(FARMBOT_ANIMATION_TIME) - icon_state = "farmbot[src.on]" - - if ( emagged ) // warning, humans are thirsty! - var splashAmount = min(70,tank.reagents.total_volume) - src.visible_message("\red [src] splashes [target] with a bucket of water!") - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - if ( prob(50) ) - tank.reagents.reaction(target, TOUCH) //splash the human! - else - tank.reagents.reaction(target.loc, TOUCH) //splash the human's roots! - spawn(5) - tank.reagents.remove_any(splashAmount) - - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_EMAG_DELAY) - mode = 0 - else - var /obj/machinery/hydroponics/tray = target - var/b_amount = tank.reagents.get_reagent_amount("water") - if(b_amount > 0 && tray.waterlevel < 100) - if(b_amount + tray.waterlevel > 100) - b_amount = 100 - tray.waterlevel - tank.reagents.remove_reagent("water", b_amount) - tray.waterlevel += b_amount - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - - // Toxicity dilutation code. The more water you put in, the lesser the toxin concentration. - tray.toxic -= round(b_amount/4) - if (tray.toxic < 0 ) // Make sure it won't go overboard - tray.toxic = 0 - - tray.updateicon() - mode = FARMBOT_MODE_WAITING - spawn(FARMBOT_ACTION_DELAY) - mode = 0 - -/obj/machinery/bot/farmbot/proc/refill() - if ( !tank || !tank.reagents.total_volume > 600 || !istype(target,/obj/structure/sink) ) - mode = 0 - target = null - return - - mode = FARMBOT_MODE_WAITING - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - src.visible_message("\blue [src] starts filling it's tank from [target].") - spawn(300) - src.visible_message("\blue [src] finishes filling it's tank.") - src.mode = 0 - tank.reagents.add_reagent("water", tank.reagents.maximum_volume - tank.reagents.total_volume ) - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) - - -/obj/item/weapon/farmbot_arm_assembly - name = "water tank/robot arm assembly" - desc = "A water tank with a robot arm permanently grafted to it." - icon = 'icons/obj/aibots.dmi' - icon_state = "water_arm" - var/build_step = 0 - var/created_name = "Farmbot" //To preserve the name if it's a unique farmbot I guess - w_class = 3.0 - - New() - ..() - spawn(4) // If an admin spawned it, it won't have a watertank it, so lets make one for em! - var tank = locate(/obj/structure/reagent_dispensers/watertank) in contents - if( !tank ) - new /obj/structure/reagent_dispensers/watertank(src) - - -/obj/structure/reagent_dispensers/watertank/attackby(var/obj/item/robot_parts/S, mob/user as mob) - - if ((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm))) - ..() - return - - //Making a farmbot! - - var/obj/item/weapon/farmbot_arm_assembly/A = new /obj/item/weapon/farmbot_arm_assembly - - A.loc = src.loc - user << "You add the robot arm to the [src]" - src.loc = A //Place the water tank into the assembly, it will be needed for the finished bot - user.remove_from_mob(S) - del(S) - -/obj/item/weapon/farmbot_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if((istype(W, /obj/item/device/analyzer/plant_analyzer)) && (!src.build_step)) - src.build_step++ - user << "You add the plant analyzer to [src]!" - src.name = "farmbot assembly" - user.remove_from_mob(W) - del(W) - - else if(( istype(W, /obj/item/weapon/reagent_containers/glass/bucket)) && (src.build_step == 1)) - src.build_step++ - user << "You add a bucket to [src]!" - src.name = "farmbot assembly with bucket" - user.remove_from_mob(W) - del(W) - - else if(( istype(W, /obj/item/weapon/minihoe)) && (src.build_step == 2)) - src.build_step++ - user << "You add a minihoe to [src]!" - src.name = "farmbot assembly with bucket and minihoe" - user.remove_from_mob(W) - del(W) - - else if((isprox(W)) && (src.build_step == 3)) - src.build_step++ - user << "You complete the Farmbot! Beep boop." - var/obj/machinery/bot/farmbot/S = new /obj/machinery/bot/farmbot - for ( var/obj/structure/reagent_dispensers/watertank/wTank in src.contents ) - wTank.loc = S - S.tank = wTank - S.loc = get_turf(src) - S.name = src.created_name - user.remove_from_mob(W) - del(W) - del(src) - - else if(istype(W, /obj/item/weapon/pen)) - var/t = input(user, "Enter new robot name", src.name, src.created_name) as text - t = sanitize(t, MAX_NAME_LEN) - if (!t) - return - if (!in_range(src, usr) && src.loc != usr) - return - - src.created_name = t - -/obj/item/weapon/farmbot_arm_assembly/attack_hand(mob/user as mob) - return //it's a converted watertank, no you cannot pick it up and put it in your backpack \ No newline at end of file diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm deleted file mode 100644 index b3c1c0376f..0000000000 --- a/code/game/machinery/bots/floorbot.dm +++ /dev/null @@ -1,449 +0,0 @@ -//Floorbot assemblies -/obj/item/weapon/toolbox_tiles - desc = "It's a toolbox with tiles sticking out the top" - name = "tiles and toolbox" - icon = 'icons/obj/aibots.dmi' - icon_state = "toolbox_tiles" - force = 3.0 - throwforce = 10.0 - throw_speed = 2 - throw_range = 5 - w_class = 3.0 - var/created_name = "Floorbot" - -/obj/item/weapon/toolbox_tiles_sensor - desc = "It's a toolbox with tiles sticking out the top and a sensor attached" - name = "tiles, toolbox and sensor arrangement" - icon = 'icons/obj/aibots.dmi' - icon_state = "toolbox_tiles_sensor" - force = 3.0 - throwforce = 10.0 - throw_speed = 2 - throw_range = 5 - w_class = 3.0 - var/created_name = "Floorbot" - -//Floorbot -/obj/machinery/bot/floorbot - name = "Floorbot" - desc = "A little floor repairing robot, he looks so excited!" - icon = 'icons/obj/aibots.dmi' - icon_state = "floorbot0" - layer = 5.0 - density = 0 - anchored = 0 - health = 25 - maxhealth = 25 - //weight = 1.0E7 - var/amount = 10 - var/repairing = 0 - var/improvefloors = 0 - var/eattiles = 0 - var/maketiles = 0 - var/turf/target - var/turf/oldtarget - var/oldloc = null - req_access = list(access_construction) - var/path[] = new() - var/targetdirection - - -/obj/machinery/bot/floorbot/New() - ..() - src.updateicon() - -/obj/machinery/bot/floorbot/turn_on() - . = ..() - src.updateicon() - src.updateUsrDialog() - -/obj/machinery/bot/floorbot/turn_off() - ..() - src.target = null - src.oldtarget = null - src.oldloc = null - src.updateicon() - src.path = new() - src.updateUsrDialog() - -/obj/machinery/bot/floorbot/attack_hand(mob/user as mob) - . = ..() - if (.) - return - usr.set_machine(src) - interact(user) - -/obj/machinery/bot/floorbot/interact(mob/user as mob) - var/dat - dat += "Automatic Station Floor Repairer v1.0

    " - dat += "Status: [src.on ? "On" : "Off"]
    " - dat += "Maintenance panel is [src.open ? "opened" : "closed"]
    " - dat += "Tiles left: [src.amount]
    " - dat += "Behvaiour controls are [src.locked ? "locked" : "unlocked"]
    " - if(!src.locked || issilicon(user)) - dat += "Improves floors: [src.improvefloors ? "Yes" : "No"]
    " - dat += "Finds tiles: [src.eattiles ? "Yes" : "No"]
    " - dat += "Make singles pieces of metal into tiles when empty: [src.maketiles ? "Yes" : "No"]
    " - var/bmode - if (src.targetdirection) - bmode = dir2text(src.targetdirection) - else - bmode = "Disabled" - dat += "

    Bridge Mode : [bmode]
    " - - user << browse("Repairbot v1.0 controls[dat]", "window=autorepair") - onclose(user, "autorepair") - return - - -/obj/machinery/bot/floorbot/attackby(var/obj/item/W , mob/user as mob) - if(istype(W, /obj/item/stack/tile/plasteel)) - var/obj/item/stack/tile/plasteel/T = W - if(src.amount >= 50) - return - var/loaded = min(50-src.amount, T.get_amount()) - T.use(loaded) - src.amount += loaded - user << "You load [loaded] tiles into the floorbot. He now contains [src.amount] tiles." - src.updateicon() - else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if(src.allowed(usr) && !open && !emagged) - src.locked = !src.locked - user << "You [src.locked ? "lock" : "unlock"] the [src] behaviour controls." - else - if(emagged) - user << "ERROR" - if(open) - user << "Please close the access panel before locking it." - else - user << "Access denied." - src.updateUsrDialog() - else - ..() - -/obj/machinery/bot/floorbot/Emag(mob/user as mob) - ..() - if(open && !locked) - if(user) user << "The [src] buzzes and beeps." - -/obj/machinery/bot/floorbot/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - switch(href_list["operation"]) - if("start") - if (src.on) - turn_off() - else - turn_on() - if("improve") - src.improvefloors = !src.improvefloors - src.updateUsrDialog() - if("tiles") - src.eattiles = !src.eattiles - src.updateUsrDialog() - if("make") - src.maketiles = !src.maketiles - src.updateUsrDialog() - if("bridgemode") - switch(src.targetdirection) - if(null) - targetdirection = 1 - if(1) - targetdirection = 2 - if(2) - targetdirection = 4 - if(4) - targetdirection = 8 - if(8) - targetdirection = null - else - targetdirection = null - src.updateUsrDialog() - -/obj/machinery/bot/floorbot/process() - set background = 1 - - if(!src.on) - return - if(src.repairing) - return - var/list/floorbottargets = list() - if(src.amount <= 0 && ((src.target == null) || !src.target)) - if(src.eattiles) - for(var/obj/item/stack/tile/plasteel/T in view(7, src)) - if(T != src.oldtarget && !(target in floorbottargets)) - src.oldtarget = T - src.target = T - break - if(src.target == null || !src.target) - if(src.maketiles) - if(src.target == null || !src.target) - for(var/obj/item/stack/sheet/metal/M in view(7, src)) - if(!(M in floorbottargets) && M != src.oldtarget && M.amount == 1 && !(istype(M.loc, /turf/simulated/wall))) - src.oldtarget = M - src.target = M - break - else - return - if(prob(5)) - visible_message("[src] makes an excited booping beeping sound!") - - if((!src.target || src.target == null) && emagged < 2) - if(targetdirection != null) - /* - for (var/turf/space/D in view(7,src)) - if(!(D in floorbottargets) && D != src.oldtarget) // Added for bridging mode -- TLE - if(get_dir(src, D) == targetdirection) - src.oldtarget = D - src.target = D - break - */ - var/turf/T = get_step(src, targetdirection) - if(istype(T, /turf/space)) - src.oldtarget = T - src.target = T - if(!src.target || src.target == null) - for (var/turf/space/D in view(7,src)) - if(!(D in floorbottargets) && D != src.oldtarget && (D.loc.name != "Space")) - src.oldtarget = D - src.target = D - break - if((!src.target || src.target == null ) && src.improvefloors) - for (var/turf/simulated/floor/F in view(7,src)) - if(!(F in floorbottargets) && F != src.oldtarget && F.icon_state == "Floor1" && !(istype(F, /turf/simulated/floor/plating))) - src.oldtarget = F - src.target = F - break - if((!src.target || src.target == null) && src.eattiles) - for(var/obj/item/stack/tile/plasteel/T in view(7, src)) - if(!(T in floorbottargets) && T != src.oldtarget) - src.oldtarget = T - src.target = T - break - - if((!src.target || src.target == null) && emagged == 2) - if(!src.target || src.target == null) - for (var/turf/simulated/floor/D in view(7,src)) - if(!(D in floorbottargets) && D != src.oldtarget && D.floor_type) - src.oldtarget = D - src.target = D - break - - if(!src.target || src.target == null) - if(src.loc != src.oldloc) - src.oldtarget = null - return - - if(src.target && (src.target != null) && src.path.len == 0) - spawn(0) - if(!istype(src.target, /turf/)) - src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard) - else - src.path = AStar(src.loc, src.target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard) - if (!src.path) src.path = list() - if(src.path.len == 0) - src.oldtarget = src.target - src.target = null - return - if(src.path.len > 0 && src.target && (src.target != null)) - step_to(src, src.path[1]) - src.path -= src.path[1] - else if(src.path.len == 1) - step_to(src, target) - src.path = new() - - if(src.loc == src.target || src.loc == src.target.loc) - if(istype(src.target, /obj/item/stack/tile/plasteel)) - src.eattile(src.target) - else if(istype(src.target, /obj/item/stack/sheet/metal)) - src.maketile(src.target) - else if(istype(src.target, /turf/) && emagged < 2) - repair(src.target) - else if(emagged == 2 && istype(src.target,/turf/simulated/floor)) - var/turf/simulated/floor/F = src.target - src.anchored = 1 - src.repairing = 1 - if(prob(90)) - F.break_tile_to_plating() - else - F.ReplaceWithLattice() - visible_message("\red [src] makes an excited booping sound.") - spawn(50) - src.amount ++ - src.anchored = 0 - src.repairing = 0 - src.target = null - src.path = new() - return - - src.oldloc = src.loc - - -/obj/machinery/bot/floorbot/proc/repair(var/turf/target) - if(istype(target, /turf/space/)) - if(target.loc.name == "Space") - return - else if(!istype(target, /turf/simulated/floor)) - return - if(src.amount <= 0) - return - src.anchored = 1 - src.icon_state = "floorbot-c" - if(istype(target, /turf/space/)) - visible_message("\red [src] begins to repair the hole") - var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel - src.repairing = 1 - spawn(50) - T.build(src.loc) - src.repairing = 0 - src.amount -= 1 - src.updateicon() - src.anchored = 0 - src.target = null - else - visible_message("\red [src] begins to improve the floor.") - src.repairing = 1 - spawn(50) - src.loc.icon_state = "floor" - src.repairing = 0 - src.amount -= 1 - src.updateicon() - src.anchored = 0 - src.target = null - -/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T) - if(!istype(T, /obj/item/stack/tile/plasteel)) - return - visible_message("\red [src] begins to collect tiles.") - src.repairing = 1 - spawn(20) - if(isnull(T)) - src.target = null - src.repairing = 0 - return - if(src.amount + T.get_amount() > 50) - var/i = 50 - src.amount - src.amount += i - T.use(i) - else - src.amount += T.get_amount() - del(T) - src.updateicon() - src.target = null - src.repairing = 0 - -/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/stack/sheet/metal/M) - if(!istype(M, /obj/item/stack/sheet/metal)) - return - if(M.get_amount() > 1) - return - visible_message("\red [src] begins to create tiles.") - src.repairing = 1 - spawn(20) - if(isnull(M)) - src.target = null - src.repairing = 0 - return - var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel - T.amount = 4 - T.loc = M.loc - del(M) - src.target = null - src.repairing = 0 - -/obj/machinery/bot/floorbot/proc/updateicon() - if(src.amount > 0) - src.icon_state = "floorbot[src.on]" - else - src.icon_state = "floorbot[src.on]e" - -/obj/machinery/bot/floorbot/explode() - src.on = 0 - src.visible_message("\red [src] blows apart!", 1) - var/turf/Tsec = get_turf(src) - - var/obj/item/weapon/storage/toolbox/mechanical/N = new /obj/item/weapon/storage/toolbox/mechanical(Tsec) - N.contents = list() - - new /obj/item/device/assembly/prox_sensor(Tsec) - - if (prob(50)) - new /obj/item/robot_parts/l_arm(Tsec) - - while (amount)//Dumps the tiles into the appropriate sized stacks - if(amount >= 16) - var/obj/item/stack/tile/plasteel/T = new (Tsec) - T.amount = 16 - amount -= 16 - else - var/obj/item/stack/tile/plasteel/T = new (Tsec) - T.amount = src.amount - amount = 0 - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - del(src) - return - - -/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/plasteel/T, mob/user as mob) - if(!istype(T, /obj/item/stack/tile/plasteel)) - ..() - return - if(src.contents.len >= 1) - user << "They wont fit in as there is already stuff inside." - return - if(user.s_active) - user.s_active.close(user) - if (T.use(10)) - var/obj/item/weapon/toolbox_tiles/B = new /obj/item/weapon/toolbox_tiles - user.put_in_hands(B) - user << "You add the tiles into the empty toolbox. They protrude from the top." - user.drop_from_inventory(src) - del(src) - else - user << "You need 10 floortiles for a floorbot." - return - -/obj/item/weapon/toolbox_tiles/attackby(var/obj/item/W, mob/user as mob) - ..() - if(isprox(W)) - del(W) - var/obj/item/weapon/toolbox_tiles_sensor/B = new /obj/item/weapon/toolbox_tiles_sensor() - B.created_name = src.created_name - user.put_in_hands(B) - user << "You add the sensor to the toolbox and tiles!" - user.drop_from_inventory(src) - del(src) - - else if (istype(W, /obj/item/weapon/pen)) - var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) - if (!t) - return - if (!in_range(src, usr) && src.loc != usr) - return - - src.created_name = t - -/obj/item/weapon/toolbox_tiles_sensor/attackby(var/obj/item/W, mob/user as mob) - ..() - if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) - del(W) - var/turf/T = get_turf(user.loc) - var/obj/machinery/bot/floorbot/A = new /obj/machinery/bot/floorbot(T) - A.name = src.created_name - user << "You add the robot arm to the odd looking toolbox assembly! Boop beep!" - user.drop_from_inventory(src) - del(src) - else if (istype(W, /obj/item/weapon/pen)) - var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) - - if (!t) - return - if (!in_range(src, usr) && src.loc != usr) - return - - src.created_name = t diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm deleted file mode 100644 index 8ce3522707..0000000000 --- a/code/game/machinery/bots/medbot.dm +++ /dev/null @@ -1,596 +0,0 @@ -//MEDBOT -//MEDBOT PATHFINDING -//MEDBOT ASSEMBLY - - -/obj/machinery/bot/medbot - name = "Medibot" - desc = "A little medical robot. He looks somewhat underwhelmed." - icon = 'icons/obj/aibots.dmi' - icon_state = "medibot0" - layer = 5.0 - density = 0 - anchored = 0 - health = 20 - maxhealth = 20 - req_access =list(access_medical) - var/stunned = 0 //It can be stunned by tasers. Delicate circuits. -//var/emagged = 0 - var/list/botcard_access = list(access_medical) - var/obj/item/weapon/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents. - var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits. - var/frustration = 0 - var/path[] = new() - var/mob/living/carbon/patient = null - var/mob/living/carbon/oldpatient = null - var/oldloc = null - var/last_found = 0 - var/last_newpatient_speak = 0 //Don't spam the "HEY I'M COMING" messages - var/currently_healing = 0 - var/injection_amount = 15 //How much reagent do we inject at a time? - var/heal_threshold = 10 //Start healing when they have this much damage in a category - var/use_beaker = 0 //Use reagents in beaker instead of default treatment agents. - //Setting which reagents to use to treat what by default. By id. - var/treatment_brute = "tricordrazine" - var/treatment_oxy = "tricordrazine" - var/treatment_fire = "tricordrazine" - var/treatment_tox = "tricordrazine" - var/treatment_virus = "spaceacillin" - var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds? - var/shut_up = 0 //self explanatory :) - -/obj/machinery/bot/medbot/mysterious - name = "Mysterious Medibot" - desc = "International Medibot of mystery." - skin = "bezerk" - treatment_oxy = "dexalinp" - treatment_brute = "bicaridine" - treatment_fire = "kelotane" - treatment_tox = "anti_toxin" - -/obj/item/weapon/firstaid_arm_assembly - name = "first aid/robot arm assembly" - desc = "A first aid kit with a robot arm permanently grafted to it." - icon = 'icons/obj/aibots.dmi' - icon_state = "firstaid_arm" - var/build_step = 0 - var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess - var/skin = null //Same as medbot, set to tox or ointment for the respective kits. - w_class = 3.0 - - New() - ..() - spawn(5) - if(src.skin) - src.overlays += image('icons/obj/aibots.dmi', "kit_skin_[src.skin]") - - -/obj/machinery/bot/medbot/New() - ..() - src.icon_state = "medibot[src.on]" - - spawn(4) - if(src.skin) - src.overlays += image('icons/obj/aibots.dmi', "medskin_[src.skin]") - - src.botcard = new /obj/item/weapon/card/id(src) - if(isnull(src.botcard_access) || (src.botcard_access.len < 1)) - src.botcard.access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) - else - src.botcard.access = src.botcard_access - -/obj/machinery/bot/medbot/turn_on() - . = ..() - src.icon_state = "medibot[src.on]" - src.updateUsrDialog() - -/obj/machinery/bot/medbot/turn_off() - ..() - src.patient = null - src.oldpatient = null - src.oldloc = null - src.path = new() - src.currently_healing = 0 - src.last_found = world.time - src.icon_state = "medibot[src.on]" - src.updateUsrDialog() - -/obj/machinery/bot/medbot/attack_hand(mob/user as mob) - . = ..() - if (.) - return - var/dat - dat += "Automatic Medical Unit v1.0

    " - dat += "Status: [src.on ? "On" : "Off"]
    " - dat += "Maintenance panel is [src.open ? "opened" : "closed"]
    " - dat += "Beaker: " - if (src.reagent_glass) - dat += "Loaded \[[src.reagent_glass.reagents.total_volume]/[src.reagent_glass.reagents.maximum_volume]\]" - else - dat += "None Loaded" - dat += "
    Behaviour controls are [src.locked ? "locked" : "unlocked"]
    " - if(!src.locked || issilicon(user)) - dat += "Healing Threshold: " - dat += "-- " - dat += "- " - dat += "[src.heal_threshold] " - dat += "+ " - dat += "++" - dat += "
    " - - dat += "Injection Level: " - dat += "- " - dat += "[src.injection_amount] " - dat += "+ " - dat += "
    " - - dat += "Reagent Source: " - dat += "[src.use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]
    " - - dat += "Treatment report is [src.declare_treatment ? "on" : "off"]. Toggle
    " - - dat += "The speaker switch is [src.shut_up ? "off" : "on"]. Toggle
    " - - user << browse("Medibot v1.0 controls[dat]", "window=automed") - onclose(user, "automed") - return - -/obj/machinery/bot/medbot/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - if ((href_list["power"]) && (src.allowed(usr))) - if (src.on) - turn_off() - else - turn_on() - - else if((href_list["adj_threshold"]) && (!src.locked || issilicon(usr))) - var/adjust_num = text2num(href_list["adj_threshold"]) - src.heal_threshold += adjust_num - if(src.heal_threshold < 5) - src.heal_threshold = 5 - if(src.heal_threshold > 75) - src.heal_threshold = 75 - - else if((href_list["adj_inject"]) && (!src.locked || issilicon(usr))) - var/adjust_num = text2num(href_list["adj_inject"]) - src.injection_amount += adjust_num - if(src.injection_amount < 5) - src.injection_amount = 5 - if(src.injection_amount > 15) - src.injection_amount = 15 - - else if((href_list["use_beaker"]) && (!src.locked || issilicon(usr))) - src.use_beaker = !src.use_beaker - - else if (href_list["eject"] && (!isnull(src.reagent_glass))) - if(!src.locked) - src.reagent_glass.loc = get_turf(src) - src.reagent_glass = null - else - usr << "You cannot eject the beaker because the panel is locked." - - else if ((href_list["togglevoice"]) && (!src.locked || issilicon(usr))) - src.shut_up = !src.shut_up - - else if ((href_list["declaretreatment"]) && (!src.locked || issilicon(usr))) - src.declare_treatment = !src.declare_treatment - - src.updateUsrDialog() - return - -/obj/machinery/bot/medbot/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (src.allowed(user) && !open && !emagged) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - src.updateUsrDialog() - else - if(emagged) - user << "ERROR" - if(open) - user << "Please close the access panel before locking it." - else - user << "Access denied." - - else if (istype(W, /obj/item/weapon/reagent_containers/glass)) - if(src.locked) - user << "You cannot insert a beaker because the panel is locked." - return - if(!isnull(src.reagent_glass)) - user << "There is already a beaker loaded." - return - - user.drop_item() - W.loc = src - src.reagent_glass = W - user << "You insert [W]." - src.updateUsrDialog() - return - - else - ..() - if (health < maxhealth && !istype(W, /obj/item/weapon/screwdriver) && W.force) - step_to(src, (get_step_away(src,user))) - -/obj/machinery/bot/medbot/Emag(mob/user as mob) - ..() - if(open && !locked) - if(user) user << "You short out [src]'s reagent synthesis circuits." - spawn(0) - for(var/mob/O in hearers(src, null)) - O.show_message("\red [src] buzzes oddly!", 1) - flick("medibot_spark", src) - src.patient = null - if(user) src.oldpatient = user - src.currently_healing = 0 - src.last_found = world.time - src.anchored = 0 - src.emagged = 2 - src.on = 1 - src.icon_state = "medibot[src.on]" - -/obj/machinery/bot/medbot/process() - set background = 1 - - if(!src.on) - src.stunned = 0 - return - - if(src.stunned) - src.icon_state = "medibota" - src.stunned-- - - src.oldpatient = src.patient - src.patient = null - src.currently_healing = 0 - - if(src.stunned <= 0) - src.icon_state = "medibot[src.on]" - src.stunned = 0 - return - - if(src.frustration > 8) - src.oldpatient = src.patient - src.patient = null - src.currently_healing = 0 - src.last_found = world.time - src.path = new() - - if(!src.patient) - if(!src.shut_up && prob(1)) - var/message = pick("Radar, put a mask on!","There's always a catch, and it's the best there is.","I knew it, I should've been a plastic surgeon.","What kind of medbay is this? Everyone's dropping like dead flies.","Delicious!") - src.speak(message) - - for (var/mob/living/carbon/C in view(7,src)) //Time to find a patient! - if ((C.stat == 2) || !istype(C, /mob/living/carbon/human)) - continue - - if ((C == src.oldpatient) && (world.time < src.last_found + 100)) - continue - - if(src.assess_patient(C)) - src.patient = C - src.oldpatient = C - src.last_found = world.time - if((src.last_newpatient_speak + 300) < world.time) //Don't spam these messages! - var/message = pick("Hey, [C.name]! Hold on, I'm coming.","Wait [C.name]! I want to help!","[C.name], you appear to be injured!") - src.speak(message) - src.visible_message("[src] points at [C.name]!") - src.last_newpatient_speak = world.time - break - else - continue - - - if(src.patient && Adjacent(patient)) - if(!src.currently_healing) - src.currently_healing = 1 - src.frustration = 0 - src.medicate_patient(src.patient) - return - - else if(src.patient && (src.path.len) && (get_dist(src.patient,src.path[src.path.len]) > 2)) - src.path = new() - src.currently_healing = 0 - src.last_found = world.time - - if(src.patient && src.path.len == 0 && (get_dist(src,src.patient) > 1)) - spawn(0) - src.path = AStar(src.loc, get_turf(src.patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30,id=botcard) - if (!path) path = list() - if(src.path.len == 0) - src.oldpatient = src.patient - src.patient = null - src.currently_healing = 0 - src.last_found = world.time - return - - if(src.path.len > 0 && src.patient) - step_to(src, src.path[1]) - src.path -= src.path[1] - spawn(3) - if(src.path.len) - step_to(src, src.path[1]) - src.path -= src.path[1] - - if(src.path.len > 8 && src.patient) - src.frustration++ - - return - -/obj/machinery/bot/medbot/proc/assess_patient(mob/living/carbon/C as mob) - //Time to see if they need medical help! - if(C.stat == 2) - return 0 //welp too late for them! - - if(C.suiciding) - return 0 //Kevorkian school of robotic medical assistants. - - if(src.emagged == 2) //Everyone needs our medicine. (Our medicine is toxins) - return 1 - - //If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS. - if((src.reagent_glass) && (src.use_beaker) && ((C.getBruteLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getOxyLoss() >= (heal_threshold + 15)))) - for(var/datum/reagent/R in src.reagent_glass.reagents.reagent_list) - if(!C.reagents.has_reagent(R)) - return 1 - continue - - //They're injured enough for it! - if((C.getBruteLoss() >= heal_threshold) && (!C.reagents.has_reagent(src.treatment_brute))) - return 1 //If they're already medicated don't bother! - - if((C.getOxyLoss() >= (15 + heal_threshold)) && (!C.reagents.has_reagent(src.treatment_oxy))) - return 1 - - if((C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(src.treatment_fire))) - return 1 - - if((C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(src.treatment_tox))) - return 1 - - - for(var/datum/disease/D in C.viruses) - if((D.stage > 1) || (D.spread_type == AIRBORNE)) - - if (!C.reagents.has_reagent(src.treatment_virus)) - return 1 //STOP DISEASE FOREVER - - return 0 - -/obj/machinery/bot/medbot/proc/medicate_patient(mob/living/carbon/C as mob) - if(!src.on) - return - - if(!istype(C)) - src.oldpatient = src.patient - src.patient = null - src.currently_healing = 0 - src.last_found = world.time - return - - if(C.stat == 2) - var/death_message = pick("No! NO!","Live, damnit! LIVE!","I...I've never lost a patient before. Not today, I mean.") - src.speak(death_message) - src.oldpatient = src.patient - src.patient = null - src.currently_healing = 0 - src.last_found = world.time - return - - var/reagent_id = null - - //Use whatever is inside the loaded beaker. If there is one. - if((src.use_beaker) && (src.reagent_glass) && (src.reagent_glass.reagents.total_volume)) - reagent_id = "internal_beaker" - - if(src.emagged == 2) //Emagged! Time to poison everybody. - reagent_id = "toxin" - - var/virus = 0 - for(var/datum/disease/D in C.viruses) - virus = 1 - - if (!reagent_id && (virus)) - if(!C.reagents.has_reagent(src.treatment_virus)) - reagent_id = src.treatment_virus - - if (!reagent_id && (C.getBruteLoss() >= heal_threshold)) - if(!C.reagents.has_reagent(src.treatment_brute)) - reagent_id = src.treatment_brute - - if (!reagent_id && (C.getOxyLoss() >= (15 + heal_threshold))) - if(!C.reagents.has_reagent(src.treatment_oxy)) - reagent_id = src.treatment_oxy - - if (!reagent_id && (C.getFireLoss() >= heal_threshold)) - if(!C.reagents.has_reagent(src.treatment_fire)) - reagent_id = src.treatment_fire - - if (!reagent_id && (C.getToxLoss() >= heal_threshold)) - if(!C.reagents.has_reagent(src.treatment_tox)) - reagent_id = src.treatment_tox - - if(!reagent_id) //If they don't need any of that they're probably cured! - src.oldpatient = src.patient - src.patient = null - src.currently_healing = 0 - src.last_found = world.time - var/message = pick("All patched up!","An apple a day keeps me away.","Feel better soon!") - src.speak(message) - return - else - src.icon_state = "medibots" - visible_message("\red [src] is trying to inject [src.patient]!") - spawn(30) - if ((get_dist(src, src.patient) <= 1) && (src.on)) - if((reagent_id == "internal_beaker") && (src.reagent_glass) && (src.reagent_glass.reagents.total_volume)) - src.reagent_glass.reagents.trans_to(src.patient,src.injection_amount) //Inject from beaker instead. - src.reagent_glass.reagents.reaction(src.patient, 2) - else - src.patient.reagents.add_reagent(reagent_id,src.injection_amount) - visible_message("\red [src] injects [src.patient] with the syringe!") - - if(declare_treatment) - var/area/location = get_area(src) - broadcast_medical_hud_message("[src.name] is treating [C] in [location]", src) - - src.icon_state = "medibot[src.on]" - src.currently_healing = 0 - return - -// src.speak(reagent_id) - reagent_id = null - return - - -/obj/machinery/bot/medbot/proc/speak(var/message) - if((!src.on) || (!message)) - return - visible_message("[src] beeps, \"[message]\"") - return - -/obj/machinery/bot/medbot/bullet_act(var/obj/item/projectile/Proj) - if(Proj.taser_effect) - src.stunned = min(stunned+10,20) - ..() - -/obj/machinery/bot/medbot/explode() - src.on = 0 - visible_message("\red [src] blows apart!", 1) - var/turf/Tsec = get_turf(src) - - new /obj/item/weapon/storage/firstaid(Tsec) - - new /obj/item/device/assembly/prox_sensor(Tsec) - - new /obj/item/device/healthanalyzer(Tsec) - - if(src.reagent_glass) - src.reagent_glass.loc = Tsec - src.reagent_glass = null - - if (prob(50)) - new /obj/item/robot_parts/l_arm(Tsec) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - del(src) - return - -/obj/machinery/bot/medbot/Bump(M as mob|obj) //Leave no door unopened! - if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard))) - var/obj/machinery/door/D = M - if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/blast)) - D.open() - src.frustration = 0 - else if ((istype(M, /mob/living/)) && (!src.anchored)) - src.loc = M:loc - src.frustration = 0 - return - -/* terrible -/obj/machinery/bot/medbot/Bumped(atom/movable/M as mob|obj) - spawn(0) - if (M) - var/turf/T = get_turf(src) - M:loc = T -*/ - -/* - * Pathfinding procs, allow the medibot to path through doors it has access to. - */ - -//Pretty ugh -/* -/turf/proc/AdjacentTurfsAllowMedAccess() - var/L[] = new() - for(var/turf/t in oview(src,1)) - if(!t.density) - if(!LinkBlocked(src, t) && !TurfBlockedNonWindowNonDoor(t,get_access("Medical Doctor"))) - L.Add(t) - return L - - -//It isn't blocked if we can open it, man. -/proc/TurfBlockedNonWindowNonDoor(turf/loc, var/list/access) - for(var/obj/O in loc) - if(O.density && !istype(O, /obj/structure/window) && !istype(O, /obj/machinery/door)) - return 1 - - if (O.density && (istype(O, /obj/machinery/door)) && (access.len)) - var/obj/machinery/door/D = O - for(var/req in D.req_access) - if(!(req in access)) //doesn't have this access - return 1 - - return 0 -*/ - -/* - * Medbot Assembly -- Can be made out of all three medkits. - */ - -/obj/item/weapon/storage/firstaid/attackby(var/obj/item/robot_parts/S, mob/user as mob) - - if ((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm))) - ..() - return - - //Making a medibot! - if(src.contents.len >= 1) - user << "You need to empty [src] out first." - return - - var/obj/item/weapon/firstaid_arm_assembly/A = new /obj/item/weapon/firstaid_arm_assembly - if(istype(src,/obj/item/weapon/storage/firstaid/fire)) - A.skin = "ointment" - else if(istype(src,/obj/item/weapon/storage/firstaid/toxin)) - A.skin = "tox" - else if(istype(src,/obj/item/weapon/storage/firstaid/o2)) - A.skin = "o2" - - del(S) - user.put_in_hands(A) - user << "You add the robot arm to the first aid kit." - user.drop_from_inventory(src) - del(src) - - -/obj/item/weapon/firstaid_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if(istype(W, /obj/item/weapon/pen)) - var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) - if (!t) - return - if (!in_range(src, usr) && src.loc != usr) - return - src.created_name = t - else - switch(build_step) - if(0) - if(istype(W, /obj/item/device/healthanalyzer)) - user.drop_item() - del(W) - src.build_step++ - user << "You add the health sensor to [src]." - src.name = "First aid/robot arm/health analyzer assembly" - src.overlays += image('icons/obj/aibots.dmi', "na_scanner") - - if(1) - if(isprox(W)) - user.drop_item() - del(W) - src.build_step++ - user << "You complete the Medibot! Beep boop." - var/turf/T = get_turf(src) - var/obj/machinery/bot/medbot/S = new /obj/machinery/bot/medbot(T) - S.skin = src.skin - S.name = src.created_name - user.drop_from_inventory(src) - del(src) - diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index bd39d2034c..125345c518 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -76,6 +76,12 @@ suffix = "#[count]" name = "Mulebot ([suffix])" +/obj/machinery/bot/mulebot/Destroy() + if(radio_controller) + radio_controller.remove_object(src,beacon_freq) + radio_controller.remove_object(src,control_freq) + ..() + // attack by item // emag : lock/unlock, // screwdriver: open/close hatch @@ -862,8 +868,8 @@ var/turf/Tsec = get_turf(src) new /obj/item/device/assembly/prox_sensor(Tsec) - new /obj/item/stack/rods(Tsec) - new /obj/item/stack/rods(Tsec) + PoolOrNew(/obj/item/stack/rods, Tsec) + PoolOrNew(/obj/item/stack/rods, Tsec) new /obj/item/stack/cable_coil/cut(Tsec) if (cell) cell.loc = Tsec @@ -876,4 +882,4 @@ new /obj/effect/decal/cleanable/blood/oil(src.loc) unload(0) - del(src) + qdel(src) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm deleted file mode 100644 index 92b7297c42..0000000000 --- a/code/game/machinery/bots/secbot.dm +++ /dev/null @@ -1,924 +0,0 @@ -/obj/machinery/bot/secbot - name = "Securitron" - desc = "A little security robot. He looks less than thrilled." - icon = 'icons/obj/aibots.dmi' - icon_state = "secbot0" - layer = 5.0 - density = 0 - anchored = 0 - health = 25 - maxhealth = 25 - fire_dam_coeff = 0.7 - brute_dam_coeff = 0.5 - req_one_access = list(access_security, access_forensics_lockers) - - var/mob/target - var/oldtarget_name - var/threatlevel = 0 - var/target_lastloc //Loc of target when arrested. - var/last_found //There's a delay - var/frustration = 0 - - var/idcheck = 0 //If false, all station IDs are authorized for weapons. - var/check_records = 0 //Does it check security records? - var/check_arrest = 1 //Does it check arrest status? - var/arrest_type = 0 //If true, don't handcuff - var/declare_arrests = 0 //When making an arrest, should it notify everyone wearing sechuds? - - var/has_laser = 0 - var/next_harm_time = 0 - var/lastfired = 0 - var/shot_delay = 3 //.3 seconds between shots - var/lasercolor = "" - var/projectile = null//Holder for projectile type, to avoid so many else if chains - var/disabled = 0//A holder for if it needs to be disabled, if true it will not seach for targets, shoot at targets, or move, currently only used for lasertag - - var/mode = 0 -#define SECBOT_IDLE 0 // idle -#define SECBOT_HUNT 1 // found target, hunting -#define SECBOT_PREP_ARREST 2 // at target, preparing to arrest -#define SECBOT_ARREST 3 // arresting target -#define SECBOT_START_PATROL 4 // start patrol -#define SECBOT_PATROL 5 // patrolling -#define SECBOT_SUMMON 6 // summoned by PDA - - var/auto_patrol = 0 // set to make bot automatically patrol - - var/beacon_freq = 1445 // navigation beacon frequency - var/control_freq = AI_FREQ // bot control frequency - - - var/turf/patrol_target // this is turf to navigate to (location of beacon) - var/new_destination // pending new destination (waiting for beacon response) - var/destination // destination description tag - var/next_destination // the next destination in the patrol route - var/list/path = new // list of path turfs - - var/blockcount = 0 //number of times retried a blocked path - var/awaiting_beacon = 0 // count of pticks awaiting a beacon response - - var/nearest_beacon // the nearest beacon's tag - var/turf/nearest_beacon_loc // the nearest beacon's location - - var/bot_version = "1.3" - var/search_range = 7 - var/is_attacking = 0 - - var/obj/item/weapon/secbot_assembly = /obj/item/weapon/secbot_assembly - - var/list/threat_found_sounds = new('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg') - var/list/preparing_arrest_sounds = new('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg') - -/obj/machinery/bot/secbot/beepsky - name = "Officer Beep O'sky" - desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." - idcheck = 0 - auto_patrol = 1 - -/obj/item/weapon/secbot_assembly - name = "helmet/signaler assembly" - desc = "Some sort of bizarre assembly." - icon = 'icons/obj/aibots.dmi' - icon_state = "helmet_signaler" - item_state = "helmet" - var/build_step = 0 - var/created_name = "Securitron" //To preserve the name if it's a unique securitron I guess - -/obj/machinery/bot/secbot/New(loc, created_name, created_lasercolor) - ..() - if(created_name) name = created_name - if(created_lasercolor) lasercolor = created_lasercolor - update_icon() - spawn(3) - src.botcard = new /obj/item/weapon/card/id(src) - src.botcard.access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) - if(radio_controller) - radio_controller.add_object(src, control_freq, filter = RADIO_SECBOT) - radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS) - if(lasercolor) - shot_delay = 6 //Longer shot delay because JESUS CHRIST - check_arrest = 0 - check_records = 0 //Don't actively target people set to arrest - arrest_type = 1 //Don't even try to cuff - req_access = list(access_maint_tunnels) - arrest_type = 1 - if((lasercolor == "b") && (name == created_name))//Picks a name if there isn't already a custome one - name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT") - if((lasercolor == "r") && (name == created_name)) - name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT") - - -/obj/machinery/bot/secbot/update_icon() - if(on && is_attacking) - src.icon_state = "secbot-c" - else - src.icon_state = "secbot[src.on]" - -/obj/machinery/bot/secbot/turn_on() - ..() - update_icon() - src.updateUsrDialog() - -/obj/machinery/bot/secbot/turn_off() - ..() - src.target = null - src.oldtarget_name = null - src.anchored = 0 - src.mode = SECBOT_IDLE - walk_to(src,0) - update_icon() - src.updateUsrDialog() - -/obj/machinery/bot/secbot/attack_hand(mob/user as mob) - . = ..() - if(.) - return - usr.set_machine(src) - interact(user) - -/obj/machinery/bot/secbot/interact(mob/user as mob) - var/dat - - dat += text({" -Automatic Security Unit v[bot_version]

    -Status: []
    -Behaviour controls are [src.locked ? "locked" : "unlocked"]
    -Maintenance panel is [src.open ? "opened" : "closed"]"}, - -"[src.on ? "On" : "Off"]" ) - - if(!src.locked || issilicon(user)) - dat += text({"
    -Check for Weapon Authorization: []
    -Check Security Records: []
    -Check Arrest Status: []
    -Operating Mode: []
    -Report Arrests: []
    -Auto Patrol: []"}, - -"[src.idcheck ? "Yes" : "No"]", -"[src.check_records ? "Yes" : "No"]", -"[src.check_arrest ? "Yes" : "No"]", -"[src.arrest_type ? "Detain" : "Arrest"]", -"[src.declare_arrests ? "Yes" : "No"]", -"[auto_patrol ? "On" : "Off"]" ) - - - user << browse("Securitron v[bot_version] controls[dat]", "window=autosec") - onclose(user, "autosec") - return - -/obj/machinery/bot/secbot/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - if(lasercolor && (istype(usr,/mob/living/carbon/human))) - var/mob/living/carbon/human/H = usr - if((lasercolor == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))//Opposing team cannot operate it - return - else if((lasercolor == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag))) - return - if((href_list["power"]) && (src.allowed(usr))) - if(src.on) - turn_off() - else - turn_on() - src.updateUsrDialog() - return - - switch(href_list["operation"]) - if("idcheck") - src.idcheck = !src.idcheck - if("ignorerec") - src.check_records = !src.check_records - if("ignorearr") - src.check_arrest = !src.check_arrest - if("switchmode") - src.arrest_type = !src.arrest_type - if("patrol") - auto_patrol = !auto_patrol - mode = SECBOT_IDLE - if("declarearrests") - src.declare_arrests = !src.declare_arrests - src.updateUsrDialog() - -/obj/machinery/bot/secbot/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if(src.allowed(user) && !open && !emagged) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked" : "unlocked"]." - else - if(emagged) - user << "ERROR" - if(open) - user << "Please close the access panel before locking it." - else - user << "Access denied." - else - ..() - if(!istype(W, /obj/item/weapon/screwdriver) && W.force && !src.target) - src.target = user - if(lasercolor)//To make up for the fact that lasertag bots don't hunt - src.shootAt(user) - src.mode = SECBOT_HUNT - -/obj/machinery/bot/secbot/Emag(mob/user as mob) - ..() - if(open && !locked) - if(user) user << "You short out [src]'s target assessment circuits." - spawn(0) - for(var/mob/O in hearers(src, null)) - O.show_message("\red [src] buzzes oddly!", 1) - src.target = null - if(user) src.oldtarget_name = user.name - src.last_found = world.time - src.anchored = 0 - src.emagged = 2 - src.on = 1 - update_icon() - src.projectile = null - mode = SECBOT_IDLE - -/obj/machinery/bot/secbot/process() - set background = 1 - - if(!src.on) - return - - switch(mode) - - if(SECBOT_IDLE) // idle - walk_to(src,0) - look_for_perp() // see if any criminals are in range - if(!mode && auto_patrol) // still idle, and set to patrol - mode = SECBOT_START_PATROL // switch to patrol mode - - if(SECBOT_HUNT) // hunting for perp - // if can't reach perp for long enough, go idle - if(src.frustration >= 8) - // for(var/mob/O in hearers(src, null)) - // O << "[src] beeps, \"Backup requested! Suspect has evaded arrest.\"" - src.target = null - src.last_found = world.time - src.frustration = 0 - src.mode = 0 - walk_to(src,0) - - if(target) // make sure target exists - // We re-assess human targets, before bashing their head in, in case their credentials change - if(istype(target, /mob/living/carbon/human)) - var/threat = src.assess_perp(target, idcheck, check_records, check_arrest) - if(threat < 4) - frustration = 8 - return - - // The target must remain in view to complete the desire to bash its head in - if(!(target in view(search_range,src))) - frustration++ - return - - if(!lasercolor && Adjacent(target)) // If right next to perp. Lasertag bots do not arrest anyone, just patrol and shoot and whatnot - if(istype(src.target,/mob/living/carbon)) - playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - is_attacking = 1 - update_icon() - spawn(2) - is_attacking = 0 - update_icon() - var/mob/living/carbon/M = src.target - var/maxstuns = 4 - if(istype(M, /mob/living/carbon/human)) - if(M.stuttering < 10 && (!(HULK in M.mutations))) - M.stuttering = 10 - M.Stun(10) - M.Weaken(10) - else - M.Weaken(10) - M.stuttering = 10 - M.Stun(10) - maxstuns-- - if(maxstuns <= 0) - target = null - - if(declare_arrests) - var/area/location = get_area(src) - broadcast_security_hud_message("[src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] suspect [target] in [location]", src) - visible_message("\red [src.target] has been stunned by [src]!") - - mode = SECBOT_PREP_ARREST - src.anchored = 1 - src.target_lastloc = M.loc - return - else if(istype(src.target,/mob/living/simple_animal)) - //just harmbaton them until dead - if(world.time > next_harm_time) - next_harm_time = world.time + 15 - playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - visible_message("\red [src] beats [src.target] with the stun baton!") - update_icon() - spawn(2) - is_attacking = 0 - update_icon() - - var/mob/living/simple_animal/S = src.target - S.AdjustStunned(10) - S.adjustBruteLoss(15) - if(S.stat) - src.frustration = 8 - if(preparing_arrest_sounds.len > 0) - playsound(src.loc, pick(preparing_arrest_sounds), 50, 0) - else // not next to perp - var/turf/olddist = get_dist(src, src.target) - walk_to(src, target,1,4) - shootAt(target) - if((get_dist(src, src.target)) >= (olddist)) - src.frustration++ - else - src.frustration = 0 - else - src.frustration = 8 - - if(SECBOT_PREP_ARREST) // preparing to arrest target - if(src.lasercolor) - mode = SECBOT_IDLE - return - if(!target) - mode = SECBOT_IDLE - src.anchored = 0 - return - // see if he got away - if((get_dist(src, src.target) > 1) || ((src.target.loc != src.target_lastloc) && src.target.weakened < 2)) - src.anchored = 0 - mode = SECBOT_HUNT - return - - if(istype(src.target,/mob/living/carbon)) - var/mob/living/carbon/C = target - var/wearing_hardsuit - if(istype(C,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/rig)) - wearing_hardsuit = 1 - if(!wearing_hardsuit && !C.handcuffed && !src.arrest_type) - playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) - mode = SECBOT_ARREST - visible_message("\red [src] is trying to put handcuffs on [src.target]!") - - spawn(60) - if(get_dist(src, src.target) <= 1) - /*if(src.target.handcuffed) - return*/ - - if(istype(src.target,/mob/living/carbon)) - C = target - if(!C.handcuffed) - C.handcuffed = new /obj/item/weapon/handcuffs(target) - C.update_inv_handcuffed() //update the handcuffs overlay - - mode = SECBOT_IDLE - src.target = null - src.anchored = 0 - src.last_found = world.time - src.frustration = 0 - - if(preparing_arrest_sounds.len > 0) - playsound(src.loc, pick(preparing_arrest_sounds), 50, 0) - // var/arrest_message = pick("Have a secure day!","I AM THE LAW.", "God made tomorrow for the crooks we don't catch today.","You can't outrun a radio.") - // src.speak(arrest_message) - else - mode = SECBOT_IDLE - src.target = null - src.anchored = 0 - src.last_found = world.time - src.frustration = 0 - - if(SECBOT_ARREST) // arresting - if(src.lasercolor) - mode = SECBOT_IDLE - return - if(!target || !istype(target, /mob/living/carbon)) - src.anchored = 0 - mode = SECBOT_IDLE - return - else - var/mob/living/carbon/C = target - if(!C.handcuffed) - src.anchored = 0 - mode = SECBOT_IDLE - return - - - if(SECBOT_START_PATROL) // start a patrol - - if(path.len > 0 && patrol_target) // have a valid path, so just resume - mode = SECBOT_PATROL - return - - else if(patrol_target) // has patrol target already - spawn(0) - calc_path() // so just find a route to it - if(path.len == 0) - patrol_target = 0 - return - mode = SECBOT_PATROL - - - else // no patrol target, so need a new one - find_patrol_target() - speak("Engaging patrol mode.") - - - if(SECBOT_PATROL) // patrol mode - patrol_step() - spawn(5) - if(mode == SECBOT_PATROL) - patrol_step() - - if(SECBOT_SUMMON) // summoned to PDA - patrol_step() - spawn(4) - if(mode == SECBOT_SUMMON) - patrol_step() - sleep(4) - patrol_step() - - return - - -// perform a single patrol step -/obj/machinery/bot/secbot/proc/patrol_step() - if(loc == patrol_target) // reached target - at_patrol_target() - return - else if(path.len > 0 && patrol_target) // valid path - var/turf/next = path[1] - if(next == loc) - path -= next - return - - if(istype( next, /turf/simulated)) - var/moved = step_towards(src, next) // attempt to move - if(moved) // successful move - blockcount = 0 - path -= loc - - look_for_perp() - if(lasercolor) - sleep(20) - else // failed to move - blockcount++ - if(blockcount > 5) // attempt 5 times before recomputing - // find new path excluding blocked turf - - spawn(2) - calc_path(next) - if(path.len == 0) - find_patrol_target() - else - blockcount = 0 - return - return - else // not a valid turf - mode = SECBOT_IDLE - return - else // no path, so calculate new one - mode = SECBOT_START_PATROL - -// finds a new patrol target -/obj/machinery/bot/secbot/proc/find_patrol_target() - send_status() - if(awaiting_beacon) // awaiting beacon response - awaiting_beacon++ - if(awaiting_beacon > 5) // wait 5 secs for beacon response - find_nearest_beacon() // then go to nearest instead - return - - if(next_destination) - set_destination(next_destination) - else - find_nearest_beacon() - return - -// finds the nearest beacon to self -// signals all beacons matching the patrol code -/obj/machinery/bot/secbot/proc/find_nearest_beacon() - nearest_beacon = null - new_destination = "__nearest__" - post_signal(beacon_freq, "findbeacon", "patrol") - awaiting_beacon = 1 - spawn(10) - awaiting_beacon = 0 - if(nearest_beacon) - set_destination(nearest_beacon) - else - auto_patrol = 0 - mode = SECBOT_IDLE - speak("Disengaging patrol mode.") - send_status() - -/obj/machinery/bot/secbot/proc/at_patrol_target() - find_patrol_target() - return - -// sets the current destination -// signals all beacons matching the patrol code -// beacons will return a signal giving their locations -/obj/machinery/bot/secbot/proc/set_destination(var/new_dest) - new_destination = new_dest - post_signal(beacon_freq, "findbeacon", "patrol") - awaiting_beacon = 1 - - -// receive a radio signal -// used for beacon reception -/obj/machinery/bot/secbot/receive_signal(datum/signal/signal) - //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/bot/secbot/receive_signal([signal.debug_print()])") - if(!on) - return - - /* - world << "rec signal: [signal.source]" - for(var/x in signal.data) - world << "* [x] = [signal.data[x]]" - */ - - var/recv = signal.data["command"] - // process all-bot input - if(recv=="bot_status") - send_status() - - // check to see if we are the commanded bot - if(signal.data["active"] == src) - // process control input - switch(recv) - if("stop") - mode = SECBOT_IDLE - auto_patrol = 0 - return - - if("go") - mode = SECBOT_IDLE - auto_patrol = 1 - return - - if("summon") - patrol_target = signal.data["target"] - next_destination = destination - destination = null - awaiting_beacon = 0 - mode = SECBOT_SUMMON - calc_path() - speak("Responding.") - - return - - - - // receive response from beacon - recv = signal.data["beacon"] - var/valid = signal.data["patrol"] - if(!recv || !valid) - return - - if(recv == new_destination) // if the recvd beacon location matches the set destination - // the we will navigate there - destination = new_destination - patrol_target = signal.source.loc - next_destination = signal.data["next_patrol"] - awaiting_beacon = 0 - - // if looking for nearest beacon - else if(new_destination == "__nearest__") - var/dist = get_dist(src,signal.source.loc) - if(nearest_beacon) - - // note we ignore the beacon we are located at - if(dist>1 && dist 1) - nearest_beacon = recv - nearest_beacon_loc = signal.source.loc - return - - -// send a radio signal with a single data key/value pair -/obj/machinery/bot/secbot/proc/post_signal(var/freq, var/key, var/value) - post_signal_multiple(freq, list("[key]" = value) ) - -// send a radio signal with multiple data key/values -/obj/machinery/bot/secbot/proc/post_signal_multiple(var/freq, var/list/keyval) - - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) - - if(!frequency) return - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - //for(var/key in keyval) - // signal.data[key] = keyval[key] - signal.data = keyval - //world << "sent [key],[keyval[key]] on [freq]" - if(signal.data["findbeacon"]) - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - else if(signal.data["type"] == "secbot") - frequency.post_signal(src, signal, filter = RADIO_SECBOT) - else - frequency.post_signal(src, signal) - -// signals bot status etc. to controller -/obj/machinery/bot/secbot/proc/send_status() - var/list/kv = list( - "type" = "secbot", - "name" = name, - "loca" = loc.loc, // area - "mode" = mode - ) - post_signal_multiple(control_freq, kv) - -// calculates a path to the current destination -// given an optional turf to avoid -/obj/machinery/bot/secbot/proc/calc_path(var/turf/avoid = null) - src.path = AStar(src.loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id=botcard, exclude=avoid) - if(!path) path = list() - -// look for a criminal in view of the bot -/obj/machinery/bot/secbot/proc/look_for_perp() - if(src.disabled) - return - src.anchored = 0 - for(var/mob/living/M in view(search_range,src)) //Let's find us a criminal - if(M.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var - continue - - if(istype(M, /mob/living/carbon)) - var/mob/living/carbon/C = M - if(C.stat || C.handcuffed) - continue - - if(src.lasercolor && C.lying) - continue//Does not shoot at people lying down when in lasertag mode, because it's just annoying, and they can fire once they get up. - - if(C.name == src.oldtarget_name && world.time < src.last_found + 100) - continue - - if(istype(C, /mob/living/carbon/human)) - src.threatlevel = src.assess_perp(C, idcheck, check_records, check_arrest) - - else if(istype(M, /mob/living/simple_animal/hostile)) - if(M.stat == DEAD) - continue - else - src.threatlevel = 4 - - if(!src.threatlevel) - continue - - else if(M.stat != DEAD && src.threatlevel >= 4) - src.target = M - src.oldtarget_name = M.name - src.speak("Level [src.threatlevel] infraction alert!") - if(!src.lasercolor && threat_found_sounds.len > 0) - playsound(src.loc, pick(threat_found_sounds), 50, 0) - src.visible_message("[src] points at [M.name]!") - - mode = SECBOT_HUNT - spawn(0) - process() // ensure bot quickly responds to a perp - break - else - continue - -/obj/machinery/bot/secbot/on_assess_perp(mob/living/carbon/human/perp) - if(lasercolor) - return laser_check(perp, lasercolor) - - var/threat = 0 - threat -= laser_check(perp, "b") - threat -= laser_check(perp, "r") - - return threat - -/obj/machinery/bot/secbot/proc/laser_check(mob/living/carbon/human/perp, var/lasercolor) - var/target_suit - var/target_weapon - var/threat = 0 - //Lasertag turrets target the opposing team, how great is that? -Sieve - switch(lasercolor) - if("b") - target_suit = /obj/item/clothing/suit/redtag - target_weapon = /obj/item/weapon/gun/energy/lasertag/red - if("r") - target_suit = /obj/item/clothing/suit/bluetag - target_weapon = /obj/item/weapon/gun/energy/lasertag/blue - - if((istype(perp.r_hand, target_weapon)) || (istype(perp.l_hand, target_weapon))) - threat += 4 - - if(istype(perp, /mob/living/carbon/human)) - if(istype(perp.wear_suit, target_suit)) - threat += 4 - if(istype(perp.belt, target_weapon)) - threat += 2 - - return threat - -/obj/machinery/bot/secbot/is_assess_emagged() - return emagged == 2 - -/obj/machinery/bot/secbot/Bump(M as mob|obj) //Leave no door unopened! - if((istype(M, /obj/machinery/door)) && !isnull(src.botcard)) - var/obj/machinery/door/D = M - if(!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/blast)) - D.open() - src.frustration = 0 - else if(!src.anchored) - if((istype(M, /mob/living/))) - var/mob/living/O = M - src.loc = O.loc - src.frustration = 0 - else if(istype(M, /obj/machinery/bot)) - var/obj/machinery/bot/B = M - if(B.dir != src.dir) // Avoids issues if two bots are currently patrolling in the same direction - src.loc = B.loc - src.frustration = 0 - return - -/obj/machinery/bot/secbot/proc/speak(var/message) - for(var/mob/O in hearers(src, null)) - O.show_message("[src] beeps, \"[message]\"",2) - return - -/obj/machinery/bot/secbot/explode() - walk_to(src,0) - src.visible_message("\red [src] blows apart!", 1) - var/turf/Tsec = get_turf(src) - - var/obj/item/weapon/secbot_assembly/Sa = new secbot_assembly(Tsec) - Sa.build_step = 1 - Sa.overlays += image('icons/obj/aibots.dmi', "hs_hole") - Sa.created_name = src.name - new /obj/item/device/assembly/prox_sensor(Tsec) - new /obj/item/weapon/melee/baton(Tsec) - - on_explosion() - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - - new /obj/effect/decal/cleanable/blood/oil(src.loc) - del(src) - - -/obj/machinery/bot/secbot/proc/on_explosion(var/turf/Tsec) - new /obj/item/weapon/melee/baton(Tsec) - if(prob(50)) - new /obj/item/robot_parts/l_arm(Tsec) - -//Secbot Construction - -/obj/item/clothing/head/helmet/attackby(var/obj/item/device/assembly/signaler/S, mob/user as mob) - ..() - if(!issignaler(S)) - ..() - return - - if(src.type != /obj/item/clothing/head/helmet) //Eh, but we don't want people making secbots out of space helmets. - return - - if(S.secured) - del(S) - var/obj/item/weapon/secbot_assembly/A = new /obj/item/weapon/secbot_assembly - user.put_in_hands(A) - user << "You add the signaler to the helmet." - user.drop_from_inventory(src) - del(src) - else - return - -/obj/item/weapon/secbot_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if((istype(W, /obj/item/weapon/weldingtool)) && (!src.build_step)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - src.build_step++ - src.overlays += image('icons/obj/aibots.dmi', "hs_hole") - user << "You weld a hole in [src]!" - - else if(isprox(W) && (src.build_step == 1)) - user.drop_item() - src.build_step++ - user << "You add the prox sensor to [src]!" - src.overlays += image('icons/obj/aibots.dmi', "hs_eye") - src.name = "helmet/signaler/prox sensor assembly" - del(W) - - else if(((istype(W, /obj/item/robot_parts/l_arm)) || (istype(W, /obj/item/robot_parts/r_arm))) && (src.build_step == 2)) - user.drop_item() - src.build_step++ - user << "You add the robot arm to [src]!" - src.name = "helmet/signaler/prox sensor/robot arm assembly" - src.overlays += image('icons/obj/aibots.dmi', "hs_arm") - del(W) - - else if((istype(W, /obj/item/weapon/melee/baton)) && (src.build_step >= 3)) - user.drop_item() - src.build_step++ - user << "You complete the Securitron! Beep boop." - var/obj/machinery/bot/secbot/S = new /obj/machinery/bot/secbot - S.loc = get_turf(src) - S.name = src.created_name - del(W) - del(src) - - else if(istype(W, /obj/item/weapon/pen)) - var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) - if(!t) - return - if(!in_range(src, usr) && src.loc != usr) - return - src.created_name = t - -/obj/machinery/bot/secbot/proc/shootAt(var/mob/target) - if(!has_laser || (lastfired && world.time - lastfired < shot_delay)) - return - lastfired = world.time - var/turf/T = loc - var/atom/U = (istype(target, /atom/movable) ? target.loc : target) - if((!( U ) || !( T ))) - return - while(!( istype(U, /turf) )) - U = U.loc - if(!( istype(T, /turf) )) - return - - if(!projectile) - if(!lasercolor) - if(src.emagged == 2) - projectile = /obj/item/projectile/beam - else - projectile = /obj/item/projectile/beam/stun - else if(lasercolor == "b") - if(src.emagged == 2) - projectile = /obj/item/projectile/beam/lastertag/omni - else - projectile = /obj/item/projectile/beam/lastertag/blue - else if(lasercolor == "r") - if(src.emagged == 2) - projectile = /obj/item/projectile/beam/lastertag/omni - else - projectile = /obj/item/projectile/beam/lastertag/red - - if(!( istype(U, /turf) )) - return - - playsound(src.loc, src.emagged == 2 ? 'sound/weapons/Laser.ogg' : 'sound/weapons/Taser.ogg', 50, 1) - var/obj/item/projectile/A = new projectile (loc) - A.current = U - A.yo = U.y - T.y - A.xo = U.x - T.x - spawn( 0 ) - A.process() - return - return - -/obj/machinery/bot/secbot/emp_act(severity) - if(severity==2 && prob(70)) - ..(severity-1) - else - var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc ) - pulse2.icon = 'icons/effects/effects.dmi' - pulse2.icon_state = "empdisable" - pulse2.name = "emp sparks" - pulse2.anchored = 1 - pulse2.set_dir(pick(cardinal)) - spawn(10) - pulse2.delete() - var/list/mob/living/carbon/targets = new - for(var/mob/living/carbon/C in view(12,src)) - if(C.stat==2) - continue - targets += C - if(targets.len) - if(prob(50)) - var/mob/toshoot = pick(targets) - if(toshoot) - targets-=toshoot - if(prob(50) && emagged < 2) - emagged = 2 - shootAt(toshoot) - emagged = 0 - else - shootAt(toshoot) - else if(prob(50)) - if(targets.len) - var/mob/toarrest = pick(targets) - if(toarrest) - src.target = toarrest - src.mode = SECBOT_HUNT diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index a81654aabb..5bca7b3103 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -8,7 +8,7 @@ active_power_usage = 10 layer = 5 - var/list/network = list("SS13") + var/list/network = list("Exodus") var/c_tag = null var/c_tag_order = 999 var/status = 1 @@ -53,6 +53,14 @@ ASSERT(src.network.len > 0) ..() +/obj/machinery/camera/Destroy() + deactivate(null, 0) //kick anyone viewing out + if(assembly) + qdel(assembly) + assembly = null + qdel(wires) + ..() + /obj/machinery/camera/emp_act(severity) if(!isEmpProof()) if(prob(100/severity)) @@ -136,7 +144,7 @@ assembly.loc = src.loc assembly.state = 1 new /obj/item/stack/cable_coil(src.loc, length=2) - del(src) + qdel(src) // OTHER else if (can_use() && (istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user)) @@ -433,4 +441,4 @@ if(!wires) return wires.CutAll() - wires.MendAll() \ No newline at end of file + wires.MendAll() diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index e56e544649..b9aa81e858 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -78,7 +78,7 @@ if(isscrewdriver(W)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) + var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", "Exodus")) if(!input) usr << "No input found please hang up and try your call again." return @@ -90,7 +90,7 @@ var/area/camera_area = get_area(src) var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])" - input = sanitizeSafe(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag)) + input = sanitizeSafe(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag), MAX_NAME_LEN) state = 4 var/obj/machinery/camera/C = new(src.loc) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 9dd481b686..f1fa9bbb60 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -1,4 +1,76 @@ // PRESETS +var/global/list/station_networks = list( + NETWORK_CIVILIAN_EAST, + NETWORK_CIVILIAN_WEST, + NETWORK_COMMAND, + NETWORK_ENGINE, + NETWORK_ENGINEERING, + NETWORK_ENGINEERING_OUTPOST, + NETWORK_EXODUS, + NETWORK_MEDICAL, + NETWORK_MINE, + NETWORK_RESEARCH, + NETWORK_RESEARCH_OUTPOST, + NETWORK_PRISON, + NETWORK_SECURITY + ) +var/global/list/engineering_networks = list( + NETWORK_ENGINE, + NETWORK_ENGINEERING, + NETWORK_ENGINEERING_OUTPOST, + "Atmosphere Alarms", + "Fire Alarms", + "Power Alarms") +/obj/machinery/camera/network/crescent + network = list(NETWORK_CRESCENT) + +/obj/machinery/camera/network/civilian_east + network = list(NETWORK_CIVILIAN_EAST) + +/obj/machinery/camera/network/civilian_west + network = list(NETWORK_CIVILIAN_WEST) + +/obj/machinery/camera/network/command + network = list(NETWORK_COMMAND) + +/obj/machinery/camera/network/engine + network = list(NETWORK_ENGINE) + +/obj/machinery/camera/network/engineering + network = list(NETWORK_ENGINEERING) + +/obj/machinery/camera/network/engineering_outpost + network = list(NETWORK_ENGINEERING_OUTPOST) + +/obj/machinery/camera/network/ert + network = list(NETWORK_ERT) + +/obj/machinery/camera/network/exodus + network = list(NETWORK_EXODUS) + +/obj/machinery/camera/network/mining + network = list(NETWORK_MINE) + +/obj/machinery/camera/network/prison + network = list(NETWORK_PRISON) + +/obj/machinery/camera/network/medbay + network = list(NETWORK_MEDICAL) + +/obj/machinery/camera/network/research + network = list(NETWORK_RESEARCH) + +/obj/machinery/camera/network/research_outpost + network = list(NETWORK_RESEARCH_OUTPOST) + +/obj/machinery/camera/network/security + network = list(NETWORK_SECURITY) + +/obj/machinery/camera/network/telecom + network = list(NETWORK_TELECOM) + +/obj/machinery/camera/network/thunder + network = list(NETWORK_THUNDER) // EMP @@ -11,6 +83,15 @@ /obj/machinery/camera/xray icon_state = "xraycam" // Thanks to Krutchen for the icons. +/obj/machinery/camera/xray/security + network = list(NETWORK_SECURITY) + +/obj/machinery/camera/xray/medbay + network = list(NETWORK_MEDICAL) + +/obj/machinery/camera/xray/research + network = list(NETWORK_RESEARCH) + /obj/machinery/camera/xray/New() ..() upgradeXRay() @@ -23,6 +104,10 @@ // ALL UPGRADES + +/obj/machinery/camera/all/command + network = list(NETWORK_COMMAND) + /obj/machinery/camera/all/New() ..() upgradeEmpProof() @@ -30,16 +115,6 @@ upgradeMotion() // AUTONAME - -/obj/machinery/camera/autoname/engineering_outpost - network = list("SS13", "Engineering Outpost") - -/obj/machinery/camera/autoname/mining_outpost - network = list("SS13", "MINE") - -/obj/machinery/camera/autoname/research_outpost - network = list("SS13", "Research Outpost") - /obj/machinery/camera/autoname var/number = 0 //camera number in area @@ -57,6 +132,7 @@ if(C.number) number = max(number, C.number+1) c_tag = "[A.name] #[number]" + invalidateCameraCache() // CHECKS diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index b781613d70..6ccea2c382 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -15,7 +15,6 @@ cameranet.process_sort() var/list/T = list() - T["Cancel"] = "Cancel" for (var/obj/machinery/camera/C in cameranet.cameras) var/list/tempnetwork = C.network&src.network if (tempnetwork.len) @@ -30,11 +29,10 @@ set category = "AI Commands" set name = "Show Camera List" - if(src.stat == 2) - src << "You can't list the cameras because you are dead!" + if(check_unable()) return - if (!camera || camera == "Cancel") + if (!camera) return 0 var/obj/machinery/camera/C = track.cameras[camera] diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index a02553cc77..683e6e1220 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -11,7 +11,7 @@ var/obj/item/weapon/cell/charging = null var/chargelevel = -1 -/obj/machinery/cell_charger/proc/updateicon() +/obj/machinery/cell_charger/update_icon() icon_state = "ccharger[charging ? 1 : 0]" if(charging && !(stat & (BROKEN|NOPOWER)) ) @@ -57,7 +57,7 @@ charging = W user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") chargelevel = -1 - updateicon() + update_icon() else if(istype(W, /obj/item/weapon/wrench)) if(charging) user << "\red Remove the cell first!" @@ -76,7 +76,7 @@ src.charging = null user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") chargelevel = -1 - updateicon() + update_icon() /obj/machinery/cell_charger/attack_ai(mob/user) if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough @@ -108,6 +108,6 @@ charging.give(active_power_usage*CELLRATE) update_use_power(2) - updateicon() + update_icon() else update_use_power(1) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 0c133adc9b..0f82401218 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -235,7 +235,7 @@ user << "\The [src] processes \the [W]." biomass += 50 user.drop_item() - del(W) + qdel(W) return else if(istype(W, /obj/item/weapon/wrench)) if(locked && (anchored || occupant)) @@ -328,7 +328,7 @@ update_icon() occupant.ghostize() spawn(5) - del(occupant) + qdel(occupant) return /obj/machinery/clonepod/relaymove(mob/user as mob) @@ -348,21 +348,21 @@ for(var/atom/movable/A as mob|obj in src) A.loc = loc ex_act(severity) - del(src) + qdel(src) return if(2.0) if(prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = loc ex_act(severity) - del(src) + qdel(src) return if(3.0) if(prob(25)) for(var/atom/movable/A as mob|obj in src) A.loc = loc ex_act(severity) - del(src) + qdel(src) return else return diff --git a/code/game/machinery/commsbantenna.dm b/code/game/machinery/commsbantenna.dm new file mode 100644 index 0000000000..03d4a311b1 --- /dev/null +++ b/code/game/machinery/commsbantenna.dm @@ -0,0 +1,34 @@ +/obj/machinery/bluespacerelay + name = "Emergency Bluespace Relay" + desc = "This sends messages through bluespace! Wow!" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "bspacerelay" + + anchored = 1 + density = 1 + use_power = 1 + var/on = 1 + + idle_power_usage = 15000 + active_power_usage = 15000 + +/obj/machinery/bluespacerelay/process() + + update_power() + + update_icon() + + +/obj/machinery/bluespacerelay/update_icon() + if(on) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]_off" + +/obj/machinery/bluespacerelay/proc/update_power() + + if(stat & (BROKEN|NOPOWER|EMPED)) + on = 0 + else + on = 1 + diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 1368d19bb8..028f1ba307 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -30,7 +30,7 @@ if(!src || !WT.remove_fuel(0, user)) return user << "\blue You deconstruct the frame." new /obj/item/stack/sheet/plasteel( loc, 4) - del(src) + qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -178,7 +178,7 @@ if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created A.rename_self("ai", 1) feedback_inc("cyborg_ais_created",1) - del(src) + qdel(src) /obj/structure/AIcore/deactivated name = "inactive AI" @@ -187,7 +187,7 @@ anchored = 1 state = 20//So it doesn't interact based on the above. Not really necessary. -/obj/structure/AIcore/deactivated/Del() +/obj/structure/AIcore/deactivated/Destroy() if(src in empty_playable_ai_cores) empty_playable_ai_cores -= src ..() @@ -208,7 +208,7 @@ if(card) card.clear() - del(src) + qdel(src) /obj/structure/AIcore/deactivated/proc/check_malf(var/mob/living/silicon/ai/ai) if(!ai) return diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 8306b3a87e..2af213478a 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -13,8 +13,8 @@ var/global/list/minor_air_alarms = list() /obj/machinery/computer/atmos_alert/New() ..() atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) - -/obj/machinery/computer/atmos_alert/Del() + +/obj/machinery/computer/atmos_alert/Destroy() atmosphere_alarm.unregister(src) ..() @@ -68,16 +68,13 @@ var/global/list/minor_air_alarms = list() var/obj/machinery/alarm/air_alarm = alarm_source.source if(istype(air_alarm)) var/list/new_ref = list("atmos_reset" = 1) - air_alarm.Topic(href, new_ref, custom_state = atmos_alert_topic) + air_alarm.Topic(href, new_ref, state = air_alarm_topic) return 1 -var/datum/topic_state/atmos_alert/atmos_alert_topic = new() +var/datum/topic_state/air_alarm_topic/air_alarm_topic = new() -/datum/topic_state/atmos_alert - flags = NANO_IGNORE_DISTANCE - -/datum/topic_state/air_alarm/href_list(var/mob/user) +/datum/topic_state/air_alarm_topic/href_list(var/mob/user) var/list/extra_href = list() extra_href["remote_connection"] = 1 extra_href["remote_access"] = 1 diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index d63259bc4c..788d53323e 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -9,11 +9,12 @@ density = 1 anchored = 1.0 circuit = "/obj/item/weapon/circuitboard/atmoscontrol" - var/overridden = 0 //not set yet, can't think of a good way to do it req_access = list(access_ce) var/list/monitored_alarm_ids = null - var/list/monitored_alarms = null - var/ui_ref + var/obj/nano_module/atmos_control/atmos_control + +/obj/machinery/computer/atmoscontrol/New() + ..() /obj/machinery/computer/atmoscontrol/laptop name = "Atmospherics Laptop" @@ -21,78 +22,24 @@ icon_state = "medlaptop" density = 0 -/obj/machinery/computer/atmoscontrol/initialize() - ..() - if(!monitored_alarms && monitored_alarm_ids) - monitored_alarms = new - for(var/obj/machinery/alarm/alarm in machines) - if(alarm.alarm_id && alarm.alarm_id in monitored_alarm_ids) - monitored_alarms += alarm - // machines may not yet be ordered at this point - monitored_alarms = dd_sortedObjectList(monitored_alarms) - /obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob) - return ui_interact(user) + ui_interact(user) /obj/machinery/computer/atmoscontrol/attack_hand(mob/user) if(..()) - return - return ui_interact(user) - -/obj/machinery/computer/atmoscontrol/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] - var/alarms[0] - - // TODO: Move these to a cache, similar to cameras - for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : machines)) - alarms[++alarms.len] = list("name" = sanitize(alarm.name), "ref"= "\ref[alarm]", "danger" = max(alarm.danger_level, alarm.alarm_area.atmosalm)) - data["alarms"] = alarms - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if(!ui) - ui = new(user, src, ui_key, "atmos_control.tmpl", src.name, 625, 625) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - ui_ref = ui + return 1 + ui_interact(user) /obj/machinery/computer/atmoscontrol/attackby(var/obj/item/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/card/emag) && !emagged) user.visible_message("\red \The [user] swipes \a [I] through \the [src], causing the screen to flash!",\ "\red You swipe your [I] through \the [src], the screen flashing as you gain full control.",\ "You hear the swipe of a card through a reader, and an electronic warble.") - emagged = 1 - overridden = 1 + atmos_control.emagged = 1 return return ..() -//a bunch of this is copied from atmos alarms -/obj/machinery/computer/atmoscontrol/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["alarm"]) - if(ui_ref) - var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : machines) - if(alarm) - var/datum/topic_state/TS = generate_state(alarm) - alarm.ui_interact(usr, master_ui = ui_ref, custom_state = TS) - return 1 - -/obj/machinery/computer/atmoscontrol/proc/generate_state(var/alarm) - var/datum/topic_state/air_alarm/state = new() - state.atmos_control = src - state.air_alarm = alarm - return state - -/datum/topic_state/air_alarm - flags = NANO_IGNORE_DISTANCE - var/obj/machinery/computer/atmoscontrol/atmos_control = null - var/obj/machinery/alarm/air_alarm = null - -/datum/topic_state/air_alarm/href_list(var/mob/user) - var/list/extra_href = list() - extra_href["remote_connection"] = 1 - extra_href["remote_access"] = user && (user.isAI() || atmos_control.allowed(user) || atmos_control.emagged || air_alarm.rcon_setting == RCON_YES || (air_alarm.alarm_area.atmosalm && air_alarm.rcon_setting == RCON_AUTO)) - - return extra_href +/obj/machinery/computer/atmoscontrol/ui_interact(var/mob/user) + if(!atmos_control) + atmos_control = new(src, req_access, req_one_access, monitored_alarm_ids) + atmos_control.ui_interact(user) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index ac648624f2..a325ab90f3 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -29,7 +29,7 @@ if(!src || !WT.isOn()) return user << "\blue You deconstruct the frame." new /obj/item/stack/sheet/metal( src.loc, 5 ) - del(src) + qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -111,4 +111,4 @@ user << "\blue You connect the monitor." var/B = new src.circuit.build_path ( src.loc ) src.circuit.construct(B) - del(src) + qdel(src) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 8cb58a14cb..f71f181ed3 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -12,11 +12,16 @@ icon_state = "cameras" var/obj/machinery/camera/current = null var/last_pic = 1.0 - var/list/network = list("SS13") + var/list/network var/mapping = 0//For the overview file, interesting bit of code. circuit = /obj/item/weapon/circuitboard/security var/camera_cache = null + New() + if(!network) + network = station_networks + ..() + attack_ai(var/mob/user as mob) return attack_hand(user) @@ -235,9 +240,13 @@ name = "engineering camera monitor" desc = "Used to monitor fires and breaches." icon_state = "engineeringcameras" - network = list("Engineering","Power Alarms","Atmosphere Alarms","Fire Alarms") circuit = /obj/item/weapon/circuitboard/security/engineering +/obj/machinery/computer/security/engineering/New() + if(!network) + network = engineering_networks + ..() + /obj/machinery/computer/security/nuclear name = "head mounted camera monitor" desc = "Used to access the built-in cameras in helmets." diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index fd8386a7f8..35ae52d588 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -221,7 +221,7 @@ src.active_record = locate(href_list["view_rec"]) if(istype(src.active_record,/datum/dna2/record)) if ((isnull(src.active_record.ckey))) - del(src.active_record) + qdel(src.active_record) src.temp = "ERROR: Record Corrupt" else src.menu = 3 @@ -241,7 +241,7 @@ if (istype(C)||istype(C, /obj/item/device/pda)) if(src.check_access(C)) src.records.Remove(src.active_record) - del(src.active_record) + qdel(src.active_record) src.temp = "Record deleted." src.menu = 2 else @@ -313,7 +313,7 @@ else if(pod.growclone(C)) temp = "Initiating cloning cycle..." records.Remove(C) - del(C) + qdel(C) menu = 1 else @@ -323,7 +323,7 @@ if(answer != "No" && pod.growclone(C)) temp = "Initiating cloning cycle..." records.Remove(C) - del(C) + qdel(C) menu = 1 else temp = "Initiating cloning cycle...
    Error: Post-initialisation failed. Cloning cycle aborted." diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index ad44c17a03..1c16ef7d90 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -48,9 +48,7 @@ /obj/machinery/computer/communications/Topic(href, href_list) if(..()) return 1 - if (src.z > 1) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" - return + usr.set_machine(src) if(!href_list["operation"]) @@ -68,8 +66,8 @@ if (I && istype(I)) if(src.check_access(I)) authenticated = 1 - if(access_captain in I.access) - authenticated = 2 + //if(access_captain in I.access) + //authenticated = 2 crew_announcement.announcer = GetNameAndAssignmentFromId(I) if("logout") authenticated = 0 @@ -82,7 +80,7 @@ var/obj/item/device/pda/pda = I I = pda.id if (I && istype(I)) - if(access_captain in I.access || access_heads in I.access) //Let heads change the alert level. + if(access_heads in I.access) //Let heads change the alert level. var/old_level = security_level if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN @@ -106,7 +104,7 @@ usr << "You need to swipe your ID." if("announce") - if(src.authenticated==2) + if(src.authenticated==1) if(message_cooldown) usr << "Please allow at least one minute to pass between announcements" return @@ -183,32 +181,35 @@ // OMG CENTCOMM LETTERHEAD if("MessageCentcomm") - if(src.authenticated==2) + if(src.authenticated==1) if(centcomm_message_cooldown) - usr << "\red Arrays recycling. Please stand by." + usr << "Arrays recycling. Please stand by." + return + if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs. + usr <<"No Emergency Bluespace Relay detected. Unable to transmit message." return var/input = sanitize(input("Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) if(!input || !(usr in view(1,src))) return Centcomm_announce(input, usr) - usr << "\blue Message transmitted." + usr << "Message transmitted." log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]") centcomm_message_cooldown = 1 - spawn(300)//10 minute cooldown + spawn(300)//30 second cooldown centcomm_message_cooldown = 0 // OMG SYNDICATE ...LETTERHEAD if("MessageSyndicate") - if((src.authenticated==2) && (src.emagged)) + if((src.authenticated==1) && (src.emagged)) if(centcomm_message_cooldown) - usr << "\red Arrays recycling. Please stand by." + usr << "Arrays recycling. Please stand by." return var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) if(!input || !(usr in view(1,src))) return Syndicate_announce(input, usr) - usr << "\blue Message transmitted." + usr << "Message transmitted." log_say("[key_name(usr)] has made an illegal announcement: [input]") centcomm_message_cooldown = 1 spawn(300)//10 minute cooldown @@ -279,9 +280,6 @@ /obj/machinery/computer/communications/attack_hand(var/mob/user as mob) if(..()) return - if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" - return user.set_machine(src) var/dat = "Communications Console" @@ -301,7 +299,7 @@ if(STATE_DEFAULT) if (src.authenticated) dat += "
    \[ Log Out \]" - if (src.authenticated==2) + if (src.authenticated==1) dat += "
    \[ Make An Announcement \]" if(src.emagged == 0) dat += "
    \[ Send an emergency message to Centcomm \]" @@ -430,6 +428,10 @@ if ((!( ticker ) || !emergency_shuttle.location())) return + if(!universe.OnShuttleCall(usr)) + user << "Cannot establish a bluespace connection." + return + if(deathsquad.deployed) user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated." return @@ -439,7 +441,7 @@ return if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE - user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/60)] minutes before trying again." + user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minute\s before trying again." return if(emergency_shuttle.going_to_centcom()) @@ -519,6 +521,13 @@ message_admins("[key_name_admin(user)] has recalled the shuttle.", 1) return + +/proc/is_relay_online() + for(var/obj/machinery/bluespacerelay/M in world) + if(M.stat == 0) + return 1 + return 0 + /obj/machinery/computer/communications/proc/post_status(var/command, var/data1, var/data2) var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435) @@ -542,7 +551,7 @@ frequency.post_signal(src, status_signal) -/obj/machinery/computer/communications/Del() +/obj/machinery/computer/communications/Destroy() for(var/obj/machinery/computer/communications/commconsole in world) if(istype(commconsole.loc,/turf) && commconsole != src) @@ -565,7 +574,7 @@ ..() -/obj/item/weapon/circuitboard/communications/Del() +/obj/item/weapon/circuitboard/communications/Destroy() for(var/obj/machinery/computer/communications/commconsole in world) if(istype(commconsole.loc,/turf)) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 304ac7d1af..076304694a 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -9,12 +9,6 @@ var/circuit = null //The path to the circuit board type. If circuit==null, the computer can't be disassembled. var/processing = 0 -/obj/machinery/computer/New() - ..() - if(ticker) - initialize() - - /obj/machinery/computer/initialize() power_change() @@ -41,11 +35,11 @@ /obj/machinery/computer/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(25)) - del(src) + qdel(src) return if (prob(50)) for(var/x in verbs) @@ -129,7 +123,7 @@ A.state = 4 A.icon_state = "4" M.deconstruct(src) - del(src) + qdel(src) else src.attack_hand(user) return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index c6a30995d2..35e2b186b7 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -124,7 +124,7 @@ dat += "Back" dat += "
    Medical Robots:" var/bdat = null - for(var/obj/machinery/bot/medbot/M in world) + for(var/mob/living/bot/medbot/M in world) if(M.z != src.z) continue //only find medibots on the same z-level as the computer var/turf/bl = get_turf(M) @@ -240,7 +240,7 @@ if (href_list["del_all2"]) for(var/datum/data/record/R in data_core.medical) //R = null - del(R) + qdel(R) //Foreach goto(494) src.temp = "All records deleted." @@ -408,7 +408,7 @@ if (href_list["del_r2"]) if (src.active2) //src.active2 = null - del(src.active2) + qdel(src.active2) if (href_list["d_rec"]) var/datum/data/record/R = locate(href_list["d_rec"]) @@ -542,7 +542,7 @@ continue else if(prob(1)) - del(R) + qdel(R) continue ..(severity) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 0c7830a78a..30a39c37b1 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -77,7 +77,7 @@ A.state = 3 A.icon_state = "3" A.anchored = 1 - del(src) + qdel(src) else user << "\blue You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc ) @@ -100,7 +100,7 @@ A.state = 4 A.icon_state = "4" A.anchored = 1 - del(src) + qdel(src) else attack_hand(user) return diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index 84ba06fa02..7b152fb7a3 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -45,7 +45,7 @@ var/prison_shuttle_timeleft = 0 A.state = 4 A.icon_state = "4" - del(src) + qdel(src) else if(istype(I,/obj/item/weapon/card/emag) && (!hacked)) hacked = 1 user << "\blue You disable the lock." @@ -194,7 +194,7 @@ var/prison_shuttle_timeleft = 0 for(var/atom/movable/AM as mob|obj in T) AM.Move(D) if(istype(T, /turf/simulated)) - del(T) + qdel(T) start_location.move_contents_to(end_location) if(1) @@ -224,7 +224,7 @@ var/prison_shuttle_timeleft = 0 for(var/atom/movable/AM as mob|obj in T) AM.Move(D) if(istype(T, /turf/simulated)) - del(T) + qdel(T) for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... bug.gib() diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index c05f0f78be..647434b7fd 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -377,7 +377,7 @@ What a mess.*/ if ("Purge All Records") for(var/datum/data/record/R in data_core.security) - del(R) + qdel(R) temp = "All Security records deleted." if ("Add Entry") @@ -549,17 +549,17 @@ What a mess.*/ if ("Delete Record (Security) Execute") if (active2) - del(active2) + qdel(active2) if ("Delete Record (ALL) Execute") if (active1) for(var/datum/data/record/R in data_core.medical) if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) - del(R) + qdel(R) else - del(active1) + qdel(active1) if (active2) - del(active2) + qdel(active2) else temp = "This function does not appear to be working at the moment. Our apologies." @@ -605,7 +605,7 @@ What a mess.*/ continue else if(prob(1)) - del(R) + qdel(R) continue ..(severity) diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index b8b25b3e34..05da871ed2 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -43,7 +43,7 @@ world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" emergency_shuttle.set_launch_countdown(10) //src.authorized = null - del(src.authorized) + qdel(src.authorized) src.authorized = list( ) if("Repeal") diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index aa92a59094..201c834e1c 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -289,7 +289,7 @@ What a mess.*/ if(PDA_Manifest.len) PDA_Manifest.Cut() for(var/datum/data/record/R in data_core.security) - del(R) + qdel(R) temp = "All Employment records deleted." if ("Delete Record (ALL)") @@ -373,9 +373,9 @@ What a mess.*/ PDA_Manifest.Cut() for(var/datum/data/record/R in data_core.medical) if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) - del(R) + qdel(R) else - del(active1) + qdel(active1) else temp = "This function does not appear to be working at the moment. Our apologies." @@ -408,7 +408,7 @@ What a mess.*/ continue else if(prob(1)) - del(R) + qdel(R) continue ..(severity) \ No newline at end of file diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 01728b4e50..48ba842a2f 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -75,7 +75,7 @@ var/specops_shuttle_timeleft = 0 for(var/atom/movable/AM as mob|obj in T) AM.Move(D) if(istype(T, /turf/simulated)) - del(T) + qdel(T) for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... bug.gib() @@ -94,7 +94,7 @@ var/specops_shuttle_timeleft = 0 for(var/obj/machinery/computer/specops_shuttle/S in world) S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY - del(announcer) + qdel(announcer) /proc/specops_process() var/area/centcom/specops/special_ops = locate()//Where is the specops area located? @@ -224,7 +224,7 @@ var/specops_shuttle_timeleft = 0 for(var/atom/movable/AM as mob|obj in T) AM.Move(D) if(istype(T, /turf/simulated)) - del(T) + qdel(T) start_location.move_contents_to(end_location) @@ -235,7 +235,7 @@ var/specops_shuttle_timeleft = 0 for(var/obj/machinery/computer/specops_shuttle/S in world) S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY - del(announcer) + qdel(announcer) /proc/specops_can_move() if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index ab136ca371..8780586985 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -4,15 +4,19 @@ desc = "Used to access the station's automated alert system." icon_state = "alert:0" circuit = "/obj/item/weapon/circuitboard/stationalert" - var/alarms = list("Fire"=list(), "Atmosphere"=list(), "Power"=list()) - var/obj/nano_module/alarm_monitor/engineering/alarm_monitor + var/obj/nano_module/alarm_monitor/alarm_monitor + var/monitor_type = /obj/nano_module/alarm_monitor/engineering + +/obj/machinery/computer/station_alert/security + name = "Security Alert Console" + monitor_type = /obj/nano_module/alarm_monitor/security /obj/machinery/computer/station_alert/New() - alarm_monitor = new(src) - alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon) ..() + alarm_monitor = new monitor_type(src) + alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon) -/obj/machinery/computer/station_alert/Del() +/obj/machinery/computer/station_alert/Destroy() alarm_monitor.unregister(src) ..() diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 970bb362c3..f526ead65b 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -160,7 +160,7 @@ var/syndicate_elite_shuttle_timeleft = 0 for(var/atom/movable/AM as mob|obj in T) AM.Move(D) if(istype(T, /turf/simulated)) - del(T) + qdel(T) for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... bug.gib() diff --git a/code/game/machinery/computer3/buildandrepair.dm b/code/game/machinery/computer3/buildandrepair.dm index 38db742ee6..bc02e474e4 100644 --- a/code/game/machinery/computer3/buildandrepair.dm +++ b/code/game/machinery/computer3/buildandrepair.dm @@ -95,7 +95,7 @@ if(!src || !WT.isOn()) return user << "\blue You deconstruct the frame." new /obj/item/stack/sheet/metal( src.loc, 5 ) - del(src) + qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -160,7 +160,7 @@ if(do_after(user, 20)) if(P) P:amount -= 5 - if(!P:amount) del(P) + if(!P:amount) qdel(P) user << "\blue You add cables to the frame." src.state = 3 src.icon_state = "3" @@ -212,7 +212,7 @@ if(circuit.OS) circuit.OS.computer = B B.RefreshParts() // todo - del(src) + qdel(src) /* This will remove peripherals if you specify one, but the main function is to diff --git a/code/game/machinery/computer3/computer.dm b/code/game/machinery/computer3/computer.dm index 4939444ae5..e643635dfe 100644 --- a/code/game/machinery/computer3/computer.dm +++ b/code/game/machinery/computer3/computer.dm @@ -215,11 +215,11 @@ ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(25)) - del(src) + qdel(src) return if (prob(50)) for(var/x in verbs) diff --git a/code/game/machinery/computer3/computers/HolodeckControl.dm b/code/game/machinery/computer3/computers/HolodeckControl.dm index 80d60afd07..9e4532604b 100644 --- a/code/game/machinery/computer3/computers/HolodeckControl.dm +++ b/code/game/machinery/computer3/computers/HolodeckControl.dm @@ -160,7 +160,7 @@ if(!silent) var/obj/oldobj = obj obj.visible_message("The [oldobj.name] fades away!") - del(obj) + qdel(obj) proc/checkInteg(var/area/A) for(var/turf/T in A) @@ -213,10 +213,10 @@ derez(item) for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck) - del(B) + qdel(B) for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck) - del(C) + qdel(C) holographic_items = A.copy_contents_to(linkedholodeck , 1) diff --git a/code/game/machinery/computer3/computers/camera.dm b/code/game/machinery/computer3/computers/camera.dm index 17f14e0cbf..f90b0526ee 100644 --- a/code/game/machinery/computer3/computers/camera.dm +++ b/code/game/machinery/computer3/computers/camera.dm @@ -238,7 +238,7 @@ camera_list = "Network Key: [key.title] [topic_link(src,"keyselect","\[ Select key \]")]
    " for(var/obj/machinery/camera/C in temp_list) - if(C.status) + if(C.can_use()) camera_list += "[C.c_tag] - [topic_link(src,"show=\ref[C]","Show")]
    " else camera_list += "[C.c_tag] - DEACTIVATED
    " @@ -264,7 +264,7 @@ if("show" in href_list) var/obj/machinery/camera/C = locate(href_list["show"]) - if(istype(C) && C.status) + if(istype(C) && C.can_use()) set_current(C) usr.reset_view(C) interact() diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm index adb7ff9079..aec0b615f5 100644 --- a/code/game/machinery/computer3/computers/medical.dm +++ b/code/game/machinery/computer3/computers/medical.dm @@ -136,7 +136,7 @@ dat += "Back" dat += "
    Medical Robots:" var/bdat = null - for(var/obj/machinery/bot/medbot/M in world) + for(var/mob/living/bot/medbot/M in world) if(M.z != computer.z) continue //only find medibots on the same z-level as the computer var/turf/bl = get_turf(M) @@ -254,7 +254,7 @@ if (href_list["del_all2"]) for(var/datum/data/record/R in data_core.medical) //R = null - del(R) + qdel(R) //Foreach goto(494) src.temp = "All records deleted." @@ -422,7 +422,7 @@ if (href_list["del_r2"]) if (src.active2) //src.active2 = null - del(src.active2) + qdel(src.active2) if (href_list["d_rec"]) var/datum/data/record/R = locate(href_list["d_rec"]) diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index 924f32b1b7..f2de764894 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -397,7 +397,7 @@ What a mess.*/ if ("Purge All Records") for(var/datum/data/record/R in data_core.security) - del(R) + qdel(R) temp = "All Security records deleted." if ("Add Entry") @@ -558,17 +558,17 @@ What a mess.*/ if ("Delete Record (Security) Execute") if (active2) - del(active2) + qdel(active2) if ("Delete Record (ALL) Execute") if (active1) for(var/datum/data/record/R in data_core.medical) if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) - del(R) + qdel(R) else - del(active1) + qdel(active1) if (active2) - del(active2) + qdel(active2) else temp = "This function does not appear to be working at the moment. Our apologies." @@ -601,7 +601,7 @@ What a mess.*/ continue else if(prob(1)) - del(R) + qdel(R) continue ..(severity) diff --git a/code/game/machinery/computer3/laptop.dm b/code/game/machinery/computer3/laptop.dm index e0156e874e..484db52462 100644 --- a/code/game/machinery/computer3/laptop.dm +++ b/code/game/machinery/computer3/laptop.dm @@ -52,7 +52,7 @@ O.loc = loc usr << "\The [src] crumbles to pieces." spawn(5) - del src + qdel(src) return if(!stored_computer.manipulating) @@ -65,7 +65,7 @@ spawn(5) stored_computer.manipulating = 0 - del src + qdel(src) else usr << "\red You are already opening the computer!" @@ -185,12 +185,12 @@ else stat &= ~NOPOWER - Del() + Destroy() if(istype(loc,/obj/item/device/laptop)) var/obj/O = loc spawn(5) if(O) - del O + qdel(O) ..() diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm index 72531b5d8e..b2e84f1cd2 100644 --- a/code/game/machinery/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -31,7 +31,7 @@ /obj/machinery/lapvend/blob_act() if (prob(50)) spawn(0) - del(src) + qdel(src) return return @@ -202,10 +202,10 @@ if (network == 3) newlap.spawn_parts += (/obj/item/part/computer/networking/cable) if (power == 1) - del(newlap.battery) + qdel(newlap.battery) newlap.battery = new /obj/item/weapon/cell/high(newlap) if (power == 2) - del(newlap.battery) + qdel(newlap.battery) newlap.battery = new /obj/item/weapon/cell/super(newlap) newlap.spawn_parts() @@ -404,7 +404,7 @@ T.time = worldtime2text() vendor_account.transaction_log.Add(T) - del(relap) + qdel(relap) vendmode = 0 cardreader = 0 floppy = 0 diff --git a/code/game/machinery/computer3/program.dm b/code/game/machinery/computer3/program.dm index 74083b8ffd..0667fe2f73 100644 --- a/code/game/machinery/computer3/program.dm +++ b/code/game/machinery/computer3/program.dm @@ -111,7 +111,7 @@ Programs are a file that can be executed update_icon() if(popup) popup.close() - del popup + qdel(popup) return /* diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 0f906ad4b2..da2ebb9d2d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -53,7 +53,7 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user << "\blue You dismantle the frame" new /obj/item/stack/sheet/metal(src.loc, 5) - del(src) + qdel(src) if(2) if(istype(P, /obj/item/weapon/circuitboard)) var/obj/item/weapon/circuitboard/B = P @@ -129,7 +129,7 @@ else circuit.loc = null new_machine.RefreshParts() - del(src) + qdel(src) else if(istype(P, /obj/item)) for(var/I in req_components) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index a9858742c9..4ccc48f8bd 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -24,9 +24,11 @@ ..() initialize_directions = dir -/obj/machinery/atmospherics/unary/cryo_cell/Del() - if(occupant) - occupant.loc = loc +/obj/machinery/atmospherics/unary/cryo_cell/Destroy() + var/turf/T = loc + T.contents += contents + if(beaker) + beaker.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube ..() /obj/machinery/atmospherics/unary/cryo_cell/initialize() @@ -190,7 +192,7 @@ return var/mob/M = G:affecting if(put_mob(M)) - del(G) + qdel(G) return /obj/machinery/atmospherics/unary/cryo_cell/update_icon() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index fcece506c3..41bb3bef2d 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -234,7 +234,7 @@ ..() -/obj/machinery/cryopod/Del() +/obj/machinery/cryopod/Destroy() if(occupant) occupant.loc = loc occupant.resting = 1 @@ -291,12 +291,12 @@ var/mob/living/silicon/robot/R = occupant if(!istype(R)) return ..() - del(R.mmi) + qdel(R.mmi) for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags O.loc = R - del(I) - del(R.module) + qdel(I) + qdel(R.module) return ..() @@ -308,14 +308,14 @@ occupant.drop_from_inventory(W) W.loc = src - if(W.contents.len) //Make sure we catch anything not handled by del() on the items. + if(W.contents.len) //Make sure we catch anything not handled by qdel() on the items. for(var/obj/item/O in W.contents) if(istype(O,/obj/item/weapon/storage/internal)) //Stop eating pockets, you fuck! continue O.loc = src //Delete all items not on the preservation list. - var/list/items = src.contents + var/list/items = src.contents.Copy() items -= occupant // Don't delete the occupant items -= announce // or the autosay radio. @@ -328,7 +328,7 @@ break if(!preserve) - del(W) + qdel(W) else if(control_computer && control_computer.allow_items) control_computer.frozen_items += W @@ -341,7 +341,7 @@ // We don't want revs to get objectives that aren't for heads of staff. Letting // them win or lose based on cryo is silly so we remove the objective. if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind) - del(O) + qdel(O) else if(O.target && istype(O.target,/datum/mind)) if(O.target == occupant.mind) if(O.owner && O.owner.current) @@ -353,7 +353,7 @@ if(!(O.target)) all_objectives -= O O.owner.objectives -= O - del(O) + qdel(O) //Handle job slot/tater cleanup. var/job = occupant.mind.assigned_role @@ -361,7 +361,7 @@ job_master.FreeRole(job) if(occupant.mind.objectives.len) - del(occupant.mind.objectives) + qdel(occupant.mind.objectives) occupant.mind.special_role = null //else //if(ticker.mode.name == "AutoTraitor") @@ -374,13 +374,13 @@ PDA_Manifest.Cut() for(var/datum/data/record/R in data_core.medical) if ((R.fields["name"] == occupant.real_name)) - del(R) + qdel(R) for(var/datum/data/record/T in data_core.security) if ((T.fields["name"] == occupant.real_name)) - del(T) + qdel(T) for(var/datum/data/record/G in data_core.general) if ((G.fields["name"] == occupant.real_name)) - del(G) + qdel(G) if(orient_right) icon_state = "[base_icon_state]-r" @@ -398,9 +398,9 @@ announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]") visible_message("\The [initial(name)] hums and hisses as it moves [occupant.real_name] into storage.", 3) - set_occupant(null) // Delete the mob. - del(occupant) + qdel(occupant) + set_occupant(null) /obj/machinery/cryopod/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 87e7adea03..e49fb26283 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -91,14 +91,14 @@ for reference: new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) ..() ex_act(severity) switch(severity) if(1.0) visible_message("\red The barricade is blown apart!") - del(src) + qdel(src) return if(2.0) src.health -= 25 @@ -107,7 +107,7 @@ for reference: new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) return meteorhit() @@ -115,14 +115,14 @@ for reference: new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) new /obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) return blob_act() src.health -= 25 if (src.health <= 0) visible_message("\red The blob eats through the barricade!") - del(src) + qdel(src) return CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. @@ -264,7 +264,7 @@ for reference: var/turf/Tsec = get_turf(src) /* var/obj/item/stack/rods/ =*/ - new /obj/item/stack/rods(Tsec) + PoolOrNew(/obj/item/stack/rods, Tsec) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) @@ -272,4 +272,4 @@ for reference: explosion(src.loc,-1,-1,0) if(src) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 928dda2541..e010264d4a 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -1,27 +1,10 @@ -#define CONTROL_POD_DOORS 0 -#define CONTROL_NORMAL_DOORS 1 -#define CONTROL_EMITTERS 2 - -/obj/machinery/door_control - name = "remote door-control" - desc = "It controls doors, remotely." +/obj/machinery/button/remote + name = "remote object control" + desc = "It controls objects, remotely." icon = 'icons/obj/stationobjs.dmi' icon_state = "doorctrl0" - desc = "A remote control-switch for a door." power_channel = ENVIRON - var/id = null - var/normaldoorcontrol = CONTROL_POD_DOORS - var/desiredstate = 0 // Zero is closed, 1 is open. - var/specialfunctions = 1 - /* - Bitflag, 1= open - 2= idscan, - 4= bolts - 8= shock - 16= door safties - - */ - + var/desiredstate = 0 var/exposedwires = 0 var/wires = 3 /* @@ -34,14 +17,13 @@ idle_power_usage = 2 active_power_usage = 4 - -/obj/machinery/door_control/attack_ai(mob/user as mob) +/obj/machinery/button/remote/attack_ai(mob/user as mob) if(wires & 2) return src.attack_hand(user) else user << "Error, no route to host." -/obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob) +/obj/machinery/button/remote/attackby(obj/item/weapon/W, mob/user as mob) /* For later implementation if (istype(W, /obj/item/weapon/screwdriver)) { @@ -64,7 +46,56 @@ playsound(src.loc, "sparks", 100, 1) return src.attack_hand(user) -/obj/machinery/door_control/proc/handle_door() +/obj/machinery/button/remote/attack_hand(mob/user as mob) + if(..()) + return + + src.add_fingerprint(user) + if(stat & (NOPOWER|BROKEN)) + return + + if(!allowed(user) && (wires & 1)) + user << "Access Denied" + flick("doorctrl-denied",src) + return + + use_power(5) + icon_state = "doorctrl1" + desiredstate = !desiredstate + trigger() + spawn(15) + update_icon() + +/obj/machinery/button/remote/proc/trigger() + return + +/obj/machinery/button/remote/power_change() + ..() + update_icon() + +/obj/machinery/button/remote/update_icon() + if(stat & NOPOWER) + icon_state = "doorctrl-p" + else + icon_state = "doorctrl0" + +/* + Airlock remote control +*/ +/obj/machinery/button/remote/airlock + name = "remote door-control" + desc = "It controls doors, remotely." + + var/specialfunctions = 1 + /* + Bitflag, 1= open + 2= idscan, + 4= bolts + 8= shock + 16= door safties + */ + +/obj/machinery/button/remote/airlock/trigger() for(var/obj/machinery/door/airlock/D in world) if(D.id_tag == src.id) if(specialfunctions & OPEN) @@ -78,24 +109,31 @@ return if(desiredstate == 1) if(specialfunctions & IDSCAN) - D.aiDisabledIdScanner = 1 + D.set_idscan(0) if(specialfunctions & BOLTS) D.lock() if(specialfunctions & SHOCK) D.electrify(-1) if(specialfunctions & SAFE) - D.safe = 0 + D.set_safeties(0) else if(specialfunctions & IDSCAN) - D.aiDisabledIdScanner = 0 + D.set_idscan(1) if(specialfunctions & BOLTS) D.unlock() if(specialfunctions & SHOCK) D.electrify(0) if(specialfunctions & SAFE) - D.safe = 1 + D.set_safeties(1) -/obj/machinery/door_control/proc/handle_pod() +/* + Blast door remote control +*/ +/obj/machinery/button/remote/blast_door + name = "remote blast door-control" + desc = "It controls blast doors, remotely." + +/obj/machinery/button/remote/blast_door/trigger() for(var/obj/machinery/door/blast/M in world) if(M.id == src.id) if(M.density) @@ -107,59 +145,32 @@ M.close() return -/obj/machinery/door_control/proc/handle_emitters(mob/user as mob) +/* + Emitter remote control +*/ +/obj/machinery/button/remote/emitter + name = "remote emitter control" + desc = "It controls emitters, remotely." + +/obj/machinery/button/remote/emitter/trigger(mob/user as mob) for(var/obj/machinery/power/emitter/E in world) if(E.id == src.id) spawn(0) E.activate(user) return -/obj/machinery/door_control/attack_hand(mob/user as mob) - src.add_fingerprint(user) - if(stat & (NOPOWER|BROKEN)) - return - - if(!allowed(user) && (wires & 1)) - user << "\red Access Denied" - flick("doorctrl-denied",src) - return - - use_power(5) - icon_state = "doorctrl1" - add_fingerprint(user) - - switch(normaldoorcontrol) - if(CONTROL_NORMAL_DOORS) - handle_door() - if(CONTROL_POD_DOORS) - handle_pod() - if(CONTROL_EMITTERS) - handle_emitters(user) - - desiredstate = !desiredstate - spawn(15) - if(!(stat & NOPOWER)) - icon_state = "doorctrl0" - -/obj/machinery/door_control/power_change() - ..() - if(stat & NOPOWER) - icon_state = "doorctrl-p" - else - icon_state = "doorctrl0" - -/obj/machinery/button/driver +/* + Mass driver remote control +*/ +/obj/machinery/button/remote/driver name = "mass driver button" desc = "A remote control switch for a mass driver." + icon = 'icons/obj/objects.dmi' + icon_state = "launcherbtt" -/obj/machinery/button/driver/attack_hand(mob/user as mob) - if(..()) - return - - use_power(5) - +/obj/machinery/button/remote/driver/trigger(mob/user as mob) active = 1 - icon_state = "launcheract" + update_icon() for(var/obj/machinery/door/blast/M in machines) if (M.id == src.id) @@ -177,11 +188,17 @@ for(var/obj/machinery/door/blast/M in machines) if (M.id == src.id) - spawn( 0 ) + spawn(0) M.close() return icon_state = "launcherbtt" - active = 0 + update_icon() return + +/obj/machinery/button/remote/driver/update_icon() + if(!active || (stat & NOPOWER)) + icon_state = "launcherbtt" + else + icon_state = "launcheract" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 40c137e77b..76b08dba2c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -4,7 +4,7 @@ icon_state = "door_closed" power_channel = ENVIRON - explosion_resistance = 15 + explosion_resistance = 10 var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. var/hackProof = 0 // if 1, this door can't be hacked by the AI var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. @@ -36,10 +36,10 @@ if(damage >= 10) if(src.density) visible_message("\The [user] forces \the [src] open!") - open() + open(1) else visible_message("\The [user] forces \the [src] closed!") - close() + close(1) else visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") return @@ -80,6 +80,7 @@ icon = 'icons/obj/doors/Doorglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 glass = 1 @@ -91,6 +92,7 @@ /obj/machinery/door/airlock/vault name = "Vault" icon = 'icons/obj/doors/vault.dmi' + explosion_resistance = 20 opacity = 1 secured_wires = 1 assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. @@ -108,12 +110,14 @@ /obj/machinery/door/airlock/hatch name = "Airtight Hatch" icon = 'icons/obj/doors/Doorhatchele.dmi' + explosion_resistance = 20 opacity = 1 assembly_type = /obj/structure/door_assembly/door_assembly_hatch /obj/machinery/door/airlock/maintenance_hatch name = "Maintenance Hatch" icon = 'icons/obj/doors/Doorhatchmaint2.dmi' + explosion_resistance = 20 opacity = 1 assembly_type = /obj/structure/door_assembly/door_assembly_mhatch @@ -122,6 +126,7 @@ icon = 'icons/obj/doors/Doorcomglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_com glass = 1 @@ -131,6 +136,7 @@ icon = 'icons/obj/doors/Doorengglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_eng glass = 1 @@ -140,6 +146,7 @@ icon = 'icons/obj/doors/Doorsecglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_sec glass = 1 @@ -149,6 +156,7 @@ icon = 'icons/obj/doors/Doormedglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_med glass = 1 @@ -173,6 +181,7 @@ icon = 'icons/obj/doors/Doorresearchglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_research glass = 1 @@ -183,6 +192,7 @@ icon = 'icons/obj/doors/Doorminingglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_min glass = 1 @@ -192,6 +202,7 @@ icon = 'icons/obj/doors/Dooratmoglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' maxhealth = 300 + explosion_resistance = 5 opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_atmo glass = 1 @@ -264,13 +275,13 @@ for(var/obj/structure/falsewall/phoron/F in range(3,src))//Hackish as fuck, but until temperature_expose works, there is nothing I can do -Sieve var/turf/T = get_turf(F) T.ChangeTurf(/turf/simulated/wall/mineral/phoron/) - del (F) + qdel (F) for(var/turf/simulated/wall/mineral/phoron/W in range(3,src)) W.ignite((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) D.ignite(temperature/4) new/obj/structure/door_assembly( src.loc ) - del (src) + qdel(src) /obj/machinery/door/airlock/sandstone name = "Sandstone Airlock" @@ -292,6 +303,7 @@ /obj/machinery/door/airlock/highsecurity name = "Secure Airlock" icon = 'icons/obj/doors/hightechsecurity.dmi' + explosion_resistance = 20 secured_wires = 1 assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity @@ -421,6 +433,33 @@ About the new airlock wires panel: if(feedback && message) usr << message +/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) + var/message = "" + if(src.isWireCut(AIRLOCK_WIRE_IDSCAN)) + message = "The IdScan wire is cut - IdScan feature permanently disabled." + else if(activate && src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 0 + message = "IdScan feature has been enabled." + else if(!activate && !src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 1 + message = "IdScan feature has been disabled." + + if(feedback && message) + usr << message + +/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) + var/message = "" + // Safeties! We don't need no stinking safeties! + if (src.isWireCut(AIRLOCK_WIRE_SAFETY)) + message = text("The safety wire is cut - Cannot enable safeties.") + else if (!activate && src.safe) + safe = 0 + else if (activate && !src.safe) + safe = 1 + + if(feedback && message) + usr << message + // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise // The preceding comment was borrowed from the grille's shock script @@ -490,7 +529,8 @@ About the new airlock wires panel: if("deny") if(density && src.arePowerSystemsOn()) flick("door_deny", src) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + if(secured_wires) + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) return /obj/machinery/door/airlock/attack_ai(mob/user as mob) @@ -610,7 +650,7 @@ About the new airlock wires panel: ..(user) return -/obj/machinery/door/airlock/CanUseTopic(var/mob/user, href_list) +/obj/machinery/door/airlock/CanUseTopic(var/mob/user) if(!user.isSilicon()) return STATUS_CLOSE @@ -627,7 +667,7 @@ About the new airlock wires panel: user << "Unable to interface: Connection refused." return STATUS_CLOSE - return STATUS_INTERACTIVE + return ..() /obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0) if(..()) @@ -636,14 +676,7 @@ About the new airlock wires panel: var/activate = text2num(href_list["activate"]) switch (href_list["command"]) if("idscan") - if(src.isWireCut(AIRLOCK_WIRE_IDSCAN)) - usr << "The IdScan wire has been cut - IdScan feature permanently disabled." - else if(activate && src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 0 - usr << "IdScan feature has been enabled." - else if(!activate && !src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 1 - usr << "IdScan feature has been disabled." + set_idscan(activate, 1) if("main_power") if(!main_power_lost_until) src.loseMainPower() @@ -652,7 +685,7 @@ About the new airlock wires panel: src.loseBackupPower() if("bolts") if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) - usr << "The door bolt control wire has been cut - Door bolts permanently dropped." + usr << "The door bolt control wire is cut - Door bolts permanently dropped." else if(activate && src.lock()) usr << "The door bolts have been dropped." else if(!activate && src.unlock()) @@ -671,13 +704,7 @@ About the new airlock wires panel: else if(!activate && !density) close() if("safeties") - // Safeties! We don't need no stinking safeties! - if (src.isWireCut(AIRLOCK_WIRE_SAFETY)) - usr << text("The safety wire is cut - Cannot secure the door.") - else if (activate && src.safe) - safe = 0 - else if (!activate && !src.safe) - safe = 1 + set_safeties(!activate, 1) if("timing") // Door speed control if(src.isWireCut(AIRLOCK_WIRE_SPEED)) @@ -689,7 +716,7 @@ About the new airlock wires panel: if("lights") // Bolt lights if(src.isWireCut(AIRLOCK_WIRE_LIGHT)) - usr << "The bolt lights wire has been cut - The door bolt lights are permanently disabled." + usr << "The bolt lights wire is cut - The door bolt lights are permanently disabled." else if (!activate && src.lights) lights = 0 usr << "The door bolt lights have been disabled." @@ -770,13 +797,13 @@ About the new airlock wires panel: electronics.loc = src.loc electronics = null - del(src) + qdel(src) return else if(arePowerSystemsOn()) user << "\blue The airlock's motors resist your efforts to force it." else if(locked) user << "\blue The airlock's bolts prevent it from being forced." - else if( !welded && !operating ) + else if(density) spawn(0) open(1) else @@ -825,11 +852,8 @@ About the new airlock wires panel: return /obj/machinery/door/airlock/open(var/forced=0) - if(!can_open()) + if(!can_open(forced)) return 0 - if(!forced) - if( !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) ) - return 0 use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people if(istype(src, /obj/machinery/door/airlock/glass)) playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) @@ -839,7 +863,11 @@ About the new airlock wires panel: src.closeOther.close() return ..() -/obj/machinery/door/airlock/can_open() +/obj/machinery/door/airlock/can_open(var/forced=0) + if(!forced) + if(!arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR)) + return 0 + if(locked || welded) return 0 return ..() @@ -855,40 +883,68 @@ About the new airlock wires panel: return ..() +/atom/movable/proc/blocks_airlock() + return density + +/obj/machinery/door/blocks_airlock() + return 0 + +/obj/machinery/mech_sensor/blocks_airlock() + return 0 + +/mob/living/blocks_airlock() + return 1 + +/atom/movable/proc/airlock_crush(var/crush_damage) + return 0 + +/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) + . = ..() + health -= crush_damage + healthcheck() + +/obj/structure/closet/airlock_crush(var/crush_damage) + ..() + damage(crush_damage) + for(var/atom/movable/AM in src) + AM.airlock_crush() + return 1 + +/mob/living/airlock_crush(var/crush_damage) + . = ..() + adjustBruteLoss(crush_damage) + SetStunned(5) + SetWeakened(5) + var/turf/T = get_turf(src) + T.add_blood(src) + +/mob/living/carbon/airlock_crush(var/crush_damage) + . = ..() + if (!(species && (species.flags & NO_PAIN))) + emote("scream") + +/mob/living/silicon/robot/airlock_crush(var/crush_damage) + adjustBruteLoss(crush_damage) + return 0 + /obj/machinery/door/airlock/close(var/forced=0) if(!can_close(forced)) return 0 if(safe) for(var/turf/turf in locs) - if(locate(/mob/living) in turf) - if(world.time > next_beep_at) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) - next_beep_at = world.time + SecondsToTicks(10) - close_door_at = world.time + 6 - return + for(var/atom/movable/AM in turf) + if(AM.blocks_airlock()) + if(world.time > next_beep_at) + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + next_beep_at = world.time + SecondsToTicks(10) + close_door_at = world.time + 6 + return for(var/turf/turf in locs) - for(var/mob/living/M in turf) - if(isrobot(M)) - M.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - else - M.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - M.SetStunned(5) - M.SetWeakened(5) - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = M - S.loc = M.loc - spawn(20) - del(S) - if (iscarbon(M)) - var/mob/living/carbon/C = M - if (!(C.species && (C.species.flags & NO_PAIN))) - M.emote("scream") - var/turf/location = src.loc - if(istype(location, /turf/simulated)) - location.add_blood(M) + for(var/atom/movable/AM in turf) + if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) + take_damage(DOOR_CRUSH_DAMAGE) use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people if(istype(src, /obj/machinery/door/airlock/glass)) @@ -927,6 +983,11 @@ About the new airlock wires panel: update_icon() return 1 +/obj/machinery/door/airlock/allowed(mob/M) + if(locked) + return 0 + return ..(M) + /obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) ..() diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index ad9d991036..053b776736 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -30,7 +30,7 @@ obj/machinery/door/airlock/proc/execute_current_command() if (!cur_command) return - + do_command(cur_command) if (command_completed(cur_command)) cur_command = null @@ -63,7 +63,7 @@ obj/machinery/door/airlock/proc/do_command(var/command) lock() sleep(2) - + send_status() obj/machinery/door/airlock/proc/command_completed(var/command) @@ -85,7 +85,7 @@ obj/machinery/door/airlock/proc/command_completed(var/command) if("secure_close") return (locked && density) - + return 1 //Unknown command. Just assume it's completed. obj/machinery/door/airlock/proc/send_status(var/bumped = 0) @@ -97,7 +97,7 @@ obj/machinery/door/airlock/proc/send_status(var/bumped = 0) signal.data["door_status"] = density?("closed"):("open") signal.data["lock_status"] = locked?("locked"):("unlocked") - + if (bumped) signal.data["bumped_with_access"] = 1 @@ -142,8 +142,10 @@ obj/machinery/door/airlock/New() if(radio_controller) set_frequency(frequency) - - +obj/machinery/door/airlock/Destroy() + if(frequency && radio_controller) + radio_controller.remove_object(src,frequency) + ..() obj/machinery/airlock_sensor icon = 'icons/obj/airlock_machines.dmi' @@ -215,6 +217,10 @@ obj/machinery/airlock_sensor/New() if(radio_controller) set_frequency(frequency) +obj/machinery/airlock_sensor/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + ..() obj/machinery/airlock_sensor/airlock_interior command = "cycle_interior" @@ -283,6 +289,11 @@ obj/machinery/access_button/New() if(radio_controller) set_frequency(frequency) +obj/machinery/access_button/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + ..() + obj/machinery/access_button/airlock_interior frequency = 1379 command = "cycle_interior" diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index 67e5c83dc3..27033903af 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -13,6 +13,11 @@ ..() air_connection = new +/obj/machinery/door/airlock/alarmlock/Destroy() + if(radio_controller) + radio_controller.remove_object(src,air_frequency) + ..() + /obj/machinery/door/airlock/alarmlock/initialize() ..() radio_controller.remove_object(src, air_frequency) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index f7058921da..e02be363f4 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -1,7 +1,4 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 -#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed - #define DOOR_REPAIR_AMOUNT 50 //amount of health regained per stack amount used /obj/machinery/door @@ -37,6 +34,9 @@ dir = EAST var/width = 1 + // turf animation + var/atom/movable/overlay/c_animation = null + /obj/machinery/door/attack_generic(var/mob/user, var/damage) if(damage >= 10) visible_message("\The [user] smashes into the [src]!") @@ -68,8 +68,7 @@ update_nearby_tiles(need_rebuild=1) return - -/obj/machinery/door/Del() +/obj/machinery/door/Destroy() density = 0 update_nearby_tiles() ..() @@ -103,8 +102,8 @@ bumpopen(M) return - if(istype(AM, /obj/machinery/bot)) - var/obj/machinery/bot/bot = AM + if(istype(AM, /mob/living/bot)) + var/mob/living/bot/bot = AM if(src.check_access(bot.botcard)) if(density) open() @@ -165,10 +164,10 @@ switch (Proj.damage_type) if(BRUTE) new /obj/item/stack/sheet/metal(src.loc, 2) - new /obj/item/stack/rods(src.loc, 3) + PoolOrNew(/obj/item/stack/rods, list(src.loc, 3)) if(BURN) new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! - del(src) + qdel(src) if(Proj.damage) //cap projectile damage so that there's still a minimum number of hits required to break the door @@ -251,7 +250,7 @@ user << "You finish repairing the damage to \the [src]." health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth) update_icon() - del(repairing) + qdel(repairing) return if(repairing && istype(I, /obj/item/weapon/crowbar)) @@ -307,6 +306,17 @@ update_icon() return + +/obj/machinery/door/examine(mob/user) + . = ..() + if(src.health < src.maxhealth / 4) + user << "\The [src] looks like it's about to break!" + else if(src.health < src.maxhealth / 2) + user << "\The [src] looks seriously damaged!" + else if(src.health < src.maxhealth * 3/4) + user << "\The [src] shows signs of damage!" + + /obj/machinery/door/proc/set_broken() stat |= BROKEN for (var/mob/O in viewers(src, null)) @@ -318,7 +328,7 @@ /obj/machinery/door/blob_act() if(prob(40)) - del(src) + qdel(src) return @@ -331,10 +341,10 @@ /obj/machinery/door/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if(prob(25)) - del(src) + qdel(src) else take_damage(300) if(3.0) @@ -377,9 +387,10 @@ return -/obj/machinery/door/proc/open() - if(!can_open()) return - if(!operating) operating = 1 +/obj/machinery/door/proc/open(var/forced = 0) + if(!can_open(forced)) + return + operating = 1 do_animate("opening") icon_state = "door0" @@ -392,8 +403,7 @@ update_icon() SetOpacity(0) update_nearby_tiles() - - if(operating) operating = 0 + operating = 0 if(autoclose) close_door_at = next_close_time() @@ -403,8 +413,8 @@ /obj/machinery/door/proc/next_close_time() return world.time + (normalspeed ? 150 : 5) -/obj/machinery/door/proc/close() - if(!can_close()) +/obj/machinery/door/proc/close(var/forced = 0) + if(!can_close(forced)) return operating = 1 @@ -424,7 +434,7 @@ //I shall not add a check every x ticks if a door has closed over some fire. var/obj/fire/fire = locate() in loc if(fire) - del fire + qdel(fire) return /obj/machinery/door/proc/requiresID() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 9ae8751a7a..a3fca76a44 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -56,7 +56,7 @@ for(var/obj/machinery/door/firedoor/F in loc) if(F != src) spawn(1) - del src + qdel(src) return . var/area/A = get_area(src) ASSERT(istype(A)) @@ -70,14 +70,15 @@ A.all_doors.Add(src) areas_added += A -/obj/machinery/door/firedoor/Del() +/obj/machinery/door/firedoor/Destroy() for(var/area/A in areas_added) A.all_doors.Remove(src) . = ..() /obj/machinery/door/firedoor/examine(mob/user) - if(!..(user, 1) && !isAI(user)) + . = ..(user, 1) + if(!. || !density) return if(pdiff >= FIREDOOR_MAX_PRESSURE_DIFF) @@ -230,7 +231,7 @@ FA.density = 1 FA.wired = 1 FA.update_icon() - del(src) + qdel(src) return if(blocked) diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm index 435a927857..d3a70fe85e 100644 --- a/code/game/machinery/doors/firedoor_assembly.dm +++ b/code/game/machinery/doors/firedoor_assembly.dm @@ -42,8 +42,8 @@ obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob) user.visible_message("[user] has inserted a circuit into \the [src]!", "You have inserted the circuit into \the [src]!") new /obj/machinery/door/firedoor(src.loc) - del(C) - del(src) + qdel(C) + qdel(src) else user << "You must secure \the [src] first!" else if(istype(C, /obj/item/weapon/wrench)) @@ -62,7 +62,7 @@ obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob) user.visible_message("[user] has dissassembled \the [src].", "You have dissassembled \the [src].") new /obj/item/stack/sheet/metal(src.loc, 2) - del (src) + qdel(src) else user << "You need more welding fuel." else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 362753cac8..b91270ad60 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -49,16 +49,16 @@ playsound(src, "shatter", 70, 1) if(display_message) visible_message("[src] shatters!") - del(src) + qdel(src) -/obj/machinery/door/window/Del() +/obj/machinery/door/window/Destroy() density = 0 update_nearby_tiles() ..() /obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj) if (!( ismob(AM) )) - var/obj/machinery/bot/bot = AM + var/mob/living/bot/bot = AM if(istype(bot)) if(density && src.check_access(bot.botcard)) open() diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index dbe7f1b8a7..ec9f4e7acc 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -9,7 +9,7 @@ var/list/doppler_arrays = list() ..() doppler_arrays += src -/obj/machinery/doppler_array/Del() +/obj/machinery/doppler_array/Destroy() doppler_arrays -= src ..() diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm index 032676f037..987634d02a 100644 --- a/code/game/machinery/embedded_controller/docking_program.dm +++ b/code/game/machinery/embedded_controller/docking_program.dm @@ -71,6 +71,15 @@ var/override_enabled = 0 //when enabled, do not open/close doors or cycle airlocks and wait for the player to do it manually var/received_confirm = 0 //for undocking, whether the server has recieved a confirmation from the client +/datum/computer/file/embedded_program/docking/New() + ..() + var/datum/existing = locate(id_tag) //in case a datum already exists with our tag + if(existing) + existing.tag = null //take it from them + + tag = id_tag //Greatly simplifies shuttle initialization + + /datum/computer/file/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id var/command = signal.data["command"] diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 8661651a39..a128e6c4e4 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -9,6 +9,11 @@ var/on = 1 +obj/machinery/embedded_controller/radio/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + ..() + /obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line) return 0 @@ -70,7 +75,7 @@ //use_power(radio_power_use) //neat idea, but causes way too much lag. return radio_connection.post_signal(src, signal, filter) else - del(signal) + qdel(signal) /obj/machinery/embedded_controller/radio/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) diff --git a/code/game/machinery/embedded_controller/embedded_program_base.dm b/code/game/machinery/embedded_controller/embedded_program_base.dm index 611fcfc52e..f579aca6f7 100644 --- a/code/game/machinery/embedded_controller/embedded_program_base.dm +++ b/code/game/machinery/embedded_controller/embedded_program_base.dm @@ -1,27 +1,27 @@ - -/datum/computer/file/embedded_program - var/list/memory = list() - var/obj/machinery/embedded_controller/master - - var/id_tag - -/datum/computer/file/embedded_program/New(var/obj/machinery/embedded_controller/M) - master = M - if (istype(M, /obj/machinery/embedded_controller/radio)) - var/obj/machinery/embedded_controller/radio/R = M - id_tag = R.id_tag - -/datum/computer/file/embedded_program/proc/receive_user_command(command) - return - -/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param) - return - -/datum/computer/file/embedded_program/proc/process() - return - -/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line) - if(master) - master.post_signal(signal, comm_line) - else - del(signal) + +/datum/computer/file/embedded_program + var/list/memory = list() + var/obj/machinery/embedded_controller/master + + var/id_tag + +/datum/computer/file/embedded_program/New(var/obj/machinery/embedded_controller/M) + master = M + if (istype(M, /obj/machinery/embedded_controller/radio)) + var/obj/machinery/embedded_controller/radio/R = M + id_tag = R.id_tag + +/datum/computer/file/embedded_program/proc/receive_user_command(command) + return + +/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param) + return + +/datum/computer/file/embedded_program/proc/process() + return + +/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line) + if(master) + master.post_signal(signal, comm_line) + else + qdel(signal) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm new file mode 100644 index 0000000000..009d1c7694 --- /dev/null +++ b/code/game/machinery/floorlayer.dm @@ -0,0 +1,114 @@ +/obj/machinery/floorlayer + + name = "automatic floor layer" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "pipe_d" + density = 1 + var/turf/old_turf + var/on = 0 + var/obj/item/stack/tile/T + var/list/mode = list("dismantle"=0,"laying"=0,"collect"=0) + +/obj/machinery/floorlayer/New() + T = new/obj/item/stack/tile/plasteel(src) + ..() + +/obj/machinery/floorlayer/Move(new_turf,M_Dir) + ..() + + if(on) + if(mode["dismantle"]) + dismantleFloor(old_turf) + + if(mode["laying"]) + layFloor(old_turf) + + if(mode["collect"]) + CollectTiles(old_turf) + + + old_turf = new_turf + +/obj/machinery/floorlayer/attack_hand(mob/user as mob) + on=!on + user.visible_message("[user] has [!on?"de":""]activated \the [src].", "You [!on?"de":""]activate \the [src].") + return + +/obj/machinery/floorlayer/attackby(var/obj/item/W as obj, var/mob/user as mob) + + if (istype(W, /obj/item/weapon/wrench)) + var/m = input("Choose work mode", "Mode") as null|anything in mode + mode[m] = !mode[m] + var/O = mode[m] + user.visible_message("[usr] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") + return + + if(istype(W, /obj/item/stack/tile)) + user << "\The [W] successfully loaded." + user.drop_item(T) + TakeTile(T) + return + + if(istype(W, /obj/item/weapon/crowbar)) + if(!length(contents)) + user << "\The [src] is empty." + else + var/obj/item/stack/tile/E = input("Choose remove tile type.", "Tiles") as null|anything in contents + if(E) + user << "You remove the [E] from /the [src]." + E.loc = src.loc + T = null + return + + if(istype(W, /obj/item/weapon/screwdriver)) + T = input("Choose tile type.", "Tiles") as null|anything in contents + return + ..() + +/obj/machinery/floorlayer/examine(mob/user) + ..() + var/dismantle = mode["dismantle"] + var/laying = mode["laying"] + var/collect = mode["collect"] + user << "\The [src] [!T?"don't ":""]has [!T?"":"[T.get_amount()] [T] "]tile\s, dismantle is [dismantle?"on":"off"], laying is [laying?"on":"off"], collect is [collect?"on":"off"]." + +/obj/machinery/floorlayer/proc/reset() + on=0 + return + +/obj/machinery/floorlayer/proc/dismantleFloor(var/turf/new_turf) + if(istype(new_turf, /turf/simulated/floor)) + var/turf/simulated/floor/T = new_turf + if(!T.is_plating()) + if(!T.broken && !T.burnt) + new T.floor_type(T) + T.make_plating() + return !new_turf.intact + +/obj/machinery/floorlayer/proc/TakeNewStack() + for(var/obj/item/stack/tile/tile in contents) + T = tile + return 1 + return 0 + +/obj/machinery/floorlayer/proc/SortStacks() + for(var/obj/item/stack/tile/tile1 in contents) + for(var/obj/item/stack/tile/tile2 in contents) + tile2.transfer_to(tile1) + +/obj/machinery/floorlayer/proc/layFloor(var/turf/w_turf) + if(!T) + if(!TakeNewStack()) + return 0 + w_turf.attackby(T , src) + return 1 + +/obj/machinery/floorlayer/proc/TakeTile(var/obj/item/stack/tile/tile) + if(!T) T = tile + tile.loc = src + + SortStacks() + +/obj/machinery/floorlayer/proc/CollectTiles(var/turf/w_turf) + for(var/obj/item/stack/tile/tile in w_turf) + TakeTile(tile) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index a286b530ca..8ecbd53838 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -131,7 +131,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user) if(user.holo == src) user.holo = null - del(masters[user])//Get rid of user's hologram //qdel + qdel(masters[user])//Get rid of user's hologram masters -= user //Discard AI from the list of those who use holopad if (!masters.len)//If no users left SetLuminosity(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted) @@ -182,24 +182,24 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if (prob(50)) - del(src) + qdel(src) if(3.0) if (prob(5)) - del(src) + qdel(src) return /obj/machinery/hologram/blob_act() - del(src) + qdel(src) return /obj/machinery/hologram/meteorhit() - del(src) + qdel(src) return -/obj/machinery/hologram/holopad/Del() +/obj/machinery/hologram/holopad/Destroy() for (var/mob/living/silicon/ai/master in masters) clear_holo(master) ..() diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 63ad92f017..658686d953 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -32,7 +32,7 @@ if(80 to 90) filling.icon_state = "reagent80" if(91 to INFINITY) filling.icon_state = "reagent100" - filling.icon += mix_color_from_reagents(reagents.reagent_list) + filling.icon += reagents.get_color() overlays += filling /obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 972f51bd48..48565d0c77 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -36,7 +36,7 @@ datum/track/New(var/title_name, var/audio) ) -/obj/machinery/media/jukebox/Del() +/obj/machinery/media/jukebox/Destroy() StopPlaying() ..() @@ -160,7 +160,7 @@ datum/track/New(var/title_name, var/audio) s.start() new /obj/effect/decal/cleanable/blood/oil(src.loc) - del(src) + qdel(src) /obj/machinery/media/jukebox/attackby(obj/item/W as obj, mob/user as mob) src.add_fingerprint(user) @@ -205,11 +205,11 @@ datum/track/New(var/title_name, var/audio) var/area/main_area = get_area(src) for(var/area/related_area in main_area.related) - related_area.forced_ambience = sound(current_track.sound, channel = 1, repeat = 1, volume = 25) + related_area.forced_ambience = list(current_track.sound) for(var/mob/living/M in mobs_in_area(related_area)) if(M.mind) - related_area.play_ambience(related_area) + related_area.play_ambience(M) playing = 1 update_use_power(2) diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 1283e7e52c..69f6c1a2d5 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -31,7 +31,7 @@ if(isturf(input_obj.loc)) input_plate = input_obj.loc gib_throw_dir = i - del(input_obj) + qdel(input_obj) break if(!input_plate) @@ -221,7 +221,7 @@ src.operating = 0 src.occupant.gib() - del(src.occupant) + qdel(src.occupant) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) operating = 0 @@ -229,7 +229,7 @@ // Todo: unify limbs and internal organs // There's a chance that the gibber will fail to destroy some evidence. if((istype(thing,/obj/item/organ) || istype(thing,/obj/item/organ)) && prob(80)) - del(thing) + qdel(thing) continue thing.loc = get_turf(thing) // Drop it onto the turf for throwing. thing.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(0,3),emagged ? 100 : 50) // Being pelted with bits of meat and bone would hurt. diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index fbdcfd2760..23efb8ab4c 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -111,6 +111,7 @@ user.visible_message( \ "\blue [user] has added one of [O] to \the [src].", \ "\blue You add one of [O] to \the [src].") + return else // user.remove_from_mob(O) //This just causes problems so far as I can tell. -Pete user.drop_item() @@ -118,6 +119,7 @@ user.visible_message( \ "\blue [user] has added \the [O] to \the [src].", \ "\blue You add \the [O] to \the [src].") + return else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \ istype(O,/obj/item/weapon/reagent_containers/food/condiment) \ @@ -135,11 +137,12 @@ return 1 else user << "\red You have no idea what you can cook with this [O]." - return 1 + ..() src.updateUsrDialog() /obj/machinery/microwave/attack_ai(mob/user as mob) - return 0 + if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) + attack_hand(user) /obj/machinery/microwave/attack_hand(mob/user as mob) user.set_machine(src) @@ -350,7 +353,7 @@ var/id = O.reagents.get_master_reagent_id() if (id) amount+=O.reagents.get_reagent_amount(id) - del(O) + qdel(O) src.reagents.clear_reagents() ffuu.reagents.add_reagent("carbon", amount) ffuu.reagents.add_reagent("toxin", amount/10) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 1b1bb9bfb5..9bfa0e1c5d 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -33,8 +33,8 @@ else wires = new/datum/wires/smartfridge(src) -/obj/machinery/smartfridge/Del() - del(wires) // qdel +/obj/machinery/smartfridge/Destroy() + qdel(wires) ..() /obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj) @@ -140,12 +140,13 @@ S.dry = 1 item_quants[S.name]-- S.name = "dried [S.name]" + S.color = "#AAAAAA" S.loc = loc else var/D = S.dried_type new D(loc) item_quants[S.name]-- - del(S) + qdel(S) return return @@ -244,7 +245,7 @@ ..() /obj/machinery/smartfridge/attack_ai(mob/user as mob) - return 0 + attack_hand(user) /obj/machinery/smartfridge/attack_hand(mob/user as mob) if(stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index c573229a10..0668906b70 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -49,7 +49,7 @@ Class Variables: Class Procs: New() 'game/machinery/machine.dm' - Del() 'game/machinery/machine.dm' + Destroy() 'game/machinery/machine.dm' auto_use_power() 'game/machinery/machine.dm' This proc determines how power mode power is deducted by the machine. @@ -121,7 +121,7 @@ Class Procs: machines += src machinery_sort_required = 1 -/obj/machinery/Del() +/obj/machinery/Destroy() machines -= src ..() @@ -135,7 +135,7 @@ Class Procs: if(use_power && stat == 0) use_power(7500/severity) - var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc ) + var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc) pulse2.icon = 'icons/effects/effects.dmi' pulse2.icon_state = "empdisable" pulse2.name = "emp sparks" @@ -143,28 +143,28 @@ Class Procs: pulse2.set_dir(pick(cardinal)) spawn(10) - pulse2.delete() + qdel(pulse2) ..() /obj/machinery/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(25)) - del(src) + qdel(src) return else return /obj/machinery/blob_act() if(prob(50)) - del(src) + qdel(src) //sets the use_power var and then forces an area power update /obj/machinery/proc/update_use_power(var/new_use_power, var/force_update = 0) @@ -185,7 +185,7 @@ Class Procs: /obj/machinery/proc/inoperable(var/additional_flags = 0) return (stat & (NOPOWER|BROKEN|additional_flags)) -/obj/machinery/CanUseTopic(var/mob/user, var/be_close) +/obj/machinery/CanUseTopic(var/mob/user) if(!interact_offline && (stat & (NOPOWER|BROKEN))) return STATUS_CLOSE @@ -331,53 +331,5 @@ Class Procs: if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = loc - del(src) + qdel(src) return 1 - -/obj/machinery/proc/on_assess_perp(mob/living/carbon/human/perp) - return 0 - -/obj/machinery/proc/is_assess_emagged() - return emagged - -/obj/machinery/proc/assess_perp(mob/living/carbon/human/perp, var/auth_weapons, var/check_records, var/check_arrest) - var/threatcount = 0 //the integer returned - - if(is_assess_emagged()) - return 10 //if emagged, always return 10. - - threatcount += on_assess_perp(perp) - if(threatcount >= 10) - return threatcount - - //Agent cards lower threatlevel. - var/obj/item/weapon/card/id/id = GetIdCard(perp) - if(id && istype(id, /obj/item/weapon/card/id/syndicate)) - threatcount -= 2 - - if(auth_weapons && !src.allowed(perp)) - if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee)) - threatcount += 4 - - if(istype(perp.r_hand, /obj/item/weapon/gun) || istype(perp.r_hand, /obj/item/weapon/melee)) - threatcount += 4 - - if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee)) - threatcount += 2 - - if(perp.species.name != "Human") //beepsky so racist. - threatcount += 2 - - if(check_records || check_arrest) - var/perpname = perp.name - if(id) - perpname = id.registered_name - - var/datum/data/record/R = find_security_record("name", perpname) - if(check_records && !R) - threatcount += 4 - - if(check_arrest && R && (R.fields["criminal"] == "*Arrest*")) - threatcount += 4 - - return threatcount diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index b04e9d1851..501d7a0b75 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -164,7 +164,7 @@ if(prob(electricity_level)) explosion(loc, 0, 1, 2, 3) // ooo dat shit EXPLODES son spawn(2) - del(src) + qdel(src) */ updateicon() @@ -190,8 +190,10 @@ pulling = 0 - - +/obj/machinery/magnetic_module/Destroy() + if(radio_controller) + radio_controller.remove_object(src, freq) + ..() /obj/machinery/magnetic_controller name = "Magnetic Control Console" @@ -364,7 +366,7 @@ // N, S, E, W are directional // C is center // R is random (in magnetic field's bounds) - del(signal) + qdel(signal) break // break the loop if the character located is invalid signal.data["command"] = nextmove @@ -399,25 +401,7 @@ // there doesn't HAVE to be separators but it makes paths syntatically visible - - - - - - - - - - - - - - - - - - - - - - +/obj/machinery/magnetic_controller/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + ..() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index de2a13aab5..d7224f2212 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -240,6 +240,7 @@ Transponder Codes:
      "} updateDialog() - - - +/obj/machinery/navbeacon/Destroy() + if(radio_controller) + radio_controller.remove_object(src, freq) + ..() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 3a238e24b0..6d823e23fe 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -180,7 +180,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.update_icon() //for any custom ones on the map... ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that -/obj/machinery/newscaster/Del() +/obj/machinery/newscaster/Destroy() allCasters -= src ..() @@ -223,12 +223,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) src.isbroken=1 if(prob(50)) - del(src) + qdel(src) else src.update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in. return @@ -496,7 +496,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) if(href_list["set_channel_name"]) - src.channel_name = sanitizeSafe(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")) + src.channel_name = sanitizeSafe(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""), MAX_LNAME_LEN) src.updateUsrDialog() //src.update_icon() @@ -596,7 +596,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["set_wanted_name"]) - src.channel_name = sanitizeSafe(input(usr, "Provide the name of the Wanted person", "Network Security Handler", "")) + src.channel_name = sanitizeSafe(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""), MAX_LNAME_LEN) src.updateUsrDialog() else if(href_list["set_wanted_desc"]) @@ -784,7 +784,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co photo_data.photo.loc = src.loc if(!issilicon(user)) user.put_in_inactive_hand(photo_data.photo) - del(photo_data) + qdel(photo_data) if(istype(user.get_active_hand(), /obj/item/weapon/photo)) var/obj/item/photo = user.get_active_hand() diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index d13f18c3e9..2fb1c721d3 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -423,7 +423,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) return return -/obj/item/weapon/disk/nuclear/Del() +/obj/item/weapon/disk/nuclear/Destroy() if(blobstart.len > 0) var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart)) message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).") diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index de67e7cea1..cb80bd20af 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -180,8 +180,8 @@ HI.Insert(I, frame=1, delay = 5) HI.Insert(J, frame=2, delay = 5) - del(I) - del(J) + qdel(I) + qdel(J) H.icon = HI H.layer = 25 usr.mapobjs += H @@ -306,7 +306,7 @@ var/icon/I = imap[i+1] H.icon = I - del(I) + qdel(I) H.layer = 25 usr.mapobjs += H @@ -353,7 +353,7 @@ proc/getb(col) /mob/proc/clearmap() src.client.screen -= src.mapobjs for(var/obj/screen/O in mapobjs) - del(O) + qdel(O) mapobjs = null src.unset_machine() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 637bcbee11..9bee0af72f 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -1149,7 +1149,7 @@ Buildable meters "[user] fastens the [src].", \ "\blue You have fastened the [src].", \ "You hear ratchet.") - del(src) // remove the pipe item + qdel(src) // remove the pipe item return //TODO: DEFERRED @@ -1177,7 +1177,7 @@ Buildable meters new/obj/machinery/meter( src.loc ) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "\blue You have fastened the meter to the pipe" - del(src) + qdel(src) //not sure why these are necessary #undef PIPE_SIMPLE_STRAIGHT #undef PIPE_SIMPLE_BENT diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index fb296d2409..6b8793eac7 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -103,7 +103,7 @@ if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) usr << "\blue You put [W] back to [src]." user.drop_item() - del(W) + qdel(W) return else if (istype(W, /obj/item/weapon/wrench)) if (unwrenched==0) @@ -145,7 +145,7 @@ //Allow you to push disposal pipes into it (for those with density 1) /obj/machinery/pipedispenser/disposal/Crossed(var/obj/structure/disposalconstruct/pipe as obj) if(istype(pipe) && !pipe.anchored) - del(pipe) + qdel(pipe) Nah */ @@ -161,7 +161,7 @@ Nah if (pipe.anchored) return - del(pipe) + qdel(pipe) /obj/machinery/pipedispenser/disposal/attack_hand(user as mob) if(..()) diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm new file mode 100644 index 0000000000..32aafb21cd --- /dev/null +++ b/code/game/machinery/pipe/pipelayer.dm @@ -0,0 +1,137 @@ +/obj/machinery/pipelayer + + name = "automatic pipe layer" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "pipe_d" + density = 1 + var/turf/old_turf + var/old_dir + var/on = 0 + var/a_dis = 0 + var/P_type = 0 + var/P_type_t = "" + var/max_metal = 50 + var/metal = 10 + var/obj/item/weapon/wrench/W + var/list/Pipes = list("regular pipes"=0,"scrubbers pipes"=31,"supply pipes"=29,"heat exchange pipes"=2) + +/obj/machinery/pipelayer/New() + W = new(src) + ..() + +/obj/machinery/pipelayer/Move(new_turf,M_Dir) + ..() + + if(on && a_dis) + dismantleFloor(old_turf) + layPipe(old_turf,M_Dir,old_dir) + + old_turf = new_turf + old_dir = turn(M_Dir,180) + +/obj/machinery/pipelayer/attack_hand(mob/user as mob) + if(!metal&&!on) + user << "\The [src] doesn't work without metal." + return + on=!on + user.visible_message("[user] has [!on?"de":""]activated \the [src].", "You [!on?"de":""]activate \the [src].") + return + +/obj/machinery/pipelayer/attackby(var/obj/item/W as obj, var/mob/user as mob) + + if (istype(W, /obj/item/weapon/wrench)) + P_type_t = input("Choose pipe type", "Pipe type") as null|anything in Pipes + P_type = Pipes[P_type_t] + user.visible_message("[user] has set \the [src] to manufacture [P_type_t].", "You set \the [src] to manufacture [P_type_t].") + return + + if(istype(W, /obj/item/weapon/crowbar)) + a_dis=!a_dis + user.visible_message("[user] has [!a_dis?"de":""]activated auto-dismantling.", "You [!a_dis?"de":""]activate auto-dismantling.") + return + + if(istype(W, /obj/item/stack/sheet/metal)) + + var/result = load_metal(W) + if(isnull(result)) + user << "Unable to load [W] - no metal found." + else if(!result) + user << "\The [src] is full." + else + user.visible_message("[user] has loaded metal into \the [src].", "You load metal into \the [src]") + + return + + if(istype(W, /obj/item/weapon/screwdriver)) + if(metal) + var/m = round(input(usr,"Please specify the amount of metal to remove","Remove metal",min(round(metal),50)) as num, 1) + m = min(m, 50) + m = min(m, round(metal)) + m = round(m) + if(m) + use_metal(m) + var/obj/item/stack/sheet/metal/MM = new (get_turf(src)) + MM.amount = m + user.visible_message("[user] removes [m] sheet\s of metal from the \the [src].", "You remove [m] sheet\s of metal from \the [src]") + else + user << "\The [src] is empty." + return + ..() + +/obj/machinery/pipelayer/examine(mob/user) + ..() + user << "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated." + +/obj/machinery/pipelayer/proc/reset() + on=0 + return + +/obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/sheet/metal/MM) + if(istype(MM) && MM.get_amount()) + var/cur_amount = metal + var/to_load = max(max_metal - round(cur_amount),0) + if(to_load) + to_load = min(MM.get_amount(), to_load) + metal += to_load + MM.use(to_load) + return to_load + else + return 0 + return + +/obj/machinery/pipelayer/proc/use_metal(amount) + if(!metal || metal\The [src] has to be secured first!" return STATUS_CLOSE - return STATUS_INTERACTIVE + return ..() /obj/machinery/porta_turret/Topic(href, href_list, var/nowindow = 0) @@ -273,7 +273,7 @@ new /obj/item/device/assembly/prox_sensor(loc) else user << "You remove the turret but did not manage to salvage anything." - del(src) // qdel + qdel(src) // qdel if(istype(I, /obj/item/weapon/card/emag) && !emagged) //Emagging the turret makes it go bonkers and stun everyone. It also makes @@ -319,7 +319,7 @@ user << "You unsecure the exterior bolts on the turret." invisibility = 0 update_icon() - del(cover) //deletes the cover, and the turret instance itself becomes its own cover. - qdel + qdel(cover) //deletes the cover, and the turret instance itself becomes its own cover. wrenching = 0 else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) @@ -389,10 +389,10 @@ /obj/machinery/porta_turret/ex_act(severity) switch (severity) if (1) - del(src) + qdel(src) if (2) if (prob(25)) - del(src) + qdel(src) else take_damage(150) //should instakill most turrets if (3) @@ -406,7 +406,7 @@ spark_system.start() //creates some sparks because they look cool density = 1 update_icon() - del(cover) //deletes the cover - no need on keeping it there! - del + qdel(cover) //deletes the cover - no need on keeping it there! /obj/machinery/porta_turret/proc/create_cover() if(cover == null && anchored) @@ -420,7 +420,7 @@ if(cover == null && anchored) //if it has no cover and is anchored if(stat & BROKEN) //if the turret is borked - del(cover) //delete its cover, assuming it has one. Workaround for a pesky little bug - qdel + qdel(cover) //delete its cover, assuming it has one. Workaround for a pesky little bug else create_cover() @@ -500,7 +500,7 @@ return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET if(ishuman(L)) //if the target is a human, analyze threat level - if(assess_perp(L, check_weapons, check_records, check_arrest) < 4) + if(assess_perp(L) < 4) return TURRET_NOT_TARGET //if threat level < 4, keep going if(L.lying) //if the perp is lying down, it's still a target but a less-important target @@ -508,6 +508,45 @@ return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee +/obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H) + if(!H || !istype(H)) + return + + if(emagged) + return 10 + + var/threatcount = 0 + var/obj/item/weapon/card/id/id = GetIdCard(H) //Agent cards lower threatlevel. + if(id && istype(id, /obj/item/weapon/card/id/syndicate)) + threatcount -= 2 + + if(check_weapons && !allowed(H)) + if(istype(H.l_hand, /obj/item/weapon/gun) || istype(H.l_hand, /obj/item/weapon/melee)) + threatcount += 4 + + if(istype(H.r_hand, /obj/item/weapon/gun) || istype(H.r_hand, /obj/item/weapon/melee)) + threatcount += 4 + + if(istype(H.belt, /obj/item/weapon/gun) || istype(H.belt, /obj/item/weapon/melee)) + threatcount += 2 + + if(H.species.name != "Human") + threatcount += 2 + + if(check_records || check_arrest) + var/perpname = H.name + if(id) + perpname = id.registered_name + + var/datum/data/record/R = find_security_record("name", perpname) + if(check_records && !R) + threatcount += 4 + + if(check_arrest && R && (R.fields["criminal"] == "*Arrest*")) + threatcount += 4 + + return threatcount + /obj/machinery/porta_turret/proc/tryToShootAt(var/list/mob/living/targets) if(targets.len && last_target && (last_target in targets) && target(last_target)) return 1 @@ -555,12 +594,14 @@ update_icon() +/* /obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp) if((check_access || attacked) && !allowed(perp)) //if the turret has been attacked or is angry, target all non-authorized personnel, see req_access return 10 return ..() + */ /obj/machinery/porta_turret/proc/target(var/mob/living/target) @@ -677,7 +718,7 @@ playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) user << "You dismantle the turret construction." new /obj/item/stack/sheet/metal( loc, 5) - del(src) // qdel + qdel(src) // qdel return if(1) @@ -742,7 +783,7 @@ target_type = /obj/machinery/porta_turret build_step = 4 - del(I) //delete the gun :( qdel + qdel(I) //delete the gun :( return else if(istype(I, /obj/item/weapon/wrench)) @@ -758,7 +799,7 @@ user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" return user << "You add the prox sensor to the turret." - del(I) // qdel + qdel(I) return //attack_hand() removes the gun @@ -813,7 +854,7 @@ // Turret.cover=new/obj/machinery/porta_turret_cover(loc) // Turret.cover.Parent_Turret=Turret // Turret.cover.name = finish_name - del(src) // qdel + qdel(src) // qdel else if(istype(I, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) @@ -823,8 +864,7 @@ return if(istype(I, /obj/item/weapon/pen)) //you can rename turrets like bots! - var/t = input(user, "Enter new turret name", name, finish_name) as text - t = sanitize(t) + var/t = sanitizeSafe(input(user, "Enter new turret name", name, finish_name) as text, MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && loc != usr) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 3c7e1613b9..a563806714 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -80,37 +80,48 @@ var/list/obj/machinery/requests_console/allConsoles = list() //req_console_departments += department switch(departmentType) if(1) - if(!("[department]" in req_console_assistance)) - req_console_assistance += department + req_console_assistance |= department if(2) - if(!("[department]" in req_console_supplies)) - req_console_supplies += department + req_console_supplies |= department if(3) - if(!("[department]" in req_console_information)) - req_console_information += department + req_console_information |= department if(4) - if(!("[department]" in req_console_assistance)) - req_console_assistance += department - if(!("[department]" in req_console_supplies)) - req_console_supplies += department + req_console_assistance |= department + req_console_supplies |= department if(5) - if(!("[department]" in req_console_assistance)) - req_console_assistance += department - if(!("[department]" in req_console_information)) - req_console_information += department + req_console_assistance |= department + req_console_information |= department if(6) - if(!("[department]" in req_console_supplies)) - req_console_supplies += department - if(!("[department]" in req_console_information)) - req_console_information += department + req_console_supplies |= department + req_console_information |= department if(7) - if(!("[department]" in req_console_assistance)) - req_console_assistance += department - if(!("[department]" in req_console_supplies)) - req_console_supplies += department - if(!("[department]" in req_console_information)) - req_console_information += department + req_console_assistance |= department + req_console_supplies |= department + req_console_information |= department +/obj/machinery/requests_console/Destroy() + allConsoles -= src + switch(departmentType) + if(1) + req_console_assistance -= department + if(2) + req_console_supplies -= department + if(3) + req_console_information -= department + if(4) + req_console_assistance -= department + req_console_supplies -= department + if(5) + req_console_assistance -= department + req_console_information -= department + if(6) + req_console_supplies -= department + req_console_information -= department + if(7) + req_console_assistance -= department + req_console_supplies -= department + req_console_information -= department + ..() /obj/machinery/requests_console/attack_hand(user as mob) if(..(user)) @@ -250,7 +261,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() if(href_list["sendAnnouncement"]) if(!announcementConsole) return - announcement.Announce(message) + announcement.Announce(message, msg_sanitized = 1) reset_announce() screen = 0 diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 4418586e9d..e9a2081fb2 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -31,7 +31,7 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob else user << "[O] doesn't seem to have any usable seeds inside it." - del(O) + qdel(O) //Grass. else if(istype(O, /obj/item/stack/tile/grass)) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 8d7ed7fccc..cf67c4d01f 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -45,6 +45,11 @@ var/const/STATUS_DISPLAY_TIME = 4 var/const/STATUS_DISPLAY_CUSTOM = 99 +/obj/machinery/status_display/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + ..() + // register for radio system /obj/machinery/status_display/initialize() ..() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 940ec0f104..d45cade6c5 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -76,12 +76,12 @@ if(1.0) if(prob(50)) src.dump_everything() //So suits dont survive all the time - del(src) + qdel(src) return if(2.0) if(prob(50)) src.dump_everything() - del(src) + qdel(src) return else return @@ -465,7 +465,7 @@ src.update_icon() // for(var/obj/O in src) -// del(O) +// qdel(O) src.add_fingerprint(usr) src.updateUsrDialog() @@ -511,7 +511,7 @@ //for(var/obj/O in src) // O.loc = src.loc src.add_fingerprint(user) - del(G) + qdel(G) src.updateUsrDialog() src.update_icon() return @@ -612,10 +612,10 @@ wires = new(src) target_department = departments[1] target_species = species[1] - if(!target_department || !target_species) del(src) + if(!target_department || !target_species) qdel(src) -/obj/machinery/suit_cycler/Del() - del(wires) // qdel +/obj/machinery/suit_cycler/Destroy() + qdel(wires) wires = null ..() @@ -696,7 +696,7 @@ src.occupant = M src.add_fingerprint(user) - del(G) + qdel(G) src.updateUsrDialog() @@ -987,7 +987,6 @@ helmet.name = "engineering voidsuit helmet" helmet.icon_state = "rig0-engineering" helmet.item_state = "eng_helm" - helmet.item_color = "engineering" if(suit) suit.name = "engineering voidsuit" suit.icon_state = "rig-engineering" @@ -997,7 +996,6 @@ helmet.name = "mining voidsuit helmet" helmet.icon_state = "rig0-mining" helmet.item_state = "mining_helm" - helmet.item_color = "mining" if(suit) suit.name = "mining voidsuit" suit.icon_state = "rig-mining" @@ -1007,7 +1005,6 @@ helmet.name = "medical voidsuit helmet" helmet.icon_state = "rig0-medical" helmet.item_state = "medical_helm" - helmet.item_color = "medical" if(suit) suit.name = "medical voidsuit" suit.icon_state = "rig-medical" @@ -1017,7 +1014,6 @@ helmet.name = "security voidsuit helmet" helmet.icon_state = "rig0-sec" helmet.item_state = "sec_helm" - helmet.item_color = "sec" if(suit) suit.name = "security voidsuit" suit.icon_state = "rig-sec" @@ -1027,7 +1023,6 @@ helmet.name = "atmospherics voidsuit helmet" helmet.icon_state = "rig0-atmos" helmet.item_state = "atmos_helm" - helmet.item_color = "atmos" if(suit) suit.name = "atmospherics voidsuit" suit.icon_state = "rig-atmos" @@ -1037,7 +1032,6 @@ helmet.name = "blood-red voidsuit helmet" helmet.icon_state = "rig0-syndie" helmet.item_state = "syndie_helm" - helmet.item_color = "syndie" if(suit) suit.name = "blood-red voidsuit" suit.item_state = "syndie_voidsuit" diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 957f7bf536..fb4a03d21f 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -95,7 +95,7 @@ if(surplus() < 1500) if(user) user << "The connected wire doesn't have enough current." return - for(var/obj/machinery/singularity/singulo in world) + for(var/obj/singularity/singulo in world) if(singulo.z == z) singulo.target = src icon_state = "[icontype]1" @@ -106,7 +106,7 @@ /obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null) - for(var/obj/machinery/singularity/singulo in world) + for(var/obj/singularity/singulo in world) if(singulo.target == src) singulo.target = null icon_state = "[icontype]0" @@ -149,7 +149,7 @@ return -/obj/machinery/power/singularity_beacon/Del() +/obj/machinery/power/singularity_beacon/Destroy() if(active) Deactivate() ..() diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 5a3caafa26..c6fee28b40 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -98,7 +98,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /* --- Do a snazzy animation! --- */ flick("broadcaster_send", src) -/obj/machinery/telecomms/broadcaster/Del() +/obj/machinery/telecomms/broadcaster/Destroy() // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. if(message_delay) message_delay = 0 diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 6dd5586fd8..9b92c39ee2 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -96,7 +96,7 @@ race = "Unidentifiable" language = race - del(M) + qdel(M) // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- @@ -189,7 +189,7 @@ temp = "- DELETED ENTRY: [D.name] -" SelectedServer.log_entries.Remove(D) - del(D) + qdel(D) else temp = "- FAILED: NO SELECTED MACHINE -" @@ -227,7 +227,7 @@ A.state = 3 A.icon_state = "3" A.anchored = 1 - del(src) + qdel(src) else user << "\blue You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) @@ -238,7 +238,7 @@ A.state = 4 A.icon_state = "4" A.anchored = 1 - del(src) + qdel(src) else if(istype(D, /obj/item/weapon/card/emag) && !emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 581ae59ab4..15c627420f 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -1,404 +1,404 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - -/* - - All telecommunications interactions: - -*/ - -#define STATION_Z 1 -#define TELECOMM_Z 3 - -/obj/machinery/telecomms - var/temp = "" // output message - var/construct_op = 0 - - -/obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob) - - // Using a multitool lets you access the receiver's interface - if(istype(P, /obj/item/device/multitool)) - attack_hand(user) - - - // REPAIRING: Use Nanopaste to repair 10-20 integrity points. - if(istype(P, /obj/item/stack/nanopaste)) - var/obj/item/stack/nanopaste/T = P - if (integrity < 100) //Damaged, let's repair! - if (T.use(1)) - integrity = between(0, integrity + rand(10,20), 100) - usr << "You apply the Nanopaste to [src], repairing some of the damage." - else - usr << "This machine is already in perfect condition." - return - - - switch(construct_op) - if(0) - if(istype(P, /obj/item/weapon/screwdriver)) - user << "You unfasten the bolts." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - construct_op ++ - if(1) - if(istype(P, /obj/item/weapon/screwdriver)) - user << "You fasten the bolts." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - construct_op -- - if(istype(P, /obj/item/weapon/wrench)) - user << "You dislodge the external plating." - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - construct_op ++ - if(2) - if(istype(P, /obj/item/weapon/wrench)) - user << "You secure the external plating." - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - construct_op -- - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." - construct_op ++ - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) - A.amount = 5 - stat |= BROKEN // the machine's been borked! - if(3) - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - if (A.use(5)) - user << "You insert the cables." - construct_op-- - stat &= ~BROKEN // the machine's not borked anymore! - else - user << "You need five coils of wire for this." - if(istype(P, /obj/item/weapon/crowbar)) - user << "You begin prying out the circuit board other components..." - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - if(do_after(user,60)) - user << "You finish prying out the components." - - // Drop all the component stuff - if(contents.len > 0) - for(var/obj/x in src) - x.loc = user.loc - else - - // If the machine wasn't made during runtime, probably doesn't have components: - // manually find the components and drop them! - var/newpath = text2path(circuitboard) - var/obj/item/weapon/circuitboard/C = new newpath - for(var/I in C.req_components) - for(var/i = 1, i <= C.req_components[I], i++) - newpath = text2path(I) - var/obj/item/s = new newpath - s.loc = user.loc - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - A.amount = 1 - - // Drop a circuit board too - C.loc = user.loc - - // Create a machine frame and delete the current machine - var/obj/machinery/constructable_frame/machine_frame/F = new - F.loc = src.loc - del(src) - - -/obj/machinery/telecomms/attack_ai(var/mob/user as mob) - attack_hand(user) - -/obj/machinery/telecomms/attack_hand(var/mob/user as mob) - - // You need a multitool to use this, or be silicon - if(!issilicon(user)) - // istype returns false if the value is null - if(!istype(user.get_active_hand(), /obj/item/device/multitool)) - return - - if(stat & (BROKEN|NOPOWER)) - return - - var/obj/item/device/multitool/P = get_multitool(user) - - user.set_machine(src) - var/dat - dat = "[src.name]

      [src.name] Access

      " - dat += "
      [temp]
      " - dat += "
      Power Status: [src.toggled ? "On" : "Off"]" - if(on && toggled) - if(id != "" && id) - dat += "
      Identification String: [id]" - else - dat += "
      Identification String: NULL" - dat += "
      Network: [network]" - dat += "
      Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]" - if(hide) dat += "
      Shadow Link: ACTIVE" - - //Show additional options for certain machines. - dat += Options_Menu() - - dat += "
      Linked Network Entities:
        " - - var/i = 0 - for(var/obj/machinery/telecomms/T in links) - i++ - if(T.hide && !src.hide) - continue - dat += "
      1. \ref[T] [T.name] ([T.id]) \[X\]
      2. " - dat += "
      " - - dat += "
      Filtering Frequencies: " - - i = 0 - if(length(freq_listening)) - for(var/x in freq_listening) - i++ - if(i < length(freq_listening)) - dat += "[format_frequency(x)] GHz\[X\]; " - else - dat += "[format_frequency(x)] GHz\[X\]" - else - dat += "NONE" - - dat += "
      \[Add Filter\]" - dat += "
      " - - if(P) - if(P.buffer) - dat += "

      MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]" - else - dat += "

      MULTITOOL BUFFER:
      \[Add Machine\]" - - dat += "
      " - temp = "" - user << browse(dat, "window=tcommachine;size=520x500;can_resize=0") - onclose(user, "dormitory") - - -// Off-Site Relays -// -// You are able to send/receive signals from the station's z level (changeable in the STATION_Z #define) if -// the relay is on the telecomm satellite (changable in the TELECOMM_Z #define) - - -/obj/machinery/telecomms/relay/proc/toggle_level() - - var/turf/position = get_turf(src) - - // Toggle on/off getting signals from the station or the current Z level - if(src.listening_level == STATION_Z) // equals the station - src.listening_level = position.z - return 1 - else if(position.z == TELECOMM_Z) - src.listening_level = STATION_Z - return 1 - return 0 - -// Returns a multitool from a user depending on their mobtype. - -/obj/machinery/telecomms/proc/get_multitool(mob/user as mob) - - var/obj/item/device/multitool/P = null - // Let's double check - if(!issilicon(user) && istype(user.get_active_hand(), /obj/item/device/multitool)) - P = user.get_active_hand() - else if(isAI(user)) - var/mob/living/silicon/ai/U = user - P = U.aiMulti - else if(isrobot(user) && in_range(user, src)) - if(istype(user.get_active_hand(), /obj/item/device/multitool)) - P = user.get_active_hand() - return P - -// Additional Options for certain machines. Use this when you want to add an option to a specific machine. -// Example of how to use below. - -/obj/machinery/telecomms/proc/Options_Menu() - return "" - -/* -// Add an option to the processor to switch processing mode. (COMPRESS -> UNCOMPRESS or UNCOMPRESS -> COMPRESS) -/obj/machinery/telecomms/processor/Options_Menu() - var/dat = "
      Processing Mode: [process_mode ? "UNCOMPRESS" : "COMPRESS"]" - return dat -*/ -// The topic for Additional Options. Use this for checking href links for your specific option. -// Example of how to use below. -/obj/machinery/telecomms/proc/Options_Topic(href, href_list) - return - -/* -/obj/machinery/telecomms/processor/Options_Topic(href, href_list) - - if(href_list["process"]) - temp = "-% Processing mode changed. %-" - src.process_mode = !src.process_mode -*/ - -// RELAY - -/obj/machinery/telecomms/relay/Options_Menu() - var/dat = "" - if(src.z == TELECOMM_Z) - dat += "
      Signal Locked to Station: [listening_level == STATION_Z ? "TRUE" : "FALSE"]" - dat += "
      Broadcasting: [broadcasting ? "YES" : "NO"]" - dat += "
      Receiving: [receiving ? "YES" : "NO"]" - return dat - -/obj/machinery/telecomms/relay/Options_Topic(href, href_list) - - if(href_list["receive"]) - receiving = !receiving - temp = "-% Receiving mode changed. %-" - if(href_list["broadcast"]) - broadcasting = !broadcasting - temp = "-% Broadcasting mode changed. %-" - if(href_list["change_listening"]) - //Lock to the station OR lock to the current position! - //You need at least two receivers and two broadcasters for this to work, this includes the machine. - var/result = toggle_level() - if(result) - temp = "-% [src]'s signal has been successfully changed." - else - temp = "-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required." - -// BUS - -/obj/machinery/telecomms/bus/Options_Menu() - var/dat = "
      Change Signal Frequency: [change_frequency ? "YES ([change_frequency])" : "NO"]" - return dat - -/obj/machinery/telecomms/bus/Options_Topic(href, href_list) - - if(href_list["change_freq"]) - - var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num - if(canAccess(usr)) - if(newfreq) - if(findtext(num2text(newfreq), ".")) - newfreq *= 10 // shift the decimal one place - if(newfreq < 10000) - change_frequency = newfreq - temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" - else - change_frequency = 0 - temp = "-% Frequency changing deactivated %-" - - -/obj/machinery/telecomms/Topic(href, href_list) - - if(!issilicon(usr)) - if(!istype(usr.get_active_hand(), /obj/item/device/multitool)) - return - - if(stat & (BROKEN|NOPOWER)) - return - - var/obj/item/device/multitool/P = get_multitool(usr) - - if(href_list["input"]) - switch(href_list["input"]) - - if("toggle") - - src.toggled = !src.toggled - temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." - update_power() - - /* - if("hide") - src.hide = !hide - temp = "-% Shadow Link has been [src.hide ? "activated" : "deactivated"]." - */ - - if("id") - var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID for this machine", src, id) as null|text),1,MAX_MESSAGE_LEN) - if(newid && canAccess(usr)) - id = newid - temp = "-% New ID assigned: \"[id]\" %-" - - if("network") - var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null|text - if(newnet && canAccess(usr)) - - if(length(newnet) > 15) - temp = "-% Too many characters in new network tag %-" - - else - for(var/obj/machinery/telecomms/T in links) - T.links.Remove(src) - - network = newnet - links = list() - temp = "-% New network tag assigned: \"[network]\" %-" - - - if("freq") - var/newfreq = input(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, network) as null|num - if(newfreq && canAccess(usr)) - if(findtext(num2text(newfreq), ".")) - newfreq *= 10 // shift the decimal one place - if(!(newfreq in freq_listening) && newfreq < 10000) - freq_listening.Add(newfreq) - temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" - - if(href_list["delete"]) - - // changed the layout about to workaround a pesky runtime -- Doohl - - var/x = text2num(href_list["delete"]) - temp = "-% Removed frequency filter [x] %-" - freq_listening.Remove(x) - - if(href_list["unlink"]) - - if(text2num(href_list["unlink"]) <= length(links)) - var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] - temp = "-% Removed \ref[T] [T.name] from linked entities. %-" - - // Remove link entries from both T and src. - - if(src in T.links) - T.links.Remove(src) - links.Remove(T) - - if(href_list["link"]) - - if(P) - if(P.buffer && P.buffer != src) - if(!(src in P.buffer.links)) - P.buffer.links.Add(src) - - if(!(P.buffer in src.links)) - src.links.Add(P.buffer) - - temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" - - else - temp = "-% Unable to acquire buffer %-" - - if(href_list["buffer"]) - - P.buffer = src - temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" - - - if(href_list["flush"]) - - temp = "-% Buffer successfully flushed. %-" - P.buffer = null - - src.Options_Topic(href, href_list) - - usr.set_machine(src) - src.add_fingerprint(usr) - - updateUsrDialog() - -/obj/machinery/telecomms/proc/canAccess(var/mob/user) - if(issilicon(user) || in_range(user, src)) - return 1 - return 0 - -#undef TELECOMM_Z -#undef STATION_Z +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + + +/* + + All telecommunications interactions: + +*/ + +#define STATION_Z 1 +#define TELECOMM_Z 3 + +/obj/machinery/telecomms + var/temp = "" // output message + var/construct_op = 0 + + +/obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob) + + // Using a multitool lets you access the receiver's interface + if(istype(P, /obj/item/device/multitool)) + attack_hand(user) + + + // REPAIRING: Use Nanopaste to repair 10-20 integrity points. + if(istype(P, /obj/item/stack/nanopaste)) + var/obj/item/stack/nanopaste/T = P + if (integrity < 100) //Damaged, let's repair! + if (T.use(1)) + integrity = between(0, integrity + rand(10,20), 100) + usr << "You apply the Nanopaste to [src], repairing some of the damage." + else + usr << "This machine is already in perfect condition." + return + + + switch(construct_op) + if(0) + if(istype(P, /obj/item/weapon/screwdriver)) + user << "You unfasten the bolts." + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + construct_op ++ + if(1) + if(istype(P, /obj/item/weapon/screwdriver)) + user << "You fasten the bolts." + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + construct_op -- + if(istype(P, /obj/item/weapon/wrench)) + user << "You dislodge the external plating." + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + construct_op ++ + if(2) + if(istype(P, /obj/item/weapon/wrench)) + user << "You secure the external plating." + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + construct_op -- + if(istype(P, /obj/item/weapon/wirecutters)) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + user << "You remove the cables." + construct_op ++ + var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) + A.amount = 5 + stat |= BROKEN // the machine's been borked! + if(3) + if(istype(P, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/A = P + if (A.use(5)) + user << "You insert the cables." + construct_op-- + stat &= ~BROKEN // the machine's not borked anymore! + else + user << "You need five coils of wire for this." + if(istype(P, /obj/item/weapon/crowbar)) + user << "You begin prying out the circuit board other components..." + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + if(do_after(user,60)) + user << "You finish prying out the components." + + // Drop all the component stuff + if(contents.len > 0) + for(var/obj/x in src) + x.loc = user.loc + else + + // If the machine wasn't made during runtime, probably doesn't have components: + // manually find the components and drop them! + var/newpath = text2path(circuitboard) + var/obj/item/weapon/circuitboard/C = new newpath + for(var/I in C.req_components) + for(var/i = 1, i <= C.req_components[I], i++) + newpath = text2path(I) + var/obj/item/s = new newpath + s.loc = user.loc + if(istype(P, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/A = P + A.amount = 1 + + // Drop a circuit board too + C.loc = user.loc + + // Create a machine frame and delete the current machine + var/obj/machinery/constructable_frame/machine_frame/F = new + F.loc = src.loc + qdel(src) + + +/obj/machinery/telecomms/attack_ai(var/mob/user as mob) + attack_hand(user) + +/obj/machinery/telecomms/attack_hand(var/mob/user as mob) + + // You need a multitool to use this, or be silicon + if(!issilicon(user)) + // istype returns false if the value is null + if(!istype(user.get_active_hand(), /obj/item/device/multitool)) + return + + if(stat & (BROKEN|NOPOWER)) + return + + var/obj/item/device/multitool/P = get_multitool(user) + + user.set_machine(src) + var/dat + dat = "[src.name]

      [src.name] Access

      " + dat += "
      [temp]
      " + dat += "
      Power Status: [src.toggled ? "On" : "Off"]" + if(on && toggled) + if(id != "" && id) + dat += "
      Identification String: [id]" + else + dat += "
      Identification String: NULL" + dat += "
      Network: [network]" + dat += "
      Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]" + if(hide) dat += "
      Shadow Link: ACTIVE" + + //Show additional options for certain machines. + dat += Options_Menu() + + dat += "
      Linked Network Entities:
        " + + var/i = 0 + for(var/obj/machinery/telecomms/T in links) + i++ + if(T.hide && !src.hide) + continue + dat += "
      1. \ref[T] [T.name] ([T.id]) \[X\]
      2. " + dat += "
      " + + dat += "
      Filtering Frequencies: " + + i = 0 + if(length(freq_listening)) + for(var/x in freq_listening) + i++ + if(i < length(freq_listening)) + dat += "[format_frequency(x)] GHz\[X\]; " + else + dat += "[format_frequency(x)] GHz\[X\]" + else + dat += "NONE" + + dat += "
      \[Add Filter\]" + dat += "
      " + + if(P) + if(P.buffer) + dat += "

      MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]" + else + dat += "

      MULTITOOL BUFFER:
      \[Add Machine\]" + + dat += "
      " + temp = "" + user << browse(dat, "window=tcommachine;size=520x500;can_resize=0") + onclose(user, "dormitory") + + +// Off-Site Relays +// +// You are able to send/receive signals from the station's z level (changeable in the STATION_Z #define) if +// the relay is on the telecomm satellite (changable in the TELECOMM_Z #define) + + +/obj/machinery/telecomms/relay/proc/toggle_level() + + var/turf/position = get_turf(src) + + // Toggle on/off getting signals from the station or the current Z level + if(src.listening_level == STATION_Z) // equals the station + src.listening_level = position.z + return 1 + else if(position.z == TELECOMM_Z) + src.listening_level = STATION_Z + return 1 + return 0 + +// Returns a multitool from a user depending on their mobtype. + +/obj/machinery/telecomms/proc/get_multitool(mob/user as mob) + + var/obj/item/device/multitool/P = null + // Let's double check + if(!issilicon(user) && istype(user.get_active_hand(), /obj/item/device/multitool)) + P = user.get_active_hand() + else if(isAI(user)) + var/mob/living/silicon/ai/U = user + P = U.aiMulti + else if(isrobot(user) && in_range(user, src)) + if(istype(user.get_active_hand(), /obj/item/device/multitool)) + P = user.get_active_hand() + return P + +// Additional Options for certain machines. Use this when you want to add an option to a specific machine. +// Example of how to use below. + +/obj/machinery/telecomms/proc/Options_Menu() + return "" + +/* +// Add an option to the processor to switch processing mode. (COMPRESS -> UNCOMPRESS or UNCOMPRESS -> COMPRESS) +/obj/machinery/telecomms/processor/Options_Menu() + var/dat = "
      Processing Mode: [process_mode ? "UNCOMPRESS" : "COMPRESS"]" + return dat +*/ +// The topic for Additional Options. Use this for checking href links for your specific option. +// Example of how to use below. +/obj/machinery/telecomms/proc/Options_Topic(href, href_list) + return + +/* +/obj/machinery/telecomms/processor/Options_Topic(href, href_list) + + if(href_list["process"]) + temp = "-% Processing mode changed. %-" + src.process_mode = !src.process_mode +*/ + +// RELAY + +/obj/machinery/telecomms/relay/Options_Menu() + var/dat = "" + if(src.z == TELECOMM_Z) + dat += "
      Signal Locked to Station: [listening_level == STATION_Z ? "TRUE" : "FALSE"]" + dat += "
      Broadcasting: [broadcasting ? "YES" : "NO"]" + dat += "
      Receiving: [receiving ? "YES" : "NO"]" + return dat + +/obj/machinery/telecomms/relay/Options_Topic(href, href_list) + + if(href_list["receive"]) + receiving = !receiving + temp = "-% Receiving mode changed. %-" + if(href_list["broadcast"]) + broadcasting = !broadcasting + temp = "-% Broadcasting mode changed. %-" + if(href_list["change_listening"]) + //Lock to the station OR lock to the current position! + //You need at least two receivers and two broadcasters for this to work, this includes the machine. + var/result = toggle_level() + if(result) + temp = "-% [src]'s signal has been successfully changed." + else + temp = "-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required." + +// BUS + +/obj/machinery/telecomms/bus/Options_Menu() + var/dat = "
      Change Signal Frequency: [change_frequency ? "YES ([change_frequency])" : "NO"]" + return dat + +/obj/machinery/telecomms/bus/Options_Topic(href, href_list) + + if(href_list["change_freq"]) + + var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num + if(canAccess(usr)) + if(newfreq) + if(findtext(num2text(newfreq), ".")) + newfreq *= 10 // shift the decimal one place + if(newfreq < 10000) + change_frequency = newfreq + temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" + else + change_frequency = 0 + temp = "-% Frequency changing deactivated %-" + + +/obj/machinery/telecomms/Topic(href, href_list) + + if(!issilicon(usr)) + if(!istype(usr.get_active_hand(), /obj/item/device/multitool)) + return + + if(stat & (BROKEN|NOPOWER)) + return + + var/obj/item/device/multitool/P = get_multitool(usr) + + if(href_list["input"]) + switch(href_list["input"]) + + if("toggle") + + src.toggled = !src.toggled + temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." + update_power() + + /* + if("hide") + src.hide = !hide + temp = "-% Shadow Link has been [src.hide ? "activated" : "deactivated"]." + */ + + if("id") + var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID for this machine", src, id) as null|text),1,MAX_MESSAGE_LEN) + if(newid && canAccess(usr)) + id = newid + temp = "-% New ID assigned: \"[id]\" %-" + + if("network") + var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null|text + if(newnet && canAccess(usr)) + + if(length(newnet) > 15) + temp = "-% Too many characters in new network tag %-" + + else + for(var/obj/machinery/telecomms/T in links) + T.links.Remove(src) + + network = newnet + links = list() + temp = "-% New network tag assigned: \"[network]\" %-" + + + if("freq") + var/newfreq = input(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, network) as null|num + if(newfreq && canAccess(usr)) + if(findtext(num2text(newfreq), ".")) + newfreq *= 10 // shift the decimal one place + if(!(newfreq in freq_listening) && newfreq < 10000) + freq_listening.Add(newfreq) + temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" + + if(href_list["delete"]) + + // changed the layout about to workaround a pesky runtime -- Doohl + + var/x = text2num(href_list["delete"]) + temp = "-% Removed frequency filter [x] %-" + freq_listening.Remove(x) + + if(href_list["unlink"]) + + if(text2num(href_list["unlink"]) <= length(links)) + var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] + temp = "-% Removed \ref[T] [T.name] from linked entities. %-" + + // Remove link entries from both T and src. + + if(src in T.links) + T.links.Remove(src) + links.Remove(T) + + if(href_list["link"]) + + if(P) + if(P.buffer && P.buffer != src) + if(!(src in P.buffer.links)) + P.buffer.links.Add(src) + + if(!(P.buffer in src.links)) + src.links.Add(P.buffer) + + temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" + + else + temp = "-% Unable to acquire buffer %-" + + if(href_list["buffer"]) + + P.buffer = src + temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" + + + if(href_list["flush"]) + + temp = "-% Buffer successfully flushed. %-" + P.buffer = null + + src.Options_Topic(href, href_list) + + usr.set_machine(src) + src.add_fingerprint(usr) + + updateUsrDialog() + +/obj/machinery/telecomms/proc/canAccess(var/mob/user) + if(issilicon(user) || in_range(user, src)) + return 1 + return 0 + +#undef TELECOMM_Z +#undef STATION_Z diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index fe638408fc..4bca127857 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -130,9 +130,11 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() for(var/obj/machinery/telecomms/T in telecomms_list) add_link(T) - -/obj/machinery/telecomms/Del() +/obj/machinery/telecomms/Destroy() telecomms_list -= src + for(var/obj/machinery/telecomms/comm in telecomms_list) + comm.links -= src + links = list() ..() // Used in auto linking diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index ea313e0052..a0f7b351ef 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -1,158 +1,158 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - -/* - Telecomms monitor tracks the overall trafficing of a telecommunications network - and displays a heirarchy of linked machines. -*/ - - -/obj/machinery/computer/telecomms/monitor - name = "Telecommunications Monitor" - icon_state = "comm_monitor" - - var/screen = 0 // the screen number: - var/list/machinelist = list() // the machines located by the computer - var/obj/machinery/telecomms/SelectedMachine - - var/network = "NULL" // the network to probe - - var/temp = "" // temporary feedback messages - - attack_hand(mob/user as mob) - if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "Telecommunications Monitor
      Telecommunications Monitor
      " - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
      [temp]

      " - dat += "
      Current Network: [network]
      " - if(machinelist.len) - dat += "
      Detected Network Entities:
        " - for(var/obj/machinery/telecomms/T in machinelist) - dat += "
      • \ref[T] [T.name] ([T.id])
      • " - dat += "
      " - dat += "
      \[Flush Buffer\]" - else - dat += "\[Probe Network\]" - - - // --- Viewing Machine --- - - if(1) - dat += "
      [temp]
      " - dat += "
      \[Main Menu\]
      " - dat += "
      Current Network: [network]
      " - dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
      " - dat += "Linked Entities:
        " - for(var/obj/machinery/telecomms/T in SelectedMachine.links) - if(!T.hide) - dat += "
      1. \ref[T.id] [T.name] ([T.id])
      2. " - dat += "
      " - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - - Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewmachine"]) - screen = 1 - for(var/obj/machinery/telecomms/T in machinelist) - if(T.id == href_list["viewmachine"]) - SelectedMachine = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - machinelist = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("probe") - if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/T in range(25, src)) - if(T.network == network) - machinelist.Add(T) - - if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" - else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" - - screen = 0 - - - if(href_list["network"]) - - var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - network = newnet - screen = 0 - machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - - attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) - if(istype(D, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) - else if(istype(D, /obj/item/weapon/card/emag) && !emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "\blue You you disable the security protocols" - src.updateUsrDialog() - return +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + + +/* + Telecomms monitor tracks the overall trafficing of a telecommunications network + and displays a heirarchy of linked machines. +*/ + + +/obj/machinery/computer/telecomms/monitor + name = "Telecommunications Monitor" + icon_state = "comm_monitor" + + var/screen = 0 // the screen number: + var/list/machinelist = list() // the machines located by the computer + var/obj/machinery/telecomms/SelectedMachine + + var/network = "NULL" // the network to probe + + var/temp = "" // temporary feedback messages + + attack_hand(mob/user as mob) + if(stat & (BROKEN|NOPOWER)) + return + user.set_machine(src) + var/dat = "Telecommunications Monitor
      Telecommunications Monitor
      " + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
      [temp]

      " + dat += "
      Current Network: [network]
      " + if(machinelist.len) + dat += "
      Detected Network Entities:
        " + for(var/obj/machinery/telecomms/T in machinelist) + dat += "
      • \ref[T] [T.name] ([T.id])
      • " + dat += "
      " + dat += "
      \[Flush Buffer\]" + else + dat += "\[Probe Network\]" + + + // --- Viewing Machine --- + + if(1) + dat += "
      [temp]
      " + dat += "
      \[Main Menu\]
      " + dat += "
      Current Network: [network]
      " + dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
      " + dat += "Linked Entities:
        " + for(var/obj/machinery/telecomms/T in SelectedMachine.links) + if(!T.hide) + dat += "
      1. \ref[T.id] [T.name] ([T.id])
      2. " + dat += "
      " + + + + user << browse(dat, "window=comm_monitor;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + + Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["viewmachine"]) + screen = 1 + for(var/obj/machinery/telecomms/T in machinelist) + if(T.id == href_list["viewmachine"]) + SelectedMachine = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + machinelist = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("probe") + if(machinelist.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/T in range(25, src)) + if(T.network == network) + machinelist.Add(T) + + if(!machinelist.len) + temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" + else + temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" + + screen = 0 + + + if(href_list["network"]) + + var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + network = newnet + screen = 0 + machinelist = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + + attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) + if(istype(D, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + qdel(src) + else + user << "\blue You disconnect the monitor." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + qdel(src) + else if(istype(D, /obj/item/weapon/card/emag) && !emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "\blue You you disable the security protocols" + src.updateUsrDialog() + return diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 226c47229e..287577626c 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -1,241 +1,241 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - - - - -/obj/machinery/computer/telecomms/traffic - name = "Telecommunications Traffic Control" - icon_state = "computer_generic" - - var/screen = 0 // the screen number: - var/list/servers = list() // the servers located by the computer - var/mob/editingcode - var/mob/lasteditor - var/list/viewingcode = list() - var/obj/machinery/telecomms/server/SelectedServer - - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - - var/storedcode = "" // code stored - - - proc/update_ide() - - // loop if there's someone manning the keyboard - while(editingcode) - if(!editingcode.client) - editingcode = null - break - - // For the typer, the input is enabled. Buffer the typed text - if(editingcode) - storedcode = "[winget(editingcode, "tcscode", "text")]" - if(editingcode) // double if's to work around a runtime error - winset(editingcode, "tcscode", "is-disabled=false") - - // If the player's not manning the keyboard anymore, adjust everything - if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode))) - if(editingcode) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode = null - break - - // For other people viewing the typer type code, the input is disabled and they can only view the code - // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) - - if(length(viewingcode)) - // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - - for(var/mob/M in viewingcode) - - if( (M.machine == src && M in view(1, src) ) || issilicon(M)) - winset(M, "tcscode", "is-disabled=true") - winset(M, "tcscode", "text=\"[showcode]\"") - else - viewingcode.Remove(M) - winshow(M, "Telecomms IDE", 0) // hide the window! - - sleep(5) - - if(length(viewingcode) > 0) - editingcode = pick(viewingcode) - viewingcode.Remove(editingcode) - update_ide() - - - - req_access = list(access_tcomsat) - - attack_hand(mob/user as mob) - if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "Telecommunication Traffic Control
      Telecommunications Traffic Control
      " - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
      [temp]
      " - dat += "
      Current Network: [network]
      " - if(servers.len) - dat += "
      Detected Telecommunication Servers:
        " - for(var/obj/machinery/telecomms/T in servers) - dat += "
      • \ref[T] [T.name] ([T.id])
      • " - dat += "
      " - dat += "
      \[Flush Buffer\]" - - else - dat += "
      No servers detected. Scan for servers: \[Scan\]" - - - // --- Viewing Server --- - - if(1) - dat += "
      [temp]
      " - dat += "
      \[Main Menu\] \[Refresh\]
      " - dat += "
      Current Network: [network]" - dat += "
      Selected Server: [SelectedServer.id]

      " - dat += "
      \[Edit Code\]" - dat += "
      Signal Execution: " - if(SelectedServer.autoruncode) - dat += "ALWAYS" - else - dat += "NEVER" - - - user << browse(dat, "window=traffic_control;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - - Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - if(!src.allowed(usr) && !emagged) - usr << "\red ACCESS DENIED." - return - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if("editcode") - if(editingcode == usr) return - if(usr in viewingcode) return - - if(!editingcode) - lasteditor = usr - editingcode = usr - winshow(editingcode, "Telecomms IDE", 1) // show the IDE - winset(editingcode, "tcscode", "is-disabled=false") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - winset(editingcode, "tcscode", "text=\"[showcode]\"") - spawn() - update_ide() - - else - viewingcode.Add(usr) - winshow(usr, "Telecomms IDE", 1) // show the IDE - winset(usr, "tcscode", "is-disabled=true") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\"", "\\\"") - winset(usr, "tcscode", "text=\"[showcode]\"") - - if("togglerun") - SelectedServer.autoruncode = !(SelectedServer.autoruncode) - - if(href_list["network"]) - - var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text - - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - - attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) - if(istype(D, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - new /obj/item/weapon/shard( src.loc ) - var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) - else if(istype(D, /obj/item/weapon/card/emag) && !emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "\blue You you disable the security protocols" - src.updateUsrDialog() - return +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + + + + + +/obj/machinery/computer/telecomms/traffic + name = "Telecommunications Traffic Control" + icon_state = "computer_generic" + + var/screen = 0 // the screen number: + var/list/servers = list() // the servers located by the computer + var/mob/editingcode + var/mob/lasteditor + var/list/viewingcode = list() + var/obj/machinery/telecomms/server/SelectedServer + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/storedcode = "" // code stored + + + proc/update_ide() + + // loop if there's someone manning the keyboard + while(editingcode) + if(!editingcode.client) + editingcode = null + break + + // For the typer, the input is enabled. Buffer the typed text + if(editingcode) + storedcode = "[winget(editingcode, "tcscode", "text")]" + if(editingcode) // double if's to work around a runtime error + winset(editingcode, "tcscode", "is-disabled=false") + + // If the player's not manning the keyboard anymore, adjust everything + if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode))) + if(editingcode) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode = null + break + + // For other people viewing the typer type code, the input is disabled and they can only view the code + // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) + + if(length(viewingcode)) + // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + + for(var/mob/M in viewingcode) + + if( (M.machine == src && M in view(1, src) ) || issilicon(M)) + winset(M, "tcscode", "is-disabled=true") + winset(M, "tcscode", "text=\"[showcode]\"") + else + viewingcode.Remove(M) + winshow(M, "Telecomms IDE", 0) // hide the window! + + sleep(5) + + if(length(viewingcode) > 0) + editingcode = pick(viewingcode) + viewingcode.Remove(editingcode) + update_ide() + + + + req_access = list(access_tcomsat) + + attack_hand(mob/user as mob) + if(stat & (BROKEN|NOPOWER)) + return + user.set_machine(src) + var/dat = "Telecommunication Traffic Control
      Telecommunications Traffic Control
      " + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
      [temp]
      " + dat += "
      Current Network: [network]
      " + if(servers.len) + dat += "
      Detected Telecommunication Servers:
        " + for(var/obj/machinery/telecomms/T in servers) + dat += "
      • \ref[T] [T.name] ([T.id])
      • " + dat += "
      " + dat += "
      \[Flush Buffer\]" + + else + dat += "
      No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + dat += "
      [temp]
      " + dat += "
      \[Main Menu\] \[Refresh\]
      " + dat += "
      Current Network: [network]" + dat += "
      Selected Server: [SelectedServer.id]

      " + dat += "
      \[Edit Code\]" + dat += "
      Signal Execution: " + if(SelectedServer.autoruncode) + dat += "ALWAYS" + else + dat += "NEVER" + + + user << browse(dat, "window=traffic_control;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + + Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + if(!src.allowed(usr) && !emagged) + usr << "\red ACCESS DENIED." + return + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + + screen = 0 + + if("editcode") + if(editingcode == usr) return + if(usr in viewingcode) return + + if(!editingcode) + lasteditor = usr + editingcode = usr + winshow(editingcode, "Telecomms IDE", 1) // show the IDE + winset(editingcode, "tcscode", "is-disabled=false") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + winset(editingcode, "tcscode", "text=\"[showcode]\"") + spawn() + update_ide() + + else + viewingcode.Add(usr) + winshow(usr, "Telecomms IDE", 1) // show the IDE + winset(usr, "tcscode", "is-disabled=true") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\"", "\\\"") + winset(usr, "tcscode", "text=\"[showcode]\"") + + if("togglerun") + SelectedServer.autoruncode = !(SelectedServer.autoruncode) + + if(href_list["network"]) + + var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text + + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + + attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) + if(istype(D, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + qdel(src) + else + user << "\blue You disconnect the monitor." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + qdel(src) + else if(istype(D, /obj/item/weapon/card/emag) && !emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "\blue You you disable the security protocols" + src.updateUsrDialog() + return diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 9e68791df0..b1d45a4840 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -57,7 +57,7 @@ usr << "You insert the coordinates into the machine." usr << "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the station at all times." user.drop_item() - del(I) + qdel(I) if(C.data == "Clown Land") //whoops @@ -216,7 +216,7 @@ /* /proc/do_teleport(atom/movable/M as mob|obj, atom/destination, precision) if(istype(M, /obj/effect)) - del(M) + qdel(M) return if (istype(M, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite for(var/mob/O in viewers(M, null)) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index c463c3c497..0f68d16f77 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -37,7 +37,7 @@ lethal = 1 icon_state = "control_kill" -/obj/machinery/turretid/Del() +/obj/machinery/turretid/Destroy() if(control_area) var/area/A = control_area if(A && istype(A)) @@ -79,7 +79,7 @@ if(isLocked(user)) return STATUS_CLOSE - return STATUS_INTERACTIVE + return ..() /obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user) if(stat & BROKEN) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 21b8a2d7dd..2a6c832023 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -76,7 +76,7 @@ /obj/machinery/turret/proc/take_damage(damage) src.health -= damage if(src.health<=0) - del src + qdel(src) return /obj/machinery/turret/attack_hand(var/mob/living/carbon/human/user) @@ -108,7 +108,7 @@ /obj/machinery/turret/proc/update_health() if(src.health<=0) - del src + qdel(src) return /obj/machinery/turretcover @@ -315,7 +315,7 @@ src.health -= Proj.damage ..() if(prob(45) && Proj.damage > 0) src.spark_system.start() - del (Proj) + qdel (Proj) if (src.health <= 0) src.die() return @@ -347,11 +347,11 @@ src.stat |= BROKEN src.icon_state = "destroyed_target_prism" if (cover!=null) - del(cover) + qdel(cover) sleep(3) flick("explosion", src) spawn(13) - del(src) + qdel(src) /obj/machinery/turret/attack_generic(var/mob/user, var/damage, var/attack_message) if(!damage) @@ -386,7 +386,7 @@ proc/take_damage(damage) src.health -= damage if(src.health<=0) - del src + qdel(src) return @@ -399,15 +399,15 @@ ex_act() - del src + qdel(src) return emp_act() - del src + qdel(src) return meteorhit() - del src + qdel(src) return attack_hand(mob/user as mob) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 6f941674f2..81529cf804 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -21,7 +21,7 @@ if(!name) var/atom/tmp = new path src.product_name = initial(tmp.name) - del(tmp) + qdel(tmp) else src.product_name = name @@ -143,22 +143,21 @@ src.product_records.Add(product) -/obj/machinery/vending/Del() - del(wires) // qdel +/obj/machinery/vending/Destroy() + qdel(wires) wires = null - if(coin) - del(coin) // qdel - coin = null + qdel(coin) + coin = null ..() /obj/machinery/vending/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(25)) @@ -173,18 +172,21 @@ if (prob(50)) spawn(0) src.malfunction() - del(src) + qdel(src) return return /obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob) + + var/obj/item/weapon/card/id/I = W.GetID() + if (currently_vending && vendor_account && !vendor_account.suspended) var/paid = 0 var/handled = 0 - if(istype(W, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = W - paid = pay_with_card(C) + + if (I) //for IDs and PDAs and wallets with IDs + paid = pay_with_card(I,W) handled = 1 else if (istype(W, /obj/item/weapon/spacecash/ewallet)) var/obj/item/weapon/spacecash/ewallet/C = W @@ -202,9 +204,12 @@ nanomanager.update_uis(src) return // don't smack that machine with your 2 thalers - if (istype(W, /obj/item/weapon/card/emag)) + if (I || istype(W, /obj/item/weapon/spacecash)) + attack_hand(user) + return + else if (istype(W, /obj/item/weapon/card/emag)) src.emagged = 1 - user << "You short out the product lock on [src]" + user << "You short out the product lock on \the [src]" return else if(istype(W, /obj/item/weapon/screwdriver)) src.panel_open = !src.panel_open @@ -224,7 +229,7 @@ W.loc = src coin = W categories |= CAT_COIN - user << "\blue You insert the [W] into the [src]" + user << "\blue You insert \the [W] into \the [src]" nanomanager.update_uis(src) return else if(istype(W, /obj/item/weapon/wrench)) @@ -234,9 +239,9 @@ switch (anchored) if (0) anchored = 1 - user.visible_message("[user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") + user.visible_message("\The [user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") if (1) - user.visible_message("[user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") + user.visible_message("\The [user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") anchored = 0 return @@ -245,7 +250,7 @@ for(var/datum/data/vending_product/R in product_records) if(istype(W, R.product_path)) stock(R, user) - del(W) + qdel(W) else ..() @@ -266,13 +271,13 @@ if(istype(cashmoney, /obj/item/weapon/spacecash/bundle)) // Bundles can just have money subtracted, and will work - visible_message("[usr] inserts some cash into [src].") + visible_message("\The [usr] inserts some cash into \the [src].") var/obj/item/weapon/spacecash/bundle/cashmoney_bundle = cashmoney cashmoney_bundle.worth -= currently_vending.price if(cashmoney_bundle.worth <= 0) usr.drop_from_inventory(cashmoney_bundle) - del(cashmoney_bundle) + qdel(cashmoney_bundle) else cashmoney_bundle.update_icon() else @@ -281,10 +286,10 @@ // This is really dirty, but there's no superclass for all bills, so we // just assume that all spacecash that's not something else is a bill - visible_message("[usr] inserts a bill into [src].") + visible_message("\The [usr] inserts a bill into \the [src].") var/left = cashmoney.worth - currently_vending.price usr.drop_from_inventory(cashmoney) - del(cashmoney) + qdel(cashmoney) if(left) spawn_money(left, src.loc, user) @@ -300,7 +305,7 @@ * successful, 0 if failed. */ /obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet) - visible_message("[usr] swipes a card through [src].") + visible_message("\The [usr] swipes \the [wallet] through \the [src].") if(currently_vending.price > wallet.worth) src.status_message = "Insufficient funds on chargecard." src.status_error = 1 @@ -316,8 +321,11 @@ * Takes payment for whatever is the currently_vending item. Returns 1 if * successful, 0 if failed */ -/obj/machinery/vending/proc/pay_with_card(var/obj/item/weapon/card/id/I) - visible_message("[usr] swipes a card through [src].") +/obj/machinery/vending/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/obj/item/ID_container) + if(I==ID_container || ID_container == null) + visible_message("\The [usr] swipes \the [I] through \the [src].") + else + visible_message("\The [usr] swipes \the [ID_container] through \the [src].") var/datum/money_account/customer_account = get_account(I.associated_account_number) if (!customer_account) src.status_message = "Error: Unable to access account. Please contact technical support if problem persists." @@ -470,17 +478,6 @@ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending)) - - if(istype(usr,/mob/living/silicon)) - if(istype(usr,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = usr - if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) )) - usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" - return - else - usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" - return - if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH usr << "Access denied." //Unless emagged of course flick(icon_deny,src) @@ -495,6 +492,9 @@ if(R.price <= 0) src.vend(R, usr) + else if(istype(usr,/mob/living/silicon)) //If the item is not free, provide feedback if a synth is trying to buy something. + usr << "Artificial unit recognized. Artificial units cannot complete this transaction. Purchase canceled." + return else src.currently_vending = R if(!vendor_account || vendor_account.suspended) @@ -529,13 +529,13 @@ return if(coin.string_attached) if(prob(50)) - user << "\blue You successfully pull the coin out before the [src] could swallow it." + user << "\blue You successfully pull the coin out before \the [src] could swallow it." else user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." - del(coin) + qdel(coin) categories &= ~CAT_COIN else - del(coin) + qdel(coin) categories &= ~CAT_COIN R.amount-- @@ -558,7 +558,7 @@ /obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) if(src.panel_open) - user << "\blue You stock the [src] with \a [R.product_name]" + user << "\blue You stock \the [src] with \a [R.product_name]" R.amount++ nanomanager.update_uis(src) @@ -592,7 +592,7 @@ return for(var/mob/O in hearers(src, null)) - O.show_message("[src] beeps, \"[message]\"",2) + O.show_message("\The [src] beeps, \"[message]\"",2) return /obj/machinery/vending/power_change() @@ -938,7 +938,7 @@ desc = "Spare tool vending. What? Did you expect some witty description?" icon_state = "engivend" icon_deny = "engivend-deny" - req_access = list(access_engine_equip) //Engineering Equipment access + req_access = list(access_engine_equip) products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10) contraband = list(/obj/item/weapon/cell/potato = 3) premium = list(/obj/item/weapon/storage/belt/utility = 3) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index ad433d12e2..2f5916be67 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -50,129 +50,8 @@ for(var/obj/item/stack/sheet/hairlesshide/HH in contents) var/obj/item/stack/sheet/wetleather/WL = new(src) WL.amount = HH.amount - del(HH) - - - if(crayon) - var/wash_color - if(istype(crayon,/obj/item/toy/crayon)) - var/obj/item/toy/crayon/CR = crayon - wash_color = CR.colourName - else if(istype(crayon,/obj/item/weapon/stamp)) - var/obj/item/weapon/stamp/ST = crayon - wash_color = ST.item_color - - if(wash_color) - var/new_jumpsuit_icon_state = "" - var/new_jumpsuit_item_state = "" - var/new_jumpsuit_name = "" - var/new_glove_icon_state = "" - var/new_glove_item_state = "" - var/new_glove_name = "" - var/new_shoe_icon_state = "" - var/new_shoe_name = "" - var/new_sheet_icon_state = "" - var/new_sheet_name = "" - var/new_softcap_icon_state = "" - var/new_softcap_name = "" - var/new_desc = "The colors are a bit dodgy." - for(var/T in typesof(/obj/item/clothing/under)) - var/obj/item/clothing/under/J = new T - //world << "DEBUG: [color] == [J.color]" - if(wash_color == J.item_color) - new_jumpsuit_icon_state = J.icon_state - new_jumpsuit_item_state = J.item_state - new_jumpsuit_name = J.name - del(J) - //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" - break - del(J) - for(var/T in typesof(/obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = new T - //world << "DEBUG: [color] == [J.color]" - if(wash_color == G.item_color) - new_glove_icon_state = G.icon_state - new_glove_item_state = G.item_state - new_glove_name = G.name - del(G) - //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" - break - del(G) - for(var/T in typesof(/obj/item/clothing/shoes)) - var/obj/item/clothing/shoes/S = new T - //world << "DEBUG: [color] == [J.color]" - if(wash_color == S.item_color) - new_shoe_icon_state = S.icon_state - new_shoe_name = S.name - del(S) - //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" - break - del(S) - for(var/T in typesof(/obj/item/weapon/bedsheet)) - var/obj/item/weapon/bedsheet/B = new T - //world << "DEBUG: [color] == [J.color]" - if(wash_color == B.item_color) - new_sheet_icon_state = B.icon_state - new_sheet_name = B.name - del(B) - //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" - break - del(B) - for(var/T in typesof(/obj/item/clothing/head/soft)) - var/obj/item/clothing/head/soft/H = new T - //world << "DEBUG: [color] == [J.color]" - if(wash_color == H.item_color) - new_softcap_icon_state = H.icon_state - new_softcap_name = H.name - del(H) - //world << "DEBUG: YUP! [new_icon_state] and [new_item_state]" - break - del(H) - if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name) - for(var/obj/item/clothing/under/J in contents) - //world << "DEBUG: YUP! FOUND IT!" - J.item_state = new_jumpsuit_item_state - J.icon_state = new_jumpsuit_icon_state - J.item_color = wash_color - J.name = new_jumpsuit_name - J.desc = new_desc - if(new_glove_icon_state && new_glove_item_state && new_glove_name) - for(var/obj/item/clothing/gloves/G in contents) - //world << "DEBUG: YUP! FOUND IT!" - G.item_state = new_glove_item_state - G.icon_state = new_glove_icon_state - G.item_color = wash_color - G.name = new_glove_name - G.desc = new_desc - if(new_shoe_icon_state && new_shoe_name) - for(var/obj/item/clothing/shoes/S in contents) - //world << "DEBUG: YUP! FOUND IT!" - if (istype(S,/obj/item/clothing/shoes/orange)) - var/obj/item/clothing/shoes/orange/L = S - if (L.chained) - L.remove_cuffs() - S.icon_state = new_shoe_icon_state - S.item_color = wash_color - S.name = new_shoe_name - S.desc = new_desc - if(new_sheet_icon_state && new_sheet_name) - for(var/obj/item/weapon/bedsheet/B in contents) - //world << "DEBUG: YUP! FOUND IT!" - B.icon_state = new_sheet_icon_state - B.item_color = wash_color - B.name = new_sheet_name - B.desc = new_desc - if(new_softcap_icon_state && new_softcap_name) - for(var/obj/item/clothing/head/soft/H in contents) - //world << "DEBUG: YUP! FOUND IT!" - H.icon_state = new_softcap_icon_state - H.item_color = wash_color - H.name = new_softcap_name - H.desc = new_desc - del(crayon) - crayon = null - - + qdel(HH) + if( locate(/mob,contents) ) state = 7 gibs_ready = 1 @@ -212,7 +91,7 @@ var/obj/item/weapon/grab/G = W if(ishuman(G.assailant) && iscorgi(G.affecting)) G.affecting.loc = src - del(G) + qdel(G) state = 3 else ..() diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index d7e64c1ece..bf23e579f3 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -63,7 +63,7 @@ if(equipment.len)//Now to remove it and equip anew. for(ME in equipment) equipment -= ME - del(ME) + qdel(ME) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive(src) @@ -76,6 +76,10 @@ ME.attach(src) return +/obj/mecha/combat/marauder/Destroy() + qdel(smoke_system) + ..() + /obj/mecha/combat/marauder/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. user.loc = get_turf(src) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 2a6e2b6214..f53533828b 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -59,7 +59,7 @@ else chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50) spawn - del src + qdel(src) return /obj/item/mecha_parts/mecha_equipment/proc/critfail() diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 08d6f2cca4..adf27da034 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -21,6 +21,10 @@ pr_mech_sleeper.set_delay(equip_cooldown) return + Destroy() + qdel(pr_mech_sleeper) + ..() + allow_drop() return 0 diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index b0ff7e633d..d62554c3c0 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -15,21 +15,22 @@ action(atom/target) if(!action_checks(target)) return if(!cargo_holder) return - + //loading if(istype(target,/obj)) var/obj/O = target if(O.buckled_mob) return if(locate(/mob/living) in O) + occupant_message("You can't load living things into the cargo compartment.") return if(O.anchored) - occupant_message("[target] is firmly secured.") + occupant_message("[target] is firmly secured.") return if(cargo_holder.cargo.len >= cargo_holder.cargo_capacity) - occupant_message("Not enough room in cargo compartment.") + occupant_message("Not enough room in cargo compartment.") return - + occupant_message("You lift [target] and start to load it into cargo compartment.") chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") set_ready_state(0) @@ -41,10 +42,10 @@ cargo_holder.cargo += O O.loc = chassis O.anchored = 0 - occupant_message("[target] succesfully loaded.") + occupant_message("[target] succesfully loaded.") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") else - occupant_message("You must hold still while handling objects.") + occupant_message("You must hold still while handling objects.") O.anchored = initial(O.anchored) //attacking @@ -55,8 +56,8 @@ M.take_overall_damage(dam_force) M.adjustOxyLoss(round(dam_force/2)) M.updatehealth() - occupant_message("\red You squeeze [target] with [src.name]. Something cracks.") - chassis.visible_message("\red [chassis] squeezes [target].") + occupant_message("You squeeze [target] with [src.name]. Something cracks.") + chassis.visible_message("[chassis] squeezes [target].") else step_away(M,chassis) occupant_message("You push [target] out of the way.") @@ -82,14 +83,14 @@ if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return set_ready_state(0) chassis.use_power(energy_drain) - chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") - occupant_message("You start to drill [target]") + chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") + occupant_message("You start to drill [target]") var/T = chassis.loc var/C = target.loc //why are these backwards? we may never know -Pete if(do_after_cooldown(target)) if(T == chassis.loc && src == chassis.selected) if(istype(target, /turf/simulated/wall/r_wall)) - occupant_message("[target] is too durable to drill through.") + occupant_message("[target] is too durable to drill through.") else if(istype(target, /turf/simulated/mineral)) for(var/turf/simulated/mineral/M in range(chassis,1)) if(get_dir(chassis,M)&chassis.dir) @@ -133,8 +134,8 @@ if(target_obj.unacidable) return set_ready_state(0) chassis.use_power(energy_drain) - chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") - occupant_message("You start to drill [target]") + chassis.visible_message("[chassis] starts to drill [target]", "You hear the drill.") + occupant_message("You start to drill [target]") var/T = chassis.loc var/C = target.loc //why are these backwards? we may never know -Pete if(do_after_cooldown(target)) @@ -195,12 +196,12 @@ if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) var/obj/o = target var/amount = o.reagents.trans_to(src, 200) - occupant_message("\blue [amount] units transferred into internal tank.") + occupant_message("[amount] units transferred into internal tank.") playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) return if (src.reagents.total_volume < 1) - occupant_message("\red \The [src] is empty.") + occupant_message("\The [src] is empty.") return playsound(chassis, 'sound/effects/extinguish.ogg', 75, 1, -3) @@ -215,7 +216,7 @@ for(var/a=0, a<5, a++) spawn(0) - var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(chassis) ) + var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(chassis)) var/turf/my_target = pick(the_targets) var/datum/reagents/R = new/datum/reagents(5) if(!W) return @@ -235,7 +236,7 @@ W.reagents.reaction(atm) if(W.loc == my_target) break sleep(2) - W.delete() + qdel(W) return 1 get_equip_info() @@ -294,7 +295,7 @@ if(do_after_cooldown(target)) if(disabled) return chassis.spark_system.start() - del(target) + qdel(target) playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) chassis.use_power(energy_drain) if(1) @@ -417,7 +418,7 @@ do_after_cooldown() src = null spawn(rand(150,300)) - del(P) + qdel(P) return /obj/item/mecha_parts/mecha_equipment/gravcatapult @@ -440,7 +441,7 @@ last_fired = world.time else if (world.time % 3) - occupant_message("[src] is not ready to fire again!") + occupant_message("[src] is not ready to fire again!") return 0 switch(mode) @@ -536,8 +537,8 @@ user << "\red The [W] bounces off [chassis] armor." chassis.log_append_to_last("Armor saved.") else - chassis.occupant_message("[user] hits [chassis] with [W].") - user.visible_message("[user] hits [chassis] with [W].", "You hit [src] with [W].") + chassis.occupant_message("[user] hits [chassis] with [W].") + user.visible_message("[user] hits [chassis] with [W].", "You hit [src] with [W].") chassis.take_damage(round(W.force*damage_coeff),W.damtype) chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) set_ready_state(0) @@ -584,7 +585,7 @@ if(!action_checks(src)) return chassis.dynbulletdamage(Proj) if(prob(chassis.deflect_chance*deflect_coeff)) - chassis.occupant_message("\blue The armor deflects incoming projectile.") + chassis.occupant_message("The armor deflects incoming projectile.") chassis.visible_message("The [chassis.name] armor deflects the projectile") chassis.log_append_to_last("Armor saved.") else @@ -600,7 +601,7 @@ if(!action_checks(A)) return chassis.dynhitby(A) if(prob(chassis.deflect_chance*deflect_coeff) || istype(A, /mob/living) || istype(A, /obj/item/mecha_parts/mecha_tracking)) - chassis.occupant_message("\blue The [A] bounces off the armor.") + chassis.occupant_message("The [A] bounces off the armor.") chassis.visible_message("The [A] bounces off the [chassis] armor") chassis.log_append_to_last("Armor saved.") if(istype(A, /mob/living)) @@ -637,6 +638,11 @@ pr_repair_droid.set_delay(equip_cooldown) return + Destroy() + qdel(pr_repair_droid) + pr_repair_droid = null + ..() + attach(obj/mecha/M as obj) ..() droid_overlay = new(src.icon, icon_state = "repair_droid") @@ -726,6 +732,11 @@ pr_energy_relay.set_delay(equip_cooldown) return + Destroy() + qdel(pr_energy_relay) + pr_energy_relay = null + ..() + detach() pr_energy_relay.stop() // chassis.proc_res["dynusepower"] = null @@ -842,6 +853,11 @@ init() return + Destroy() + qdel(pr_mech_generator) + pr_mech_generator = null + ..() + proc/init() fuel = new /obj/item/stack/sheet/mineral/phoron(src) fuel.amount = 0 @@ -877,7 +893,7 @@ var/result = load_fuel(target) var/message if(isnull(result)) - message = "[fuel] traces in target minimal. [target] cannot be used as fuel." + message = "[fuel] traces in target minimal. [target] cannot be used as fuel." else if(!result) message = "Unit is full." else @@ -902,7 +918,7 @@ attackby(weapon,mob/user) var/result = load_fuel(weapon) if(isnull(result)) - user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","[fuel] traces minimal. [weapon] cannot be used as fuel.") + user.visible_message("[user] tries to shove [weapon] into [src]. What a dumb-ass.","[fuel] traces minimal. [weapon] cannot be used as fuel.") else if(!result) user << "Unit is full." else @@ -1026,25 +1042,25 @@ cargo_holder.cargo += O O.loc = chassis O.anchored = 0 - chassis.occupant_message("[target] succesfully loaded.") + chassis.occupant_message("[target] succesfully loaded.") chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") else - chassis.occupant_message("You must hold still while handling objects.") + chassis.occupant_message("You must hold still while handling objects.") O.anchored = initial(O.anchored) else - chassis.occupant_message("Not enough room in cargo compartment.") + chassis.occupant_message("Not enough room in cargo compartment.") else - chassis.occupant_message("[target] is firmly secured.") + chassis.occupant_message("[target] is firmly secured.") else if(istype(target,/mob/living)) var/mob/living/M = target if(M.stat>1) return if(chassis.occupant.a_intent == I_HURT) - chassis.occupant_message("\red You obliterate [target] with [src.name], leaving blood and guts everywhere.") - chassis.visible_message("\red [chassis] destroys [target] in an unholy fury.") + chassis.occupant_message("You obliterate [target] with [src.name], leaving blood and guts everywhere.") + chassis.visible_message("[chassis] destroys [target] in an unholy fury.") if(chassis.occupant.a_intent == I_DISARM) - chassis.occupant_message("\red You tear [target]'s limbs off with [src.name].") - chassis.visible_message("\red [chassis] rips [target]'s arms off.") + chassis.occupant_message("You tear [target]'s limbs off with [src.name].") + chassis.visible_message("[chassis] rips [target]'s arms off.") else step_away(M,chassis) chassis.occupant_message("You smash into [target], sending them flying.") @@ -1086,7 +1102,7 @@ /obj/item/mecha_parts/mecha_equipment/tool/passenger/destroy() for(var/atom/movable/AM in src) AM.forceMove(get_turf(src)) - AM << "You tumble out of the destroyed [src.name]!" + AM << "You tumble out of the destroyed [src.name]!" return ..() /obj/item/mecha_parts/mecha_equipment/tool/passenger/Exit(atom/movable/O) @@ -1094,7 +1110,7 @@ /obj/item/mecha_parts/mecha_equipment/tool/passenger/proc/move_inside(var/mob/user) if (chassis) - chassis.visible_message("\blue [user] starts to climb into [chassis].") + chassis.visible_message("[user] starts to climb into [chassis].") if(do_after(user, 40, needhand=0)) if(!src.occupant) @@ -1103,7 +1119,7 @@ log_message("[user] boarded.") occupant_message("[user] boarded.") else if(src.occupant != user) - user << "\red [src.occupant] was faster. Try better next time, loser." + user << "[src.occupant] was faster. Try better next time, loser." else user << "You stop entering the exosuit." @@ -1178,18 +1194,18 @@ return if (!isturf(usr.loc)) - usr << "\red You can't reach the passenger compartment from here." + usr << "You can't reach the passenger compartment from here." return if(iscarbon(usr)) var/mob/living/carbon/C = usr if(C.handcuffed) - usr << "\red Kinda hard to climb in while handcuffed don't you think?" + usr << "Kinda hard to climb in while handcuffed don't you think?" return for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) - usr << "\red You're too busy getting your life sucked out of you." + usr << "You're too busy getting your life sucked out of you." return //search for a valid passenger compartment @@ -1209,10 +1225,10 @@ //didn't find anything switch (feedback) if (OCCUPIED) - usr << "\red The passenger compartment is already occupied!" + usr << "The passenger compartment is already occupied!" if (LOCKED) - usr << "\red The passenger compartment hatch is locked!" + usr << "The passenger compartment hatch is locked!" if (OCCUPIED|LOCKED) - usr << "\red All of the passenger compartments are already occupied or locked!" + usr << "All of the passenger compartments are already occupied or locked!" if (0) - usr << "\red \The [src] doesn't have a passenger compartment." + usr << "\The [src] doesn't have a passenger compartment." diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 3d36efea9c..13d0600df4 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -113,7 +113,7 @@ A.bullet_act(src, def_zone) src.life -= 10 if(life <= 0) - del(src) + qdel(src) return /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser @@ -249,7 +249,7 @@ throw_impact(atom/hit_atom) if(primed) explosion(hit_atom, 0, 1, 2, 4) - del(src) + qdel(src) else ..() return diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index f000499ffd..1468a03e03 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -193,9 +193,9 @@ if(time_coeff!=diff) time_coeff = diff -/obj/machinery/mecha_part_fabricator/Del() +/obj/machinery/mecha_part_fabricator/Destroy() for(var/atom/A in src) - del A + qdel(A) ..() return @@ -268,7 +268,7 @@ if(!istype(apart)) return 0 for(var/obj/O in part_set) if(O.type == apart.type) - del apart + qdel(apart) return 0 part_set[++part_set.len] = apart return 1 @@ -749,7 +749,7 @@ res.Move(src.loc) result = res.amount else - del res + qdel(res) return result @@ -795,7 +795,7 @@ if(src.resources["diamond"] >= 2000) var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc) G.amount = round(src.resources["diamond"] / G.perunit) - del(src) + qdel(src) return 1 else user << "\red You can't load the [src.name] while it's opened." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 45abb3d6ea..479d55cb8b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -82,6 +82,7 @@ /obj/mecha/New() ..() events = new + icon_state += "-open" add_radio() add_cabin() @@ -98,11 +99,60 @@ mechas_list += src //global mech list return -/obj/mecha/Del() +/obj/mecha/Destroy() src.go_out() + for(var/mob/M in src) //Let's just be ultra sure + M.Move(loc) + + if(loc) + loc.Exited(src) + loc = null + + if(prob(30)) + explosion(get_turf(loc), 0, 0, 1, 3) + + if(wreckage) + var/obj/effect/decal/mecha_wreckage/WR = new wreckage(loc) + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + if(E.salvageable && prob(30)) + WR.crowbar_salvage += E + E.forceMove(WR) + E.equip_ready = 1 + E.reliability = round(rand(E.reliability/3,E.reliability)) + else + E.forceMove(loc) + E.destroy() + if(cell) + WR.crowbar_salvage += cell + cell.forceMove(WR) + cell.charge = rand(0, cell.charge) + if(internal_tank) + WR.crowbar_salvage += internal_tank + internal_tank.forceMove(WR) + else + for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) + E.detach(loc) + E.destroy() + if(cell) + qdel(cell) + if(internal_tank) + qdel(internal_tank) + equipment.Cut() + cell = null + internal_tank = null + + qdel(pr_int_temp_processor) + qdel(pr_inertial_movement) + qdel(pr_give_air) + qdel(pr_internal_damage) + qdel(spark_system) + pr_int_temp_processor = null + pr_give_air = null + pr_internal_damage = null + spark_system = null + mechas_list -= src //global mech list ..() - return //////////////////////// ////// Helpers ///////// @@ -447,12 +497,17 @@ /obj/mecha/proc/dynabsorbdamage(damage,damage_type) return damage*(listgetindex(damage_absorption,damage_type) || 1) +/obj/mecha/airlock_crush(var/crush_damage) + ..() + take_damage(crush_damage) + check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) + return 1 /obj/mecha/proc/update_health() if(src.health > 0) src.spark_system.start() else - src.destroy() + qdel(src) return /obj/mecha/attack_hand(mob/user as mob) @@ -555,52 +610,6 @@ Proj.on_hit(src) return -/obj/mecha/proc/destroy() - spawn() - go_out() - var/turf/T = get_turf(src) - tag = "\ref[src]" //better safe then sorry - if(loc) - loc.Exited(src) - loc = null - if(T) - if(istype(src, /obj/mecha/working/ripley/)) - var/obj/mecha/working/ripley/R = src - if(R.cargo) - for(var/obj/O in R.cargo) //Dump contents of stored cargo - O.loc = T - R.cargo -= O - T.Entered(O) - - if(prob(30)) - explosion(T, 0, 0, 1, 3) - spawn(0) - if(wreckage) - var/obj/effect/decal/mecha_wreckage/WR = new wreckage(T) - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - if(E.salvageable && prob(30)) - WR.crowbar_salvage += E - E.forceMove(WR) - E.equip_ready = 1 - E.reliability = round(rand(E.reliability/3,E.reliability)) - else - E.forceMove(T) - E.destroy() - if(cell) - WR.crowbar_salvage += cell - cell.forceMove(WR) - cell.charge = rand(0, cell.charge) - if(internal_tank) - WR.crowbar_salvage += internal_tank - internal_tank.forceMove(WR) - else - for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) - E.forceMove(T) - E.destroy() - spawn(0) - del(src) - return - /obj/mecha/ex_act(severity) src.log_message("Affected by explosion of severity: [severity].",1) if(prob(src.deflect_chance)) @@ -608,16 +617,16 @@ src.log_append_to_last("Armor saved, changing severity to [severity].") switch(severity) if(1.0) - src.destroy() + qdel(src) if(2.0) if (prob(30)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/2) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) if(3.0) if (prob(5)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/5) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) @@ -831,7 +840,7 @@ src.reset_icon() user.drop_item() - del(P) + qdel(P) else call((proc_res["dynattackby"]||src), "dynattackby")(W,user) @@ -1732,7 +1741,7 @@ AI.bruteloss = O.getBruteLoss() AI.toxloss = O.toxloss AI.updatehealth() - del(O) + qdel(O) if (!AI.stat) AI.icon_state = "ai" else @@ -1840,7 +1849,7 @@ if(t_air) t_air.merge(removed) else //just delete the cabin gas, we're in space or some shit - del(removed) + qdel(removed) else return stop() return @@ -1883,7 +1892,7 @@ if(mecha.loc && hascall(mecha.loc,"assume_air")) mecha.loc.assume_air(leaked_gas) else - del(leaked_gas) + qdel(leaked_gas) if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) if(mecha.get_charge()) mecha.spark_system.start() diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 233415cba8..167b9f63d0 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -78,7 +78,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -92,7 +92,7 @@ const_holder.density = 1 const_holder.overlays.len = 0 spawn() - del src + qdel(src) return @@ -194,7 +194,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "ripley5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -210,7 +210,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "ripley7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -289,7 +289,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -302,7 +302,7 @@ const_holder.icon_state = "gygax0" const_holder.density = 1 spawn() - del src + qdel(src) return @@ -428,7 +428,7 @@ if(16) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -444,7 +444,7 @@ if(14) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -460,7 +460,7 @@ if(12) if(diff==FORWARD) user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax9" else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") @@ -476,7 +476,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax11" else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") @@ -492,7 +492,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax13" else user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") @@ -531,7 +531,7 @@ if(3) if(diff==FORWARD) user.visible_message("[user] installs Gygax Armour Plates to [holder].", "You install Gygax Armour Plates to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "gygax18" else user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") @@ -570,7 +570,7 @@ user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" user.drop_item() - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -583,7 +583,7 @@ const_holder.icon_state = "fireripley0" const_holder.density = 1 spawn() - del src + qdel(src) return @@ -690,7 +690,7 @@ if(11) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "fireripley5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -706,7 +706,7 @@ if(9) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "fireripley7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -793,7 +793,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -806,7 +806,7 @@ const_holder.icon_state = "durand0" const_holder.density = 1 spawn() - del src + qdel(src) return /datum/construction/reversible/mecha/durand @@ -932,7 +932,7 @@ if(16) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -948,7 +948,7 @@ if(14) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") @@ -964,7 +964,7 @@ if(12) if(diff==FORWARD) user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand9" else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") @@ -980,7 +980,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand11" else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") @@ -996,7 +996,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand13" else user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") @@ -1035,7 +1035,7 @@ if(3) if(diff==FORWARD) user.visible_message("[user] installs Durand Armour Plates to [holder].", "You install Durand Armour Plates to [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "durand18" else user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") @@ -1075,7 +1075,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -1096,7 +1096,7 @@ custom_action(step, atom/used_atom, mob/user) user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") holder.overlays += used_atom.icon_state+"+o" - del used_atom + qdel(used_atom) return 1 action(atom/used_atom,mob/user as mob) @@ -1109,7 +1109,7 @@ const_holder.icon_state = "odysseus0" const_holder.density = 1 spawn() - del src + qdel(src) return @@ -1211,7 +1211,7 @@ if(10) if(diff==FORWARD) user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "odysseus5" else user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") @@ -1227,7 +1227,7 @@ if(8) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") - del used_atom + qdel(used_atom) holder.icon_state = "odysseus7" else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 8fa25a3568..ef254d5914 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -90,11 +90,11 @@ return answer emp_act() - del src + qdel(src) return ex_act() - del src + qdel(src) return proc/in_mecha() @@ -106,7 +106,7 @@ var/obj/mecha/M = in_mecha() if(M) M.emp_act(2) - del(src) + qdel(src) proc/get_mecha_log() if(!src.in_mecha()) diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 96b410959b..8bbeb03fd7 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -23,7 +23,7 @@ /obj/effect/decal/mecha_wreckage/ex_act(severity) if(severity < 2) spawn - del src + qdel(src) return /obj/effect/decal/mecha_wreckage/bullet_act(var/obj/item/projectile/Proj) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 5beb3c7244..c51a34adef 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -9,6 +9,16 @@ wreckage = /obj/effect/decal/mecha_wreckage/ripley cargo_capacity = 10 +/obj/mecha/working/ripley/Destroy() + for(var/atom/movable/A in src.cargo) + A.loc = loc + var/turf/T = loc + if(istype(T)) + T.Entered(A) + step_rand(A) + cargo.Cut() + ..() + /obj/mecha/working/ripley/firefighter desc = "Standart APLU chassis was refitted with additional thermal protection and cistern." name = "APLU \"Firefighter\"" @@ -54,6 +64,6 @@ var/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp HC.attach(src) for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily - del (B) + qdel (B) diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index 1fa6d4f5ac..d9e876688f 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -10,7 +10,7 @@ new /obj/item/mecha_parts/mecha_tracking(src) return -/obj/mecha/working/Del() +/obj/mecha/working/Destroy() for(var/mob/M in src) if(M==src.occupant) continue diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index d64857d004..6b79db8f5b 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -15,10 +15,16 @@ if(can_buckle && istype(M)) user_buckle_mob(M, user) +//Cleanup /obj/Del() unbuckle_mob() return ..() +/obj/Destroy() + unbuckle_mob() + return ..() + + /obj/proc/buckle_mob(mob/living/M) if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained())) return 0 @@ -84,3 +90,4 @@ "You hear metal clanking.") add_fingerprint(user) return M + diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 840d779510..e6b166792f 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -46,7 +46,7 @@ var/turf/T = get_turf(src) T.thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT -/obj/effect/alien/resin/Del() +/obj/effect/alien/resin/Destroy() var/turf/T = get_turf(src) T.thermal_conductivity = initial(T.thermal_conductivity) ..() @@ -54,7 +54,7 @@ /obj/effect/alien/resin/proc/healthcheck() if(health <=0) density = 0 - del(src) + qdel(src) return /obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj) @@ -174,7 +174,7 @@ /obj/effect/alien/weeds/New(pos, node) ..() if(istype(loc, /turf/space)) - del(src) + qdel(src) return linked_node = node if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2") @@ -190,7 +190,7 @@ if (locate(/obj/movable, U)) U = locate(/obj/movable, U) if(U.density == 1) - del(src) + qdel(src) return Alien plants should do something if theres a lot of poison @@ -200,7 +200,7 @@ Alien plants should do something if theres a lot of poison return */ if (istype(U, /turf/space)) - del(src) + qdel(src) return if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) ) @@ -220,19 +220,19 @@ Alien plants should do something if theres a lot of poison if(O.density) continue direction_loop - new /obj/effect/alien/weeds(T, linked_node) + PoolOrNew(/obj/effect/alien/weeds, T, linked_node) /obj/effect/alien/weeds/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if (prob(50)) - del(src) + qdel(src) if(3.0) if (prob(5)) - del(src) + qdel(src) return /obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user) @@ -255,7 +255,7 @@ Alien plants should do something if theres a lot of poison /obj/effect/alien/weeds/proc/healthcheck() if(health <= 0) - del(src) + qdel(src) /obj/effect/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -294,7 +294,7 @@ Alien plants should do something if theres a lot of poison /obj/effect/alien/acid/proc/tick() if(!target) - del(src) + qdel(src) ticks += 1 @@ -307,8 +307,8 @@ Alien plants should do something if theres a lot of poison var/turf/simulated/wall/W = target W.dismantle_wall(1) else - del(target) - del(src) + qdel(target) + qdel(src) return switch(target_strength - ticks) @@ -350,7 +350,7 @@ Alien plants should do something if theres a lot of poison spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) Grow() else - del(src) + qdel(src) /obj/effect/alien/egg/attack_hand(user as mob) @@ -361,7 +361,7 @@ Alien plants should do something if theres a lot of poison switch(status) if(BURST) user << "\red You clear the hatched egg." - del(src) + qdel(src) return if(GROWING) user << "\red The child is not developed yet." diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index c4f693da15..9379234ca6 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -15,9 +15,9 @@ var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list() ..() BUMP_TELEPORTERS += src -/obj/effect/bump_teleporter/Del() +/obj/effect/bump_teleporter/Destroy() BUMP_TELEPORTERS -= src - ..() + return ..() /obj/effect/bump_teleporter/Bumped(atom/user) if(!ismob(user)) diff --git a/code/game/objects/effects/chemsmoke.dm b/code/game/objects/effects/chemsmoke.dm index e64a84c47c..37ea4fd096 100644 --- a/code/game/objects/effects/chemsmoke.dm +++ b/code/game/objects/effects/chemsmoke.dm @@ -31,7 +31,7 @@ if(seed_name && plant_controller) seed = plant_controller.seeds[seed_name] if(!seed) - del(src) + qdel(src) ..() /datum/effect/effect/system/smoke_spread/chem/New() @@ -155,7 +155,7 @@ //build smoke icon - var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) + var/color = chemholder.reagents.get_color() var/icon/I if(color) I = icon('icons/effects/chemsmoke.dmi') @@ -204,7 +204,7 @@ if(passed_smoke) smoke = passed_smoke else - smoke = new(location) + smoke = PoolOrNew(/obj/effect/effect/smoke/chem, location) if(chemholder.reagents.reagent_list.len) chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / dist, safety = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents @@ -218,10 +218,10 @@ sleep(150+rand(0,20)) // turning it off before it is deleted results in cleaner smoke.opacity = 0 // lighting and view range updates fadeOut(smoke) - smoke.delete() + qdel(src) /datum/effect/effect/system/smoke_spread/chem/spores/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1) - var/obj/effect/effect/smoke/chem/spores = new(location) + var/obj/effect/effect/smoke/chem/spores = PoolOrNew(/obj/effect/effect/smoke/chem, location) spores.name = "cloud of [seed.seed_name] [seed.seed_noun]" ..(T, I, dist, spores) @@ -229,6 +229,10 @@ // Fades out the smoke smoothly using it's alpha variable. //------------------------------------------ /datum/effect/effect/system/smoke_spread/chem/proc/fadeOut(var/atom/A, var/frames = 16) + if(A.alpha == 0) //Handle already transparent case + return + if(frames == 0) + frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame". var/step = A.alpha / frames for(var/i = 0, i < frames, i++) A.alpha -= step diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm index c9ea58b121..2bf3a2a574 100644 --- a/code/game/objects/effects/decals/Cleanable/fuel.dm +++ b/code/game/objects/effects/decals/Cleanable/fuel.dm @@ -25,7 +25,7 @@ if(!has_spread) Spread() else - del(src) + qdel(src) proc/Spread(exclude=list()) //Allows liquid fuels to sometimes flow into other tiles. diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index c6b3137806..b81089d9fb 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -21,10 +21,10 @@ var/global/list/image/splatter_cache=list() var/list/datum/disease2/disease/virus2 = list() var/amount = 5 -/obj/effect/decal/cleanable/blood/Del() +/obj/effect/decal/cleanable/blood/Destroy() for(var/datum/disease/D in viruses) D.cure(0) - ..() + return ..() /obj/effect/decal/cleanable/blood/New() ..() @@ -37,7 +37,7 @@ var/global/list/image/splatter_cache=list() if(B != src) if (B.blood_DNA) blood_DNA |= B.blood_DNA.Copy() - del(B) + qdel(B) spawn(DRYING_TIME * (amount+1)) dry() @@ -198,7 +198,7 @@ var/global/list/image/splatter_cache=list() for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) sleep(3) if (i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) + var/obj/effect/decal/cleanable/blood/b = PoolOrNew(/obj/effect/decal/cleanable/blood/splatter, src.loc) b.basecolor = src.basecolor b.update_icon() for(var/datum/disease/D in src.viruses) diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 4c85144d1e..74e2fa951f 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -21,14 +21,14 @@ var/turf/simulated/floor/F = get_turf(src) if (istype(F)) F.dirt += 4 - del(src) + qdel(src) /obj/effect/decal/cleanable/greenglow New() ..() spawn(1200)// 2 minutes - del(src) + qdel(src) /obj/effect/decal/cleanable/dirt name = "dirt" @@ -102,7 +102,7 @@ random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") var/list/viruses = list() - Del() + Destroy() for(var/datum/disease/D in viruses) D.cure(0) ..() diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 63956f5e89..dc5e6c57e8 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,6 +1,5 @@ /obj/effect/decal/cleanable var/list/random_icon_states = list() - var/targeted_by = null // Used so cleanbots can't claim a mess. /obj/effect/decal/cleanable/New() if (random_icon_states && length(src.random_icon_states) > 0) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 9d097f47a0..eac899d5b1 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -72,7 +72,7 @@ else P.roll_and_drop(P.loc) - del(oldsrc) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway + qdel(oldsrc) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway //############################## THE ACTUAL DECALS ########################### @@ -125,7 +125,7 @@ playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) if(ruined) user << "You remove the remnants of the poster." - del(src) + qdel(src) else user << "You carefully remove the poster from the wall." roll_and_drop(user.loc) @@ -154,7 +154,7 @@ var/obj/item/weapon/contraband/poster/P = new(src, serial_number) P.loc = newloc src.loc = P - del(src) + qdel(src) /datum/poster // Name suffix. Poster - [name] diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index dd786ddc0d..ff3c8d4a61 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -30,7 +30,7 @@ var/turf/simulated/floor/F = get_turf(src) if (istype(F)) new /obj/effect/decal/cleanable/ash(F) - del(src) + qdel(src) /obj/effect/decal/remains/robot/attack_hand(mob/user as mob) return diff --git a/code/game/objects/effects/decals/warning_stripes.dm b/code/game/objects/effects/decals/warning_stripes.dm index 89067ada2a..e22acfad74 100644 --- a/code/game/objects/effects/decals/warning_stripes.dm +++ b/code/game/objects/effects/decals/warning_stripes.dm @@ -1,9 +1,11 @@ -/obj/effect/decal/warning_stripes - icon = 'icons/effects/warning_stripes.dmi' - layer = 2 - -/obj/effect/decal/warning_stripes/New() - . = ..() - - loc.overlays += src - del src \ No newline at end of file +/obj/effect/decal/warning_stripes + icon = 'icons/effects/warning_stripes.dmi' + layer = 2 + +/obj/effect/decal/warning_stripes/New() + . = ..() + var/turf/T=get_turf(src) + var/image/I=image(icon, icon_state = icon_state, dir = dir) + I.color=color + T.overlays += I + qdel(src) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index ea9af2f70f..29eb08f487 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -20,11 +20,10 @@ would spawn and follow the beaker, even if it is carried or thrown. var/life = 15.0 mouse_opacity = 0 -/obj/effect/proc/delete() - loc = null +/obj/effect/Destroy() if(reagents) reagents.delete() - return + return ..() /obj/effect/effect/water/Move(turf/newloc) //var/turf/T = src.loc @@ -32,7 +31,7 @@ would spawn and follow the beaker, even if it is carried or thrown. // T.firelevel = 0 //TODO: FIX if (--src.life < 1) //SN src = null - delete() + qdel(src) if(newloc.density) return 0 .=..() @@ -100,7 +99,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effect/effect/steam/steam = new /obj/effect/effect/steam(src.location) + var/obj/effect/effect/steam/steam = PoolOrNew(/obj/effect/effect/steam, src.location) var/direction if(src.cardinals) direction = pick(cardinal) @@ -110,7 +109,7 @@ steam.start() -- spawns the effect sleep(5) step(steam,direction) spawn(20) - steam.delete() + qdel(steam) ///////////////////////////////////////////// //SPARK SYSTEM (like steam system) @@ -133,15 +132,14 @@ steam.start() -- spawns the effect if (istype(T, /turf)) T.hotspot_expose(1000,100) spawn (100) - delete() + qdel(src) return -/obj/effect/effect/sparks/Del() +/obj/effect/effect/sparks/Destroy() var/turf/T = src.loc if (istype(T, /turf)) T.hotspot_expose(1000,100) - ..() - return + return ..() /obj/effect/effect/sparks/Move() ..() @@ -171,7 +169,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location) + var/obj/effect/effect/sparks/sparks = PoolOrNew(/obj/effect/effect/sparks, src.location) src.total_sparks++ var/direction if(src.cardinals) @@ -183,7 +181,7 @@ steam.start() -- spawns the effect step(sparks,direction) spawn(20) if(sparks) - sparks.delete() + qdel(sparks) src.total_sparks-- @@ -212,7 +210,7 @@ steam.start() -- spawns the effect /obj/effect/effect/smoke/New() ..() spawn (time_to_live) - delete() + qdel(src) return /obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob ) @@ -357,7 +355,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effect/effect/smoke/smoke = new smoke_type(src.location) + var/obj/effect/effect/smoke/smoke = PoolOrNew(smoke_type, src.location) src.total_smoke++ var/direction = src.direction if(!direction) @@ -369,7 +367,7 @@ steam.start() -- spawns the effect sleep(10) step(smoke,direction) spawn(smoke.time_to_live*0.75+rand(10,30)) - if (smoke) smoke.delete() + if (smoke) qdel(smoke) src.total_smoke-- @@ -415,13 +413,13 @@ steam.start() -- spawns the effect var/turf/T = get_turf(src.holder) if(T != src.oldposition) if(istype(T, /turf/space)) - var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition) + var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition) src.oldposition = T I.set_dir(src.holder.dir) flick("ion_fade", I) I.icon_state = "blank" spawn( 20 ) - I.delete() + qdel(I) spawn(2) if(src.on) src.processing = 1 @@ -461,12 +459,12 @@ steam.start() -- spawns the effect src.processing = 0 spawn(0) if(src.number < 3) - var/obj/effect/effect/steam/I = new /obj/effect/effect/steam(src.oldposition) + var/obj/effect/effect/steam/I = PoolOrNew(/obj/effect/effect/steam, src.oldposition) src.number++ src.oldposition = get_turf(holder) I.set_dir(src.holder.dir) spawn(10) - I.delete() + qdel(I) src.number-- spawn(2) if(src.on) @@ -515,13 +513,13 @@ steam.start() -- spawns the effect sleep(30) if(metal) - var/obj/structure/foamedmetal/M = new(src.loc) + var/obj/structure/foamedmetal/M = PoolOrNew(/obj/structure/foamedmetal, src.loc) M.metal = metal M.updateicon() flick("[icon_state]-disolve", src) sleep(5) - delete() + qdel(src) return // transfer any reagents to the floor @@ -551,7 +549,7 @@ steam.start() -- spawns the effect if(F) continue - F = new(T, metal) + F = PoolOrNew(/obj/effect/effect/foam, list(T, metal)) F.amount = amount if(!metal) F.create_reagents(10) @@ -566,7 +564,7 @@ steam.start() -- spawns the effect flick("[icon_state]-disolve", src) spawn(5) - delete() + qdel(src) /obj/effect/effect/foam/Crossed(var/atom/movable/AM) @@ -611,7 +609,7 @@ steam.start() -- spawns the effect F.amount += amount return - F = new(src.location, metal) + F = PoolOrNew(/obj/effect/effect/foam, list(src.location, metal)) F.amount = amount if(!metal) // don't carry other chemicals if a metal foam @@ -642,7 +640,7 @@ steam.start() -- spawns the effect - Del() + Destroy() density = 0 update_nearby_tiles(1) @@ -656,14 +654,14 @@ steam.start() -- spawns the effect ex_act(severity) - del(src) + qdel(src) blob_act() - del(src) + qdel(src) bullet_act() if(metal==1 || prob(50)) - del(src) + qdel(src) attack_hand(var/mob/user) if ((HULK in user.mutations) || (prob(75 - metal*25))) @@ -672,7 +670,7 @@ steam.start() -- spawns the effect if ((O.client && !( O.blinded ))) O << "\red [user] smashes through the foamed metal." - del(src) + qdel(src) else user << "\blue You hit the metal foam but bounce off it." return @@ -686,8 +684,8 @@ steam.start() -- spawns the effect for(var/mob/O in viewers(src)) if (O.client) O << "\red [G.assailant] smashes [G.affecting] through the foamed metal wall." - del(I) - del(src) + qdel(I) + qdel(src) return if(prob(I.force*20 - metal*25)) @@ -695,7 +693,7 @@ steam.start() -- spawns the effect for(var/mob/O in oviewers(user)) if ((O.client && !( O.blinded ))) O << "\red [user] smashes through the foamed metal." - del(src) + qdel(src) else user << "\blue You hit the metal foam to no effect." @@ -722,7 +720,7 @@ steam.start() -- spawns the effect start() if (amount <= 2) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) s.set_up(2, 1, location) s.start() diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 808e46c2a3..a7f4c0482f 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -25,10 +25,10 @@ var/obj/effect/decal/cleanable/blood/gibs/gib = null for(var/datum/disease/D in viruses) if(D.spread_type == SPECIAL) - del(D) + qdel(D) if(sparks) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo s.start() @@ -63,4 +63,4 @@ if(directions.len) gib.streak(directions) - del(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 28a4ad2cc2..6ca1045671 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -13,78 +13,77 @@ switch(name) //some of these are probably obsolete if("shuttle") shuttle_z = z - del(src) - + qdel(src) + return if("airtunnel_stop") airtunnel_stop = x - if("airtunnel_start") airtunnel_start = x - if("airtunnel_bottom") airtunnel_bottom = y - if("monkey") monkeystart += loc - del(src) - + qdel(src) + return if("start") newplayer_start += loc - del(src) - + qdel(src) if("JoinLate") latejoin += loc - del(src) - + qdel(src) if("JoinLateGateway") latejoin_gateway += loc - del(src) - + qdel(src) + return if("JoinLateCryo") latejoin_cryo += loc - del(src) - + qdel(src) + return if("JoinLateCyborg") latejoin_cyborg += loc - del(src) - + qdel(src) + return if("prisonwarp") prisonwarp += loc - del(src) - + qdel(src) + return if("Holding Facility") holdingfacility += loc - if("tdome1") tdome1 += loc - if("tdome2") tdome2 += loc - if("tdomeadmin") tdomeadmin += loc - if("tdomeobserve") tdomeobserve += loc - if("prisonsecuritywarp") prisonsecuritywarp += loc - del(src) - + qdel(src) + return if("blobstart") blobstart += loc - del(src) - + qdel(src) + return if("xeno_spawn") xeno_spawn += loc - del(src) + qdel(src) + return + if("endgame_exit") + endgame_safespawns += loc + qdel(src) + return + if("bluespacerift") + endgame_exits += loc + qdel(src) + return landmarks_list += src return 1 -/obj/effect/landmark/Del() +/obj/effect/landmark/Destroy() landmarks_list -= src - ..() + return ..() /obj/effect/landmark/start name = "start" @@ -104,7 +103,8 @@ /obj/effect/landmark/start/ninja/New() ..() - ninjastart += src + ninjastart += loc + qdel(src) //Costume spawner landmarks @@ -113,51 +113,51 @@ var/list/options = typesof(/obj/effect/landmark/costume) var/PICK= options[rand(1,options.len)] new PICK(src.loc) - del(src) + qdel(src) //SUBCLASSES. Spawn a bunch of items and disappear likewise /obj/effect/landmark/costume/chicken/New() new /obj/item/clothing/suit/chickensuit(src.loc) new /obj/item/clothing/head/chicken(src.loc) new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/gladiator/New() new /obj/item/clothing/under/gladiator(src.loc) new /obj/item/clothing/head/helmet/gladiator(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/madscientist/New() new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) new /obj/item/clothing/head/flatcap(src.loc) new /obj/item/clothing/suit/storage/toggle/labcoat/mad(src.loc) new /obj/item/clothing/glasses/gglasses(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/elpresidente/New() new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) new /obj/item/clothing/head/flatcap(src.loc) new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(src.loc) new /obj/item/clothing/shoes/jackboots(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/nyangirl/New() new /obj/item/clothing/under/schoolgirl(src.loc) new /obj/item/clothing/head/kitty(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/maid/New() new /obj/item/clothing/under/blackskirt(src.loc) var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears ) new CHOICE(src.loc) new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/butler/New() new /obj/item/clothing/suit/wcoat(src.loc) new /obj/item/clothing/under/suit_jacket(src.loc) new /obj/item/clothing/head/that(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/scratch/New() new /obj/item/clothing/gloves/white(src.loc) @@ -165,12 +165,12 @@ new /obj/item/clothing/under/scratch(src.loc) if (prob(30)) new /obj/item/clothing/head/cueball(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/highlander/New() new /obj/item/clothing/under/kilt(src.loc) new /obj/item/clothing/head/beret(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/prig/New() new /obj/item/clothing/suit/wcoat(src.loc) @@ -181,24 +181,24 @@ new /obj/item/weapon/cane(src.loc) new /obj/item/clothing/under/sl_suit(src.loc) new /obj/item/clothing/mask/fakemoustache(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/plaguedoctor/New() new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc) new /obj/item/clothing/head/plaguedoctorhat(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/nightowl/New() new /obj/item/clothing/under/owl(src.loc) new /obj/item/clothing/mask/gas/owl_mask(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/waiter/New() new /obj/item/clothing/under/waiter(src.loc) var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears) new CHOICE(src.loc) new /obj/item/clothing/suit/apron(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/pirate/New() new /obj/item/clothing/under/pirate(src.loc) @@ -206,46 +206,46 @@ var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana ) new CHOICE(src.loc) new /obj/item/clothing/glasses/eyepatch(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/commie/New() new /obj/item/clothing/under/soviet(src.loc) new /obj/item/clothing/head/ushanka(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/imperium_monk/New() new /obj/item/clothing/suit/imperium_monk(src.loc) if (prob(25)) new /obj/item/clothing/mask/gas/cyborg(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/holiday_priest/New() new /obj/item/clothing/suit/holidaypriest(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/marisawizard/fake/New() new /obj/item/clothing/head/wizard/marisa/fake(src.loc) new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/cutewitch/New() new /obj/item/clothing/under/sundress(src.loc) new /obj/item/clothing/head/witchwig(src.loc) new /obj/item/weapon/staff/broom(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/fakewizard/New() new /obj/item/clothing/suit/wizrobe/fake(src.loc) new /obj/item/clothing/head/wizard/fake(src.loc) new /obj/item/weapon/staff/(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/sexyclown/New() new /obj/item/clothing/mask/gas/sexyclown(src.loc) new /obj/item/clothing/under/sexyclown(src.loc) - del(src) + qdel(src) /obj/effect/landmark/costume/sexymime/New() new /obj/item/clothing/mask/gas/sexymime(src.loc) new /obj/item/clothing/under/sexymime(src.loc) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index bee6174f12..ec45c7a089 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -17,5 +17,5 @@ P.info = dat P.name = "paper- 'Crew Manifest'" //SN src = null - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index e8bf9348f6..27e6d7c74a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -26,24 +26,24 @@ call(src,triggerproc)(M) /obj/effect/mine/proc/triggerrad(obj) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) s.set_up(3, 1, src) s.start() obj:radiation += 50 randmutb(obj) domutcheck(obj,null) spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggerstun(obj) if(ismob(obj)) var/mob/M = obj M.Stun(30) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) s.set_up(3, 1, src) s.start() spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggern2o(obj) //example: n2o triggerproc @@ -54,7 +54,7 @@ target.assume_gas("sleeping_agent", 30) spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggerphoron(obj) for (var/turf/simulated/floor/target in range(1,src)) @@ -64,20 +64,20 @@ target.hotspot_expose(1000, CELL_VOLUME) spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/triggerkick(obj) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) s.set_up(3, 1, src) s.start() - del(obj:client) + qdel(obj:client) spawn(0) - del(src) + qdel(src) /obj/effect/mine/proc/explode(obj) explosion(loc, 0, 1, 2, 3) spawn(0) - del(src) + qdel(src) /obj/effect/mine/dnascramble name = "Radiation Mine" diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index a1af754229..336ee0386d 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -10,7 +10,7 @@ var/tmp/atom/BeamSource New() ..() - spawn(10) del src + spawn(10) qdel(src) /obj/effect/overlay/palmtree_r name = "Palm tree" @@ -31,4 +31,10 @@ /obj/effect/overlay/coconut name = "Coconuts" icon = 'icons/misc/beach.dmi' - icon_state = "coconuts" \ No newline at end of file + icon_state = "coconuts" + +/obj/effect/overlay/bluespacify + name = "Bluespace" + icon = 'icons/turf/space.dmi' + icon_state = "bluespacify" + layer = LIGHTING_LAYER diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 6a9f16e99e..702926d6ff 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -30,7 +30,7 @@ /obj/effect/portal/New() spawn(300) - del(src) + qdel(src) return return @@ -42,7 +42,7 @@ if (icon_state == "portal1") return if (!( target )) - del(src) + qdel(src) return if (istype(M, /atom/movable)) if(prob(failchance)) //oh dear a problem, put em in deep space diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 3f694a8b49..547931a511 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -102,7 +102,7 @@ p4.air_contents.temperature = btemp + T0C p2.secured = 1 - del(src) + qdel(src) */ /obj/effect/spawner/newbomb @@ -168,4 +168,4 @@ V.update_icon() - del(src) + qdel(src) diff --git a/code/game/objects/effects/spawners/vaultspawner.dm b/code/game/objects/effects/spawners/vaultspawner.dm index e91105f5df..c4b9203cef 100644 --- a/code/game/objects/effects/spawners/vaultspawner.dm +++ b/code/game/objects/effects/spawners/vaultspawner.dm @@ -23,4 +23,4 @@ else new /turf/simulated/floor/vault(locate(i,j,z),type) - del(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 682347669a..03b5c922d8 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -11,20 +11,20 @@ /obj/effect/spider/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if (prob(50)) - del(src) + qdel(src) if(3.0) if (prob(5)) - del(src) + qdel(src) return /obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user) if(W.attack_verb.len) - visible_message("\red \The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + visible_message("\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") else - visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") + visible_message("\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") var/damage = W.force / 4.0 @@ -45,7 +45,7 @@ /obj/effect/spider/proc/healthcheck() if(health <= 0) - del(src) + qdel(src) /obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) @@ -86,7 +86,7 @@ var/num = rand(6,24) for(var/i=0, i[src] dies!") - new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - del(src) + PoolOrNew(/obj/effect/decal/cleanable/spiderling_remains, src.loc) + qdel(src) /obj/effect/spider/spiderling/healthcheck() if(health <= 0) @@ -188,7 +188,7 @@ if(amount_grown >= 100) var/spawn_type = pick(typesof(/mob/living/simple_animal/hostile/giant_spider)) new spawn_type(src.loc) - del(src) + qdel(src) /obj/effect/decal/cleanable/spiderling_remains name = "spiderling remains" @@ -205,8 +205,8 @@ New() icon_state = pick("cocoon1","cocoon2","cocoon3") -/obj/effect/spider/cocoon/Del() +/obj/effect/spider/cocoon/Destroy() src.visible_message("\red \the [src] splits open.") for(var/atom/movable/A in contents) A.loc = src.loc - ..() + return ..() diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 8bff463e44..05cdbfee1d 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -9,13 +9,13 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0) log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") if(heavy_range > 1) - var/obj/effect/overlay/pulse = new/obj/effect/overlay ( epicenter ) + var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter) pulse.icon = 'icons/effects/effects.dmi' pulse.icon_state = "emppulse" pulse.name = "emp pulse" pulse.anchored = 1 spawn(20) - pulse.delete() + qdel(pulse) if(heavy_range > light_range) light_range = heavy_range diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 9dc04ff630..9b03866b98 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -65,7 +65,7 @@ proc/explosion_rec(turf/epicenter, power) var/explosion_resistance /turf/space - explosion_resistance = 10 + explosion_resistance = 3 /turf/simulated/floor explosion_resistance = 1 @@ -83,10 +83,10 @@ proc/explosion_rec(turf/epicenter, power) explosion_resistance = 1 /turf/simulated/shuttle/wall - explosion_resistance = 5 + explosion_resistance = 10 /turf/simulated/wall - explosion_resistance = 5 + explosion_resistance = 10 /turf/simulated/wall/r_wall explosion_resistance = 25 @@ -107,24 +107,16 @@ proc/explosion_rec(turf/epicenter, power) explosion_turfs[src] = power var/spread_power = power - src.explosion_resistance //This is the amount of power that will be spread to the tile in the direction of the blast - var/side_spread_power = power - 2 * src.explosion_resistance //This is the amount of power that will be spread to the side tiles for(var/obj/O in src) if(O.explosion_resistance) spread_power -= O.explosion_resistance - side_spread_power -= O.explosion_resistance var/turf/T = get_step(src, direction) T.explosion_spread(spread_power, direction) T = get_step(src, turn(direction,90)) - T.explosion_spread(side_spread_power, turn(direction,90)) + T.explosion_spread(spread_power, turn(direction,90)) T = get_step(src, turn(direction,-90)) - T.explosion_spread(side_spread_power, turn(direction,90)) - - /* - for(var/direction in cardinal) - var/turf/T = get_step(src, direction) - T.explosion_spread(spread_power) - */ + T.explosion_spread(spread_power, turn(direction,90)) /turf/unsimulated/explosion_spread(power) return //So it doesn't get to the parent proc, which simulates explosions \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 87ab21e610..1c29aa8088 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -3,7 +3,6 @@ icon = 'icons/obj/items.dmi' var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/abstract = 0 - var/item_state = null var/r_speed = 1.0 var/health = null var/burn_point = null @@ -26,7 +25,6 @@ //Since any item can now be a piece of clothing, this has to be put here so all items share it. var/flags_inv //This flag is used to determine when items in someone's inventory cover others. IE helmets making it so you can't see glasses, etc. - var/item_color = null var/body_parts_covered = 0 //see setup.dm for appropriate bit flags //var/heat_transfer_coefficient = 1 //0 prevents all transfers, 1 is invisible var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets) @@ -40,6 +38,9 @@ var/zoomdevicename = null //name used for message when binoculars/scope is used var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars. + var/item_state = null // Used to specify the item state for the on-mob overlays. + var/item_state_slots = null //overrides the default item_state for particular slots. + // Used to specify the icon file to be used when the item is worn. If not set the default icon for that slot will be used. // If icon_override or sprite_sheets are set they will take precendence over this, assuming they apply to the slot in question. // Only slot_l_hand/slot_r_hand are implemented at the moment. Others to be implemented as needed. @@ -60,6 +61,12 @@ */ var/list/sprite_sheets_obj = null +/obj/item/Destroy() + if(ismob(loc)) + var/mob/m = loc + m.unEquip(src, 1) + return ..() + /obj/item/device icon = 'icons/obj/device.dmi' @@ -75,15 +82,15 @@ /obj/item/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(5)) - del(src) + qdel(src) return else return @@ -147,11 +154,8 @@ src.throwing = 0 if (src.loc == user) - //canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N - if(!src.canremove) + if(!user.unEquip(src)) return - else - user.u_equip(src) else if(isliving(src.loc)) return @@ -161,7 +165,6 @@ src.pickup(user) return - /obj/item/attack_ai(mob/user as mob) if (istype(src.loc, /obj/item/weapon/robot_module)) //If the item is part of a cyborg module, equip it @@ -239,198 +242,124 @@ /obj/item/proc/equipped(var/mob/user, var/slot) return +//Defines which slots correspond to which slot flags +var/list/global/slot_flags_enumeration = list( + "[slot_wear_mask]" = SLOT_MASK, + "[slot_back]" = SLOT_BACK, + "[slot_wear_suit]" = SLOT_OCLOTHING, + "[slot_gloves]" = SLOT_GLOVES, + "[slot_shoes]" = SLOT_FEET, + "[slot_belt]" = SLOT_BELT, + "[slot_glasses]" = SLOT_EYES, + "[slot_head]" = SLOT_HEAD, + "[slot_l_ear]" = SLOT_EARS|SLOT_TWOEARS, + "[slot_r_ear]" = SLOT_EARS|SLOT_TWOEARS, + "[slot_w_uniform]" = SLOT_ICLOTHING, + "[slot_wear_id]" = SLOT_ID, + "[slot_tie]" = SLOT_TIE, + ) + //the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't. //If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. //Set disable_warning to 1 if you wish it to not give you outputs. +//Should probably move the bulk of this into mob code some time, as most of it is related to the definition of slots and not item-specific /obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = 0) if(!slot) return 0 if(!M) return 0 - if(ishuman(M)) - //START HUMAN - var/mob/living/carbon/human/H = M - var/list/mob_equip = list() - if(H.species.hud && H.species.hud.equip_slots) - mob_equip = H.species.hud.equip_slots + if(!ishuman(M)) return 0 + + var/mob/living/carbon/human/H = M + var/list/mob_equip = list() + if(H.species.hud && H.species.hud.equip_slots) + mob_equip = H.species.hud.equip_slots - if(H.species && !(slot in mob_equip)) + if(H.species && !(slot in mob_equip)) + return 0 + + //First check if the item can be equipped to the desired slot. + if("[slot]" in slot_flags_enumeration) + var/req_flags = slot_flags_enumeration["[slot]"] + if(!(req_flags & slot_flags)) return 0 + + //Next check that the slot is free + if(H.get_equipped_item(slot)) + return 0 + + //Next check if the slot is accessible. + var/mob/_user = disable_warning? null : H + if(!H.slot_is_accessible(slot, src, _user)) + return 0 + + //Lastly, check special rules for the desired slot. + switch(slot) + if(slot_l_ear, slot_r_ear) + var/slot_other_ear = (slot == slot_l_ear)? slot_r_ear : slot_l_ear + if( (w_class > 1) && !(slot_flags & SLOT_EARS) ) + return 0 + if( (slot_flags & SLOT_TWOEARS) && H.get_equipped_item(slot_other_ear) ) + return 0 + if(slot_wear_id) + if(!H.w_uniform && (slot_w_uniform in mob_equip)) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [name]." + return 0 + if(slot_l_store, slot_r_store) + if(!H.w_uniform && (slot_w_uniform in mob_equip)) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [name]." + return 0 + if(slot_flags & SLOT_DENYPOCKET) + return 0 + if( w_class > 2 && !(slot_flags & SLOT_POCKET) ) + return 0 + if(slot_s_store) + if(!H.wear_suit && (slot_wear_suit in mob_equip)) + if(!disable_warning) + H << "You need a suit before you can attach this [name]." + return 0 + if(!H.wear_suit.allowed) + if(!disable_warning) + usr << "You somehow have a suit with no defined allowed items for suit storage, stop that." + return 0 + if( !(istype(src, /obj/item/device/pda) || istype(src, /obj/item/weapon/pen) || is_type_in_list(src, H.wear_suit.allowed)) ) + return 0 + if(slot_handcuffed) + if(!istype(src, /obj/item/weapon/handcuffs)) + return 0 + if(slot_legcuffed) + if(!istype(src, /obj/item/weapon/legcuffs)) + return 0 + if(slot_in_backpack) //used entirely for equipping spawned mobs or at round start + var/allow = 0 + if(H.back && istype(H.back, /obj/item/weapon/storage/backpack)) + var/obj/item/weapon/storage/backpack/B = H.back + if(B.contents.len < B.storage_slots && w_class <= B.max_w_class) + allow = 1 + if(!allow) + return 0 + if(slot_tie) + if(!H.w_uniform && (slot_w_uniform in mob_equip)) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [name]." + return 0 + var/obj/item/clothing/under/uniform = H.w_uniform + if(uniform.accessories.len && !uniform.can_attach_accessory(src)) + if (!disable_warning) + H << "You already have an accessory of this type attached to your [uniform]." + return 0 + return 1 - switch(slot) - if(slot_l_hand) - if(H.l_hand) - return 0 - return 1 - if(slot_r_hand) - if(H.r_hand) - return 0 - return 1 - if(slot_wear_mask) - if(H.wear_mask) - return 0 - if(H.head && !(H.head.canremove) && (H.head.flags & HEADCOVERSMOUTH)) - if(!disable_warning) - H << "\The [H.head] is in the way." - return 0 - if( !(slot_flags & SLOT_MASK) ) - return 0 - return 1 - if(slot_back) - if(H.back) - return 0 - if( !(slot_flags & SLOT_BACK) ) - return 0 - return 1 - if(slot_wear_suit) - if(H.wear_suit) - return 0 - if( !(slot_flags & SLOT_OCLOTHING) ) - return 0 - return 1 - if(slot_gloves) - if(H.gloves) - return 0 - if( !(slot_flags & SLOT_GLOVES) ) - return 0 - return 1 - if(slot_shoes) - if(H.shoes) - return 0 - if( !(slot_flags & SLOT_FEET) ) - return 0 - return 1 - if(slot_belt) - if(H.belt) - return 0 - if(!H.w_uniform && (slot_w_uniform in mob_equip)) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [name]." - return 0 - if( !(slot_flags & SLOT_BELT) ) - return - return 1 - if(slot_glasses) - if(H.glasses) - return 0 - if(H.head && !(H.head.canremove) && (H.head.flags & HEADCOVERSEYES)) - if(!disable_warning) - H << "\The [H.head] is in the way." - return 0 - if( !(slot_flags & SLOT_EYES) ) - return 0 - return 1 - if(slot_head) - if(H.head) - return 0 - if( !(slot_flags & SLOT_HEAD) ) - return 0 - return 1 - if(slot_l_ear) - if(H.l_ear) - return 0 - if( (w_class > 1) && !(slot_flags & SLOT_EARS) ) - return 0 - if( (slot_flags & SLOT_TWOEARS) && H.r_ear ) - return 0 - return 1 - if(slot_r_ear) - if(H.r_ear) - return 0 - if( (w_class > 1) && !(slot_flags & SLOT_EARS) ) - return 0 - if( (slot_flags & SLOT_TWOEARS) && H.l_ear ) - return 0 - return 1 - if(slot_w_uniform) - if(H.w_uniform) - return 0 - if(H.wear_suit && (H.wear_suit.body_parts_covered & src.body_parts_covered)) - if(!disable_warning) - H << "\The [H.wear_suit] is in the way." - return 0 - if( !(slot_flags & SLOT_ICLOTHING) ) - return 0 - return 1 - if(slot_wear_id) - if(H.wear_id) - return 0 - if(!H.w_uniform && (slot_w_uniform in mob_equip)) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [name]." - return 0 - if( !(slot_flags & SLOT_ID) ) - return 0 - return 1 - if(slot_l_store) - if(H.l_store) - return 0 - if(!H.w_uniform && (slot_w_uniform in mob_equip)) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [name]." - return 0 - if(slot_flags & SLOT_DENYPOCKET) - return 0 - if( w_class <= 2 || (slot_flags & SLOT_POCKET) ) - return 1 - if(slot_r_store) - if(H.r_store) - return 0 - if(!H.w_uniform && (slot_w_uniform in mob_equip)) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [name]." - return 0 - if(slot_flags & SLOT_DENYPOCKET) - return 0 - if( w_class <= 2 || (slot_flags & SLOT_POCKET) ) - return 1 - return 0 - if(slot_s_store) - if(H.s_store) - return 0 - if(!H.wear_suit && (slot_wear_suit in mob_equip)) - if(!disable_warning) - H << "You need a suit before you can attach this [name]." - return 0 - if(!H.wear_suit.allowed) - if(!disable_warning) - usr << "You somehow have a suit with no defined allowed items for suit storage, stop that." - return 0 - if( istype(src, /obj/item/device/pda) || istype(src, /obj/item/weapon/pen) || is_type_in_list(src, H.wear_suit.allowed) ) - return 1 - return 0 - if(slot_handcuffed) - if(H.handcuffed) - return 0 - if(!istype(src, /obj/item/weapon/handcuffs)) - return 0 - return 1 - if(slot_legcuffed) - if(H.legcuffed) - return 0 - if(!istype(src, /obj/item/weapon/legcuffs)) - return 0 - return 1 - if(slot_in_backpack) - if (H.back && istype(H.back, /obj/item/weapon/storage/backpack)) - var/obj/item/weapon/storage/backpack/B = H.back - if(B.contents.len < B.storage_slots && w_class <= B.max_w_class) - return 1 - return 0 - if(slot_tie) - if(!H.w_uniform && (slot_w_uniform in mob_equip)) - if(!disable_warning) - H << "You need a jumpsuit before you can attach this [name]." - return 0 - var/obj/item/clothing/under/uniform = H.w_uniform - if(uniform.accessories.len && !uniform.can_attach_accessory(src)) - if (!disable_warning) - H << "You already have an accessory of this type attached to your [uniform]." - return 0 - if( !(slot_flags & SLOT_TIE) ) - return 0 - return 1 - return 0 //Unsupported slot - //END HUMAN +/obj/item/proc/mob_can_unequip(mob/M, slot, disable_warning = 0) + if(!slot) return 0 + if(!M) return 0 + + if(!canremove) + return 0 + if(!M.slot_is_accessible(slot, src, disable_warning? null : M)) + return 0 + return 1 /obj/item/verb/verb_pickup() set src in oview(1) diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index a11b326e45..208a2111da 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -11,7 +11,7 @@ ..() if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 ) - del(src) + qdel(src) /obj/item/apc_frame/proc/try_build(turf/on_wall) if (get_dist(on_wall,usr)>1) @@ -38,6 +38,6 @@ var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc) C.amount = 10 usr << "You cut the cables and disassemble the unused power terminal." - del(T) + qdel(T) new /obj/machinery/power/apc(loc, ndir, 1) - del(src) + qdel(src) diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm index 0d386623ec..24e9adb5ad 100644 --- a/code/game/objects/items/ashtray.dm +++ b/code/game/objects/items/ashtray.dm @@ -31,7 +31,7 @@ processing_objects.Remove(cig) var/obj/item/butt = new cig.type_butt(src) cig.transfer_fingerprints_to(butt) - del(cig) + qdel(cig) W = butt else if (cig.lit == 0) user << "You place [cig] in [src] without even smoking it. Why would you do that?" diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index fcbebdba20..8953872d93 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -10,7 +10,7 @@ attack_self(mob/user) var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) R.add_fingerprint(user) - del(src) + qdel(src) /obj/item/weapon/storage/box/bodybags @@ -49,7 +49,7 @@ return if (!in_range(src, user) && src.loc != user) return - t = sanitize(t) + t = sanitizeSafe(t, MAX_NAME_LEN) if (t) src.name = "body bag - " src.name += t @@ -83,7 +83,7 @@ visible_message("[usr] folds up the [src.name]") new item_path(get_turf(src)) spawn(0) - del(src) + qdel(src) return /obj/structure/closet/body_bag/update_icon() @@ -105,7 +105,7 @@ 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) + qdel(src) @@ -126,7 +126,7 @@ O.icon = src.icon O.icon_state = "bodybag_used" O.desc = "Pretty useless now.." - del(src) + qdel(src) /obj/structure/closet/body_bag/cryobag/MouseDrop(over_object, src_location, over_location) if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 8e1a382a86..1b9ad0991a 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -85,7 +85,7 @@ uses-- if(!uses) user << "\red You used up your crayon!" - del(src) + qdel(src) return /obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) @@ -97,6 +97,6 @@ uses -= 5 if(uses <= 0) user << "\red You ate your crayon!" - del(src) + qdel(src) else ..() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm old mode 100755 new mode 100644 index 87f7b0fd8a..c7421f9397 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -542,7 +542,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400) + ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400, state = inventory_state) // when the ui is first opened this is the data it will use ui.load_cached_data(ManifestJSON) @@ -617,16 +617,7 @@ var/global/list/obj/item/device/pda/PDAs = list() ownrank = id.rank name = "PDA-[owner] ([ownjob])" if("Eject")//Ejects the cart, only done from hub. - if (!isnull(cartridge)) - var/turf/T = loc - if(ismob(T)) - T = T.loc - cartridge.loc = T - mode = 0 - scanmode = 0 - if (cartridge.radio) - cartridge.radio.hostpda = null - cartridge = null + verb_remove_cartridge() //MENU FUNCTIONS=================================== @@ -825,7 +816,8 @@ var/global/list/obj/item/device/pda/PDAs = list() difficulty += P.cartridge.access_engine difficulty += P.cartridge.access_clown difficulty += P.cartridge.access_janitor - difficulty += 3 * P.hidden_uplink + if(P.hidden_uplink) + difficulty += 3 if(prob(difficulty)) U.show_message("\red An error flashes on your [src].", 1) @@ -946,7 +938,7 @@ var/global/list/obj/item/device/pda/PDAs = list() j = prob(10) if(j) //This kills the PDA - P.Del() + qdel(P) if(message) message += "It melts in a puddle of plastic." else @@ -1119,6 +1111,30 @@ var/global/list/obj/item/device/pda/PDAs = list() else usr << "You cannot do this while restrained." +/obj/item/device/pda/verb/verb_remove_cartridge() + set category = "Object" + set name = "Remove cartridge" + set src in usr + + if(issilicon(usr)) + return + + if (can_use(usr) && !isnull(cartridge)) + var/turf/T = get_turf(src) + cartridge.loc = T + if (ismob(loc)) + var/mob/M = loc + M.put_in_hands(cartridge) + else + cartridge.loc = get_turf(src) + mode = 0 + scanmode = 0 + if (cartridge.radio) + cartridge.radio.hostpda = null + cartridge = null + usr << "You remove \the [cartridge] from the [name]." + else + usr << "You cannot do this while restrained." /obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use. if(choice == 1) @@ -1224,7 +1240,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if ( !(C:blood_DNA) ) user << "\blue No blood found on [C]" if(C:blood_DNA) - del(C:blood_DNA) + qdel(C:blood_DNA) else user << "\blue Blood found on [C]. Analysing..." spawn(15) @@ -1354,7 +1370,7 @@ var/global/list/obj/item/device/pda/PDAs = list() explosion(T, 0, 0, 1, rand(1,2)) return -/obj/item/device/pda/Del() +/obj/item/device/pda/Destroy() PDAs -= src if (src.id && prob(90)) //IDs are kept in 90% of the cases src.id.loc = get_turf(src.loc) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 5ab09d0853..2c91285e08 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -58,10 +58,9 @@ icon_state = "cart-s" access_security = 1 -/obj/item/weapon/cartridge/security/New() +/obj/item/weapon/cartridge/security/initialize() + radio = new /obj/item/radio/integrated/beepsky(src) ..() - spawn(5) - radio = new /obj/item/radio/integrated/beepsky(src) /obj/item/weapon/cartridge/detective name = "\improper D.E.T.E.C.T. cartridge" @@ -102,6 +101,7 @@ /obj/item/weapon/cartridge/signal name = "generic signaler cartridge" desc = "A data cartridge with an integrated radio signaler module." + var/qdeled = 0 /obj/item/weapon/cartridge/signal/science name = "\improper Signal Ace 2 cartridge" @@ -110,12 +110,13 @@ access_reagent_scanner = 1 access_atmos = 1 -/obj/item/weapon/cartridge/signal/New() +/obj/item/weapon/cartridge/signal/initialize() + radio = new /obj/item/radio/integrated/signal(src) + ..() + +/obj/item/weapon/cartridge/signal/Destroy() + qdel(radio) ..() - spawn(5) - radio = new /obj/item/radio/integrated/signal(src) - - /obj/item/weapon/cartridge/quartermaster name = "\improper Space Parts & Space Vendors cartridge" @@ -123,10 +124,9 @@ icon_state = "cart-q" access_quartermaster = 1 -/obj/item/weapon/cartridge/quartermaster/New() +/obj/item/weapon/cartridge/quartermaster/initialize() + radio = new /obj/item/radio/integrated/mule(src) ..() - spawn(5) - radio = new /obj/item/radio/integrated/mule(src) /obj/item/weapon/cartridge/head name = "\improper Easy-Record DELUXE" @@ -141,10 +141,8 @@ access_janitor = 1 access_security = 1 -/obj/item/weapon/cartridge/hop/New() - ..() - spawn(5) - radio = new /obj/item/radio/integrated/mule(src) +/obj/item/weapon/cartridge/hop/initialize() + radio = new /obj/item/radio/integrated/mule(src) /obj/item/weapon/cartridge/hos name = "\improper R.O.B.U.S.T. DELUXE" @@ -152,10 +150,9 @@ access_status_display = 1 access_security = 1 -/obj/item/weapon/cartridge/hos/New() +/obj/item/weapon/cartridge/hos/initialize() + radio = new /obj/item/radio/integrated/beepsky(src) ..() - spawn(5) - radio = new /obj/item/radio/integrated/beepsky(src) /obj/item/weapon/cartridge/ce name = "\improper Power-On DELUXE" @@ -178,10 +175,9 @@ access_reagent_scanner = 1 access_atmos = 1 -/obj/item/weapon/cartridge/rd/New() +/obj/item/weapon/cartridge/rd/initialize() + radio = new /obj/item/radio/integrated/signal(src) ..() - spawn(5) - radio = new /obj/item/radio/integrated/signal(src) /obj/item/weapon/cartridge/captain name = "\improper Value-PAK cartridge" @@ -331,7 +327,7 @@ beepskyData["botstatus"] = list("loca" = null, "mode" = -1) var/botsCount=0 if(SC.botlist && SC.botlist.len) - for(var/obj/machinery/bot/B in SC.botlist) + for(var/mob/living/bot/B in SC.botlist) botsCount++ if(B.loc) botsData[++botsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]") @@ -465,7 +461,7 @@ BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CbotData[0] - for(var/obj/machinery/bot/cleanbot/B in world) + for(var/mob/living/bot/cleanbot/B in world) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 0c7105118f..c4fb385536 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -37,7 +37,7 @@ /obj/item/radio/integrated/beepsky var/list/botlist = null // list of bots - var/obj/machinery/bot/secbot/active // the active bot; if null, show bot list + var/mob/living/bot/secbot/active // the active bot; if null, show bot list var/list/botstatus // the status signal sent by the bot var/control_freq = AI_FREQ @@ -99,6 +99,12 @@ post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , s_filter = RADIO_SECBOT) post_signal(control_freq, "command", "bot_status", "active", active, s_filter = RADIO_SECBOT) + +/obj/item/radio/integrated/beepsky/Destroy() + if(radio_controller) + radio_controller.remove_object(src, control_freq) + ..() + /obj/item/radio/integrated/mule var/list/botlist = null // list of bots var/obj/machinery/bot/mulebot/active // the active bot; if null, show bot list @@ -211,12 +217,10 @@ var/last_transmission var/datum/radio_frequency/radio_connection - New() - ..() - if(radio_controller) - initialize() - initialize() + if(!radio_controller) + return + if (src.frequency < 1441 || src.frequency > 1489) src.frequency = sanitize_frequency(src.frequency) @@ -245,3 +249,8 @@ radio_connection.post_signal(src, signal) return + +/obj/item/radio/integrated/signal/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + ..() diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 1982fbb4f4..f7ef8ad5c2 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -41,25 +41,25 @@ if(active_dummy) eject_all() playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) - del(active_dummy) + qdel(active_dummy) active_dummy = null usr << "\blue You deactivate the [src]." - var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) + var/obj/effect/overlay/T = PoolOrNew(/obj/effect/overlay, get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) - spawn(8) T.delete() + spawn(8) qdel(T) else playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) var/obj/O = new saved_item(src) if(!O) return - var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc) + var/obj/effect/dummy/chameleon/C = PoolOrNew(/obj/effect/dummy/chameleon, usr.loc) C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src) - del(O) + qdel(O) usr << "\blue You activate the [src]." var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) - spawn(8) T.delete() + spawn(8) qdel(T) /obj/item/device/chameleon/proc/disrupt(var/delete_dummy = 1) if(active_dummy) @@ -69,7 +69,7 @@ spark_system.start() eject_all() if(delete_dummy) - del(active_dummy) + qdel(active_dummy) active_dummy = null can_use = 0 spawn(50) can_use = 1 @@ -140,6 +140,6 @@ step(src, direction) return -/obj/effect/dummy/chameleon/Del() +/obj/effect/dummy/chameleon/Destroy() master.disrupt(0) ..() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 7013b30419..0c1106f12a 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -103,7 +103,7 @@ animation.master = user flick("blspell", animation) sleep(5) - del(animation) + qdel(animation) if(!flashfail) flick("flash2", src) @@ -154,7 +154,7 @@ animation.master = user flick("blspell", animation) sleep(5) - del(animation) + qdel(animation) for(var/mob/living/carbon/M in oviewers(3, null)) if(prob(50)) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 27b4054fa5..a1c21a7b3f 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -97,6 +97,10 @@ mode = "white" mode_nice = "white" return + if(design == "dark") + mode = "dark" + mode_nice = "dark" + return if(design == "showroom" || design == "hydro" || design == "freezer") mode = "[design]floor" mode_nice = design @@ -135,9 +139,9 @@ mode_nice = design mode = "whitebluegreencorners" tile_dir_mode = 2 - else if(design == "delivery" || design == "bot") + else if(design == "delivery" || design == "bot" || design == "white-delivery" || design == "white-bot") mode_nice = design - mode = design + mode = replacetext(design, "-", "") tile_dir_mode = 0 else if(design == "loadingarea") mode_nice = design diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 713706475c..020b1a83f0 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -90,7 +90,7 @@ AddUses(1) user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining." user.drop_item() - del(L) + qdel(L) return else user << "You need a working light." @@ -156,7 +156,7 @@ target.brightness = L2.brightness target.on = target.has_power() target.update() - del(L2) + qdel(L2) if(target.on && target.rigged) target.explode() diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index 8788eaf0f2..4207546b03 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -24,7 +24,7 @@ if(!parts) user << "This kit has no parts for this modification left." user.drop_from_inventory(src) - del(src) + qdel(src) return var/allowed = 0 @@ -60,7 +60,7 @@ if(!parts) user.drop_from_inventory(src) - del(src) + qdel(src) /obj/item/device/modkit/examine(mob/user) ..(user) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 2cc9d55b6a..a2a714ee9b 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -21,7 +21,7 @@ ..() overlays += "pai-off" -/obj/item/device/paicard/Del() +/obj/item/device/paicard/Destroy() //Will stop people throwing friend pAIs into the singularity so they can respawn if(!isnull(pai)) pai.death(0) @@ -311,7 +311,7 @@ if(pai) pai.ex_act(severity) else - del(src) + qdel(src) /obj/item/device/paicard/see_emote(mob/living/M, text) if(pai && pai.client) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 8b2469d2dd..afca3007ac 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -118,4 +118,4 @@ if(power_drained >= max_power) processing_objects.Remove(src) explosion(src.loc, 3,6,9,12) - del(src) + qdel(src) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index ef332fa336..32807250d7 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -30,7 +30,7 @@ /obj/item/device/radio/beacon/bacon //Probably a better way of doing this, I'm lazy. proc/digest_delay() spawn(600) - del(src) + qdel(src) // SINGULO BEACON SPAWNER @@ -45,5 +45,5 @@ user << "\blue Locked In" new /obj/machinery/power/singularity_beacon/syndicate( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) - del(src) + qdel(src) return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index bfc9e8f69b..e2e2c2b365 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -26,6 +26,13 @@ keyslot2 = new ks2type(src) recalculateChannels(1) +/obj/item/device/radio/headset/Destroy() + qdel(keyslot1) + qdel(keyslot2) + keyslot1 = null + keyslot2 = null + ..() + /obj/item/device/radio/headset/examine(mob/user) if(!(..(user, 1) && radio_desc)) return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 567dc49bf4..0164806e2c 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -15,7 +15,7 @@ ..() processing_objects += src -/obj/item/device/radio/intercom/Del() +/obj/item/device/radio/intercom/Destroy() processing_objects -= src ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index d6b254cad1..5c979f0569 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -42,8 +42,15 @@ /obj/item/device/radio/New() ..() wires = new(src) + +/obj/item/device/radio/Destroy() + qdel(wires) + wires = null if(radio_controller) - initialize() + radio_controller.remove_object(src, frequency) + for (var/ch_name in channels) + radio_controller.remove_object(src, radiochannels[ch_name]) + ..() /obj/item/device/radio/initialize() @@ -172,7 +179,7 @@ 0, "*garbled automated announcement*", src, message, from, "Automated Announcement", from, "synthesized voice", 4, 0, list(0), connection.frequency, "states") - del(A) + qdel(A) return // Interprets the message mode when talking into a radio, possibly returning a connection datum @@ -202,7 +209,7 @@ if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact return 0 - M.last_target_click = world.time + M.last_target_radio = world.time // For the projectile targeting system /* Quick introduction: This new radio system uses a very robust FTL signaling technology unoriginally @@ -625,7 +632,6 @@ onclose(user, "radio") return - /obj/item/device/radio/proc/config(op) if(radio_controller) for (var/ch_name in channels) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 1e9405cbeb..7e450c8f96 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -48,7 +48,7 @@ if(T) T.hotspot_expose(700,125) explosion(T, -1, -1, 0, 4) - del(src) + qdel(src) return /obj/item/device/taperecorder/verb/record() diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index b2ac742a7c..96874bd946 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -53,6 +53,9 @@ datum/nano_item_lists var/uplink_owner = null//text-only var/used_TC = 0 +/obj/item/device/uplink/nano_host() + return loc + /obj/item/device/uplink/New() ..() welcome = ticker.mode.uplink_welcome @@ -61,7 +64,7 @@ datum/nano_item_lists world_uplinks += src -/obj/item/device/uplink/Del() +/obj/item/device/uplink/Destroy() world_uplinks -= src ..() @@ -177,7 +180,7 @@ datum/nano_item_lists /obj/item/device/uplink/hidden/New() spawn(2) if(!istype(src.loc, /obj/item)) - del(src) + qdel(src) ..() // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. @@ -219,7 +222,7 @@ datum/nano_item_lists if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600) + ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600, state = inventory_state) // when the ui is first opened this is the data it will use ui.set_initial_data(data) // open the new ui window diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm new file mode 100644 index 0000000000..54062ff853 --- /dev/null +++ b/code/game/objects/items/glassjar.dm @@ -0,0 +1,108 @@ +/obj/item/glass_jar + name = "glass jar" + desc = "A small empty jar." + icon = 'icons/obj/items.dmi' + icon_state = "jar" + w_class = 2 + matter = list("glass" = 200) + flags = NOBLUDGEON + var/list/accept_mobs = list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/mouse) + var/contains = 0 // 0 = nothing, 1 = money, 2 = animal, 3 = spiderling + +/obj/item/glass_jar/New() + ..() + update_icon() + +/obj/item/glass_jar/afterattack(var/atom/A, var/mob/user, var/proximity) + if(!proximity || contains) + return + if(istype(A, /mob)) + var/accept = 0 + for(var/D in accept_mobs) + if(istype(A, D)) + accept = 1 + if(!accept) + user << "[A] doesn't fit into \the [src]." + return + var/mob/L = A + user.visible_message("[user] scoops [L] into \the [src].", "You scoop [L] into \the [src].") + L.loc = src + contains = 2 + update_icon() + return + else if(istype(A, /obj/effect/spider/spiderling)) + var/obj/effect/spider/spiderling/S = A + user.visible_message("[user] scoops [S] into \the [src].", "You scoop [S] into \the [src].") + S.loc = src + processing_objects.Remove(S) // No growing inside jars + contains = 3 + update_icon() + return + +/obj/item/glass_jar/attack_self(var/mob/user) + switch(contains) + if(1) + for(var/obj/O in src) + O.loc = user.loc + user << "You take money out of \the [src]." + contains = 0 + update_icon() + return + if(2) + for(var/mob/M in src) + M.loc = user.loc + user.visible_message("[user] releases [M] from \the [src].", "You release [M] from \the [src].") + contains = 0 + update_icon() + return + if(3) + for(var/obj/effect/spider/spiderling/S in src) + S.loc = user.loc + user.visible_message("[user] releases [S] from \the [src].", "You release [S] from \the [src].") + processing_objects.Add(S) // They can grow after being let out though + contains = 0 + update_icon() + return + +/obj/item/glass_jar/attackby(var/obj/item/W, var/mob/user) + if(istype(W, /obj/item/weapon/spacecash)) + if(contains == 0) + contains = 1 + if(contains != 1) + return + var/obj/item/weapon/spacecash/S = W + user.visible_message("[user] puts [S.worth] [S.worth > 1 ? "thalers" : "thaler"] into \the [src].") + user.drop_from_inventory(S) + S.loc = src + update_icon() + +/obj/item/glass_jar/update_icon() // Also updates name and desc + underlays.Cut() + overlays.Cut() + switch(contains) + if(0) + name = initial(name) + desc = initial(desc) + if(1) + name = "tip jar" + desc = "A small jar with money inside." + for(var/obj/item/weapon/spacecash/S in src) + var/image/money = image(S.icon, S.icon_state) + money.pixel_x = rand(-2, 3) + money.pixel_y = rand(-6, 6) + money.transform *= 0.6 + underlays += money + if(2) + for(var/mob/M in src) + var/image/victim = image(M.icon, M.icon_state) + victim.pixel_y = 6 + underlays += victim + name = "glass jar with [M]" + desc = "A small jar with [M] inside." + if(3) + for(var/obj/effect/spider/spiderling/S in src) + var/image/victim = image(S.icon, S.icon_state) + underlays += victim + name = "glass jar with [S]" + desc = "A small jar with [S] inside." + return \ No newline at end of file diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index e341a8747f..a37352c7d3 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -30,10 +30,10 @@ burst() switch(severity) if (1) - del(src) + qdel(src) if (2) if (prob(50)) - del(src) + qdel(src) /obj/item/latexballon/bullet_act() burst() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 9c262243c6..6e2f9dd64a 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -134,7 +134,7 @@ if (user.get_inactive_hand()==src) user.remove_from_mob(src) user.put_in_inactive_hand(B) - del(src) + qdel(src) else user << "You need one sheet of metal to arm the robot frame." if(istype(W, /obj/item/robot_parts/l_leg)) @@ -250,7 +250,7 @@ callHook("borgify", list(O)) O.Namepick() - del(src) + qdel(src) else user << "\blue The MMI must go in after everything else!" @@ -291,30 +291,39 @@ ..() if(istype(W, /obj/item/device/flash)) if(istype(user,/mob/living/silicon/robot)) - user << "\red How do you propose to do that?" - return - else if(src.flash1 && src.flash2) - user << "\blue You have already inserted the eyes!" - return - else if(src.flash1) - user.drop_item() - W.loc = src - src.flash2 = W - user << "\blue You insert the flash into the eye socket!" + var/current_module = user.get_active_hand() + if(current_module == W) + user << "How do you propose to do that?" + return + else + add_flashes(W,user) else - user.drop_item() - W.loc = src - src.flash1 = W - user << "\blue You insert the flash into the eye socket!" + add_flashes(W,user) else if(istype(W, /obj/item/weapon/stock_parts/manipulator)) user << "\blue You install some manipulators and modify the head, creating a functional spider-bot!" new /mob/living/simple_animal/spiderbot(get_turf(loc)) user.drop_item() - del(W) - del(src) + qdel(W) + qdel(src) return return +/obj/item/robot_parts/head/proc/add_flashes(obj/item/W as obj, mob/user as mob) //Made into a seperate proc to avoid copypasta + if(src.flash1 && src.flash2) + user << "You have already inserted the eyes!" + return + else if(src.flash1) + user.drop_item() + W.loc = src + src.flash2 = W + user << "You insert the flash into the eye socket!" + else + user.drop_item() + W.loc = src + src.flash1 = W + user << "You insert the flash into the eye socket!" + + /obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/card/emag)) if(sabotaged) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 43b852e249..9930a6f2ea 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -28,20 +28,17 @@ /obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R) if(..()) return 0 R.uneq_all() - R.hands.icon_state = "nomod" - R.icon_state = "robot" - //world << R.custom_sprite - if(R.custom_sprite == 1) - //world << R.icon_state - icon = 'icons/mob/custom-synthetic.dmi' - R.icon_state = "[R.ckey]-Standard" - del(R.module) + R.modtype = initial(R.modtype) + R.hands.icon_state = initial(R.hands.icon_state) + + R.choose_icon(1, R.set_module_sprites(list("Default" = "robot"))) + R.notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, R.module.name) + R.module.Reset(R) + qdel(R.module) R.module = null - R.camera.remove_networks(list("Engineering","Medical","MINE")) + R.updatename("Default") - R.status_flags |= CANPUSH - R.updateicon() return 1 @@ -116,7 +113,7 @@ /obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R) if(..()) return 0 - if(!istype(R.module, /obj/item/weapon/robot_module/security)) + if(!R.module || !(src in R.module.supported_upgrades)) R << "Upgrade mounting error! No suitable hardpoint detected!" usr << "There's no mounting point for the module!" return 0 @@ -150,7 +147,7 @@ /obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) if(..()) return 0 - if(!istype(R.module, /obj/item/weapon/robot_module/miner)) + if(!R.module || !(src in R.module.supported_upgrades)) R << "Upgrade mounting error! No suitable hardpoint detected!" usr << "There's no mounting point for the module!" return 0 diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 1d92cb9a81..2893b4f3a1 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -9,7 +9,7 @@ var/icon/virtualIcon var/list/bulletholes = list() - Del() + Destroy() // if a target is deleted and associated with a stake, force stake to forget for(var/obj/structure/target_stake/T in view(3,src)) if(T.pinned_target == src) @@ -97,7 +97,7 @@ for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) O << "\red [src] breaks into tiny pieces and collapses!" - del(src) + qdel(src) // Create a temporary object to represent the damage var/obj/bmark = new diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm index 0842f70d66..3483dfbc61 100644 --- a/code/game/objects/items/stacks/matter_synth.dm +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -28,6 +28,9 @@ /datum/matter_synth/medicine name = "Medicine Synthesizer" +/datum/matter_synth/nanite + name = "Nanite Synthesizer" + /datum/matter_synth/metal name = "Metal Synthesizer" diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 422640ee1f..ec0ece216e 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -161,6 +161,7 @@ singular_name = "reinforced glass sheet" icon_state = "sheet-rglass" charge_costs = list(500, 1000) + stacktype = /obj/item/stack/sheet/glass/reinforced /* * Phoron Glass sheets diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index de96eda5f4..f43d7ae320 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -20,7 +20,7 @@ new/obj/item/stack/sheet/glass(user.loc) if(amount <= 0) user.drop_from_inventory(src) - del(src) + qdel(src) if(istype(O,/obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = O diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index daa67c4449..4be7f6e7f7 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -146,7 +146,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \ new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \ new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/wood, 2), \ - new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0), \ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index a4e7d94fad..a34e39ab9a 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -29,12 +29,12 @@ src.amount = amount return -/obj/item/stack/Del() +/obj/item/stack/Destroy() if(uses_charge) - return + return 1 if (src && usr && usr.machine == src) usr << browse(null, "window=stack") - ..() + return ..() /obj/item/stack/examine(mob/user) if(..(user, 1)) @@ -139,7 +139,7 @@ if (istype(O, /obj/item/weapon/storage)) //BubbleWrap - so newly formed boxes are empty for (var/obj/item/I in O) - del(I) + qdel(I) /obj/item/stack/Topic(href, href_list) ..() @@ -150,7 +150,7 @@ list_recipes(usr, text2num(href_list["sublist"])) if (href_list["make"]) - if (src.get_amount() < 1) del(src) //Never should happen + if (src.get_amount() < 1) qdel(src) //Never should happen var/list/recipes_list = recipes if (href_list["sublist"]) @@ -187,7 +187,7 @@ if (amount <= 0) //check again in case someone transferred stuff to us if(usr) usr.remove_from_mob(src) - del(src) + qdel(src) return 1 else if(get_amount() < used) diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index 3a14ff1e56..dc57abc513 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -33,4 +33,4 @@ new/obj/item/stack/light_w(user.loc) if(amount <= 0) user.drop_from_inventory(src) - del(src) + qdel(src) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a39acac9c1..dbb67decb7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -63,7 +63,7 @@ if(O.reagents.has_reagent("pacid", 1)) user << "The acid chews through the balloon!" O.reagents.reaction(user) - del(src) + qdel(src) else src.desc = "A translucent balloon with some form of liquid sloshing around in it." user << "\blue You fill the balloon with the contents of [O]." @@ -80,7 +80,7 @@ src.icon_state = "burst" spawn(5) if(src) - del(src) + qdel(src) return /obj/item/toy/balloon/update_icon() @@ -233,7 +233,7 @@ if(istype(I, /obj/item/toy/ammo/crossbow)) if(bullets <= 4) user.drop_item() - del(I) + qdel(I) bullets++ user << "\blue You load the foam dart into the crossbow." else @@ -265,21 +265,21 @@ for(var/mob/O in viewers(world.view, D)) O.show_message(text("\red [] was hit by the foam dart!", M), 1) new /obj/item/toy/ammo/crossbow(M.loc) - del(D) + qdel(D) return for(var/atom/A in D.loc) if(A == user) continue if(A.density) new /obj/item/toy/ammo/crossbow(A.loc) - del(D) + qdel(D) sleep(1) spawn(10) if(D) new /obj/item/toy/ammo/crossbow(D.loc) - del(D) + qdel(D) return else if (bullets == 0) @@ -418,7 +418,7 @@ new /obj/effect/decal/cleanable/ash(src.loc) src.visible_message("\red The [src.name] explodes!","\red You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) - del(src) + qdel(src) /obj/item/toy/snappop/Crossed(H as mob|obj) if((ishuman(H))) //i guess carp and shit shouldn't set them off @@ -432,7 +432,7 @@ new /obj/effect/decal/cleanable/ash(src.loc) src.visible_message("\red The [src.name] explodes!","\red You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) - del(src) + qdel(src) /* * Water flower @@ -440,7 +440,7 @@ /obj/item/toy/waterflower name = "water flower" desc = "A seemingly innocent sunflower...with a twist." - //icon = 'icons/obj/harvest.dmi' + icon = 'icons/obj/device.dmi' icon_state = "sunflower" item_state = "sunflower" var/empty = 0 @@ -494,7 +494,7 @@ if(ismob(T) && T:client) T:client << "\red [user] has sprayed you with water!" sleep(4) - del(D) + qdel(D) return diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 37dcbf9f4e..52e7fac02d 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -40,6 +40,11 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) +/obj/item/weapon/rcd/Destroy() + qdel(spark_system) + spark_system = null + return ..() + /obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/weapon/rcd_ammo)) @@ -47,7 +52,7 @@ user << "The RCD can't hold any more matter-units." return user.drop_from_inventory(W) - del(W) + qdel(W) stored_matter += 10 playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user << "The RCD now holds [stored_matter]/30 matter-units." @@ -138,7 +143,7 @@ else if(build_other) new build_other(T) else - del(T) + qdel(T) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) return 1 diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 596675a094..b96d53c2a8 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -28,7 +28,7 @@ RSF user << "The RSF can't hold any more matter." return - del(W) + qdel(W) stored_matter += 10 playsound(src.loc, 'sound/machines/click.ogg', 10, 1) @@ -54,14 +54,9 @@ RSF user << "Changed dispensing mode to 'Dice Pack'" return if (mode == 5) - mode = 6 + mode = 1 user << "Changed dispensing mode to 'Cigarette'" return - if (mode == 6) - mode = 1 - user << "Changed dispensing mode to 'Dosh'" - return - // Change mode /obj/item/weapon/rsf/afterattack(atom/A, mob/user as mob, proximity) @@ -84,8 +79,8 @@ RSF switch(mode) if(1) - product = new /obj/item/weapon/spacecash/c10() - used_energy = 200 + product = new /obj/item/clothing/mask/smokable/cigarette() + used_energy = 10 if(2) product = new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass() used_energy = 50 @@ -98,9 +93,6 @@ RSF if(5) product = new /obj/item/weapon/storage/pill_bottle/dice() used_energy = 200 - if(6) - product = new /obj/item/clothing/mask/smokable/cigarette() - used_energy = 10 user << "Dispensing [product ? product : "product"]..." product.loc = get_turf(A) diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index dc6787a73b..bf8c9d583c 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -68,7 +68,7 @@ else D.organ_names += ", [O.name]" - del D.organs_scanned[O.name] + qdel(D.organs_scanned[O.name]) D.organs_scanned[O.name] = W.copy() for(var/V in O.trace_chemicals) diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index 6fc63420de..9bbdd1380d 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -1,6 +1,6 @@ /obj/item/weapon/flame/candle name = "red candle" - desc = "a candle" + desc = "a small pillar candle. Its specially-formulated fuel-oxidizer wax mixture allows continued combustion in airless environments." icon = 'icons/obj/candle.dmi' icon_state = "candle1" item_state = "candle1" @@ -8,6 +8,10 @@ var/wax = 2000 +/obj/item/weapon/flame/candle/New() + wax = rand(800, 1000) // Enough for 27-33 minutes. 30 minutes on average. + ..() + /obj/item/weapon/flame/candle/update_icon() var/i if(wax > 1500) @@ -56,7 +60,7 @@ new/obj/item/trash/candle(src.loc) if(istype(src.loc, /mob)) src.dropped() - del(src) + qdel(src) update_icon() if(istype(loc, /turf)) //start a fire if possible var/turf/T = loc @@ -80,4 +84,4 @@ /obj/item/weapon/flame/candle/dropped(mob/user) if(lit) user.SetLuminosity(user.luminosity - CANDLE_LUM) - SetLuminosity(CANDLE_LUM) + SetLuminosity(CANDLE_LUM) \ No newline at end of file diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 6a1ee735f4..92d97e3d5d 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -92,12 +92,12 @@ /obj/machinery/shield_gen, /obj/machinery/clonepod, /obj/machinery/deployable, - /obj/machinery/door_control, + /obj/machinery/button/remote, /obj/machinery/porta_turret, /obj/machinery/shieldgen, /obj/machinery/turretid, /obj/machinery/vending, - /obj/machinery/bot, + /mob/living/bot, /obj/machinery/door, /obj/machinery/telecomms, /obj/machinery/mecha_part_fabricator, @@ -118,7 +118,7 @@ user.drop_item() var/obj/item/weapon/card/emag_broken/junk = new(user.loc) junk.add_fingerprint(user) - del(src) + qdel(src) return ..() @@ -170,7 +170,7 @@ src.desc = W.desc src.icon = W.icon src.icon_state = W.icon_state - del(W) + qdel(W) return /obj/item/weapon/card/id/verb/read() @@ -224,13 +224,13 @@ /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) if(!src.registered_name) //Stop giving the players unsanitized unputs! You are giving ways for players to intentionally crash clients! -Nodrak - var t = sanitizeName(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)) + var t = sanitizeName(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) if(!t) //Same as mob/new_player/prefrences.dm alert("Invalid name.") return src.registered_name = t - var u = sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Agent")) + var u = sanitize(input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Agent"), MAX_LNAME_LEN) if(!u) alert("Invalid assignment.") src.registered_name = "" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index fbba55b040..15b43d63e0 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -93,9 +93,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM flags |= NOREACT // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 -/obj/item/clothing/mask/smokable/Del() +/obj/item/clothing/mask/smokable/Destroy() ..() - del(reagents) + qdel(reagents) /obj/item/clothing/mask/smokable/process() var/turf/location = get_turf(src) @@ -127,13 +127,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/datum/effect/effect/system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount("phoron") / 2.5, 1), get_turf(src), 0, 0) e.start() - del(src) + qdel(src) return if(reagents.get_reagent_amount("fuel")) // the fuel explodes, too, but much less violently var/datum/effect/effect/system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount("fuel") / 5, 1), get_turf(src), 0, 0) e.start() - del(src) + qdel(src) return flags &= ~NOREACT // allowing reagents to react after being lit reagents.handle_reactions() @@ -162,7 +162,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM M.update_inv_l_hand(0) M.update_inv_r_hand(1) processing_objects.Remove(src) - del(src) + qdel(src) else new /obj/effect/decal/cleanable/ash(T) if(ismob(loc)) @@ -377,7 +377,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(G.reagents) G.reagents.trans_to(src, G.reagents.total_volume) name = "[G.name]-packed [initial(name)]" - del(G) + qdel(G) else if(istype(W, /obj/item/weapon/flame/lighter)) var/obj/item/weapon/flame/lighter/L = W diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm index e45f51a088..b7da10cc22 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm @@ -5,16 +5,23 @@ /obj/item/weapon/circuitboard/security name = T_BOARD("security camera monitor") build_path = /obj/machinery/computer/security - var/network = list("SS13") req_access = list(access_security) + var/list/network var/locked = 1 var/emagged = 0 + +/obj/item/weapon/circuitboard/security/New() + ..() + network = station_networks /obj/item/weapon/circuitboard/security/engineering name = T_BOARD("engineering camera monitor") build_path = /obj/machinery/computer/security/engineering - network = list("Engineering","Power Alarms","Atmosphere Alarms","Fire Alarms") req_access = list() + +/obj/item/weapon/circuitboard/security/engineering/New() + ..() + network = engineering_networks /obj/item/weapon/circuitboard/security/mining name = T_BOARD("mining camera monitor") diff --git a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm new file mode 100644 index 0000000000..81216003d5 --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm @@ -0,0 +1,16 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +/obj/item/weapon/circuitboard/bluespacerelay + name = T_BOARD("bluespacerelay") + build_path = "/obj/machinery/bluespacerelay" + board_type = "machine" + origin_tech = "bluespace=4,programming=4" + frame_desc = "Requires 30 Cable Coil, 1 Hyperwave Filter and 1 Ansible Crystal, and 2 Micro-Manipulators" + req_components = list( + "/obj/item/stack/cable_coil" = 30, + "/obj/item/weapon/stock_parts/manipulator" = 2, + "/obj/item/weapon/stock_parts/subspace/filter" = 1, + "/obj/item/weapon/stock_parts/subspace/crystal" = 1, + ) \ No newline at end of file diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 656197fee0..f86359c21d 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -28,7 +28,11 @@ user << "You need to take that [target.name] off before cleaning it." else if(istype(target,/obj/effect/decal/cleanable)) user << "You scrub \the [target.name] out." - del(target) + qdel(target) + else if(istype(target,/turf)) + user << "You scrub \the [target.name] clean." + var/turf/T = target + T.clean() else user << "You clean \the [target.name]." target.clean_blood() diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index dfd221650b..8ccc1f1006 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -92,7 +92,7 @@ spawn(0)//this prevents the collapse of space-time continuum if (user) user.drop_from_inventory(src) - del(src) + qdel(src) return uses /obj/item/weapon/dnainjector/attack(mob/M as mob, mob/user as mob) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 030437b446..36c97d3df2 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -80,7 +80,7 @@ target.ex_act(1) if(target) target.overlays -= image_overlay - del(src) // qdel + qdel(src) /obj/item/weapon/plastique/attack(mob/M as mob, mob/user as mob, def_zone) return diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 4408e998ce..1348fc7605 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -115,7 +115,7 @@ for(var/a=0, a < spray_particles, a++) spawn(0) - var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) ) + var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(src)) var/turf/my_target = pick(the_targets) var/datum/reagents/R = new/datum/reagents(spray_amount) if(!W) return @@ -139,7 +139,7 @@ M.ExtinguishMob() if(W.loc == my_target) break sleep(2) - W.delete() + qdel(W) if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0)) user.inertia_dir = get_dir(target, user) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 50508594cf..f57ffaf84c 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -22,13 +22,13 @@ var/obj/item/weapon/tank/phoron/ptank = null -/obj/item/weapon/flamethrower/Del() +/obj/item/weapon/flamethrower/Destroy() if(weldtool) - del(weldtool) + qdel(weldtool) if(igniter) - del(igniter) + qdel(igniter) if(ptank) - del(ptank) + qdel(ptank) ..() return @@ -82,8 +82,8 @@ if(ptank) ptank.loc = T ptank = null - new /obj/item/stack/rods(T) - del(src) + PoolOrNew(/obj/item/stack/rods, T) + qdel(src) return if(isscrewdriver(W) && igniter && !lit) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index dd3d0886fb..023eb3bfd3 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -31,11 +31,11 @@ src.gift.add_fingerprint(user) else user << "\blue The gift was empty!" - del(src) + qdel(src) return /obj/item/weapon/a_gift/ex_act() - del(src) + qdel(src) return /obj/effect/spresent/relaymove(mob/user as mob) @@ -58,7 +58,7 @@ M.client.eye = M.client.mob M.client.perspective = MOB_PERSPECTIVE - del(src) + qdel(src) /obj/item/weapon/a_gift/attack_self(mob/M as mob) var/gift_type = pick(/obj/item/weapon/sord, @@ -112,7 +112,7 @@ M.remove_from_mob(src) M.put_in_hands(I) I.add_fingerprint(M) - del(src) + qdel(src) return /* @@ -152,7 +152,7 @@ src.add_fingerprint(user) if (src.amount <= 0) new /obj/item/weapon/c_tube( src.loc ) - del(src) + qdel(src) return else user << "\blue You need scissors!" diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index bb440d1215..a58ebe4cbe 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -167,7 +167,7 @@ invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? spawn(50) //To make sure all reagents can work - del(src) //correctly before deleting the grenade. + qdel(src) //correctly before deleting the grenade. /obj/item/weapon/grenade/chem_grenade/large diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index 3446fa46c3..c354aa4039 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -7,5 +7,5 @@ prime() ..() if(empulse(src, 4, 10)) - del(src) + qdel(src) return diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 03d8ccdffc..4c3c73c485 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -23,7 +23,7 @@ new/obj/effect/effect/sparks(src.loc) new/obj/effect/effect/smoke/illumination(src.loc, brightness=15) - del(src) + qdel(src) return proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. @@ -124,9 +124,8 @@ spawn(0) new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(0) - del(src) - return + qdel(src) + return /obj/item/weapon/grenade/flashbang/clusterbang/segment desc = "A smaller segment of a clusterbang. Better run." @@ -156,9 +155,8 @@ spawn(0) new /obj/item/weapon/grenade/flashbang/cluster(src.loc) playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(0) - del(src) - return + qdel(src) + return /obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang spawn(0) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 139baacb6f..e1e58b62ac 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -10,7 +10,7 @@ New() ..() - src.smoke = new /datum/effect/effect/system/smoke_spread/bad + src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad) src.smoke.attach(src) prime() @@ -30,5 +30,5 @@ B.health -= damage B.update_icon() sleep(80) - del(src) + qdel(src) return diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 8b6b6e938d..6adea8e2f5 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -28,7 +28,7 @@ // Spawn some hostile syndicate critters - del(src) + qdel(src) return /obj/item/weapon/grenade/spawnergrenade/manhacks diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 85bec3a8ea..8aa2f1819d 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -132,7 +132,7 @@ var/last_chew = 0 user.put_in_hands(W) user << "You wrap the cable restraint around the top of the rod." - del(src) + qdel(src) update_icon(user) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 50b4135dd7..7a200891ed 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -9,7 +9,7 @@ var/implanted = null var/mob/imp_in = null var/obj/item/organ/external/part = null - item_color = "b" + var/implant_color = "b" var/allow_reagents = 0 var/malfunction = 0 @@ -46,7 +46,7 @@ icon_state = "implant_melted" malfunction = MALFUNCTION_PERMANENT - Del() + Destroy() if(part) part.implants.Remove(src) ..() @@ -155,7 +155,7 @@ Implant Specifics:
      "} msg = replace_characters(msg, replacechars) if(findtext(msg,phrase)) activate() - del(src) + qdel(src) activate() if (malfunction == MALFUNCTION_PERMANENT) @@ -179,11 +179,11 @@ Implant Specifics:
      "} istype(part,/obj/item/organ/external/head)) part.createwound(BRUISE, 60) //mangle them instead explosion(get_turf(imp_in), -1, -1, 2, 3) - del(src) + qdel(src) else explosion(get_turf(imp_in), -1, -1, 2, 3) part.droplimb(0,DROPLIMB_BLUNT) - del(src) + qdel(src) if (elevel == "Destroy Body") explosion(get_turf(T), -1, 0, 1, 6) T.gib() @@ -249,7 +249,7 @@ Implant Specifics:
      "} else part.droplimb(0,DROPLIMB_BLUNT) explosion(get_turf(imp_in), -1, -1, 2, 3) - del(src) + qdel(src) /obj/item/weapon/implant/chem name = "chemical implant" @@ -296,7 +296,7 @@ the implant may become unstable and either pre-maturely inject the subject or si if(!src.reagents.total_volume) R << "You hear a faint click from your chest." spawn(0) - del(src) + qdel(src) return emp_act(severity) @@ -421,17 +421,17 @@ the implant may become unstable and either pre-maturely inject the subject or si a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm") else a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm") - del(a) + qdel(a) processing_objects.Remove(src) if ("emp") var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) var/name = prob(50) ? t.name : pick(teleportlocs) a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm") - del(a) + qdel(a) else var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") - del(a) + qdel(a) processing_objects.Remove(src) emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this @@ -489,7 +489,7 @@ the implant may become unstable and either pre-maturely inject the subject or si imp_in.put_in_hands(scanned) else scanned.loc = t - del src + qdel(src) implanted(mob/source as mob) src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index ddb76b3656..8d731e0bbe 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -13,7 +13,7 @@ /obj/item/weapon/implantcase/proc/update() if (src.imp) - src.icon_state = text("implantcase-[]", src.imp.item_color) + src.icon_state = text("implantcase-[]", src.imp.implant_color) else src.icon_state = "implantcase-0" return @@ -26,7 +26,7 @@ return if((!in_range(src, usr) && src.loc != user)) return - t = sanitize(t) + t = sanitizeSafe(t, MAX_NAME_LEN) if(t) src.name = text("Glass Case - '[]'", t) else diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 535a4264c0..2f33eba413 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -84,7 +84,7 @@ return var/mob/M = G:affecting if(put_mob(M)) - del(G) + qdel(G) src.updateUsrDialog() return diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index d32ae9d8ba..5131961060 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -3,7 +3,7 @@ /obj/item/weapon/implant/freedom name = "freedom implant" desc = "Use this to escape from those evil Red Shirts." - item_color = "r" + implant_color = "r" var/activation_emote = "chuckle" var/uses = 1.0 diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index f026313034..a9ee95db52 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -98,7 +98,7 @@

      OPERATING PRINCIPLES


      -
    • The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and plasma. As oxygen accelerates the reaction, and plasma carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.
    • +
    • The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.

    • Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.

    • @@ -106,7 +106,7 @@
    • The MK 1 Prototype Thermoelectric Supermatter Engine is designed to operate at reactor temperatures of 3000K to 4000K and generate up to 1MW of power. Beyond 1MW, the thermoelectric generators will begin to lose power through electrical discharge, reducing efficiency, but additional power generation remains feasible.

    • -
    • The crystal structure of the supermatter will begin to liquefy if its temperature exceeds 5000K. This eventually results in a massive release of light, heat and radiation, disintegration of both the supermatter crystal and most of the surrounding area, and as as-of-yet poorly documented psychological effects on all animals within a 2km. Appropriate action should be taken to stabilize or eject the supermatter before such occurs.
    • +
    • The crystal structure of the supermatter will begin to liquefy if its temperature exceeds 5000K. This eventually results in a massive release of light, heat and radiation, disintegration of both the supermatter crystal and most of the surrounding area, and as as-of-yet poorly documented psychological effects on all animals within a 2km radius. Appropriate action should be taken to stabilize or eject the supermatter before such occurs.

    • SUPERMATTER HANDLING

    • Do not expose supermatter to oxygen.
    • @@ -125,7 +125,7 @@
      1. Ensure that radiation protection and meson goggles are worn at all times while working in the engine room.
      2. Ensure that reactor and radiator loops are undamaged and unobstructed.
      3. -
      4. Ensure that plasma and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.
      5. +
      6. Ensure that phoron and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.
      7. Ensure that engine room Area Power Controller (APC) and engine Superconducting Magnetic Energy Storage unit (SMES) are properly charged.
      8. Ensure that reactor temperature does not exceed 5000K. In event of reactor temperature exceeding 5000K, see EMERGENCY COOLING PROCEDURE.
      9. In event of imminent and/or unavoidable delamination, see EJECTION PROCEDURE.
      10. diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index f04be5d33a..8b2a657dd5 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -113,6 +113,7 @@ origin_tech = "magnets=3;syndicate=4" sharp = 1 edge = 1 + var/blade_color /obj/item/weapon/melee/energy/sword/dropped(var/mob/user) ..() @@ -120,26 +121,26 @@ deactivate(user) /obj/item/weapon/melee/energy/sword/New() - item_color = pick("red","blue","green","purple") + blade_color = pick("red","blue","green","purple") /obj/item/weapon/melee/energy/sword/green/New() - item_color = "green" + blade_color = "green" /obj/item/weapon/melee/energy/sword/red/New() - item_color = "red" + blade_color = "red" /obj/item/weapon/melee/energy/sword/blue/New() - item_color = "blue" + blade_color = "blue" /obj/item/weapon/melee/energy/sword/purple/New() - item_color = "purple" + blade_color = "purple" /obj/item/weapon/melee/energy/sword/activate(mob/living/user) if(!active) user << "\The [src] is now energised." ..() attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - icon_state = "sword[item_color]" + icon_state = "sword[blade_color]" /obj/item/weapon/melee/energy/sword/deactivate(mob/living/user) if(active) @@ -192,16 +193,16 @@ processing_objects |= src -/obj/item/weapon/melee/energy/blade/Del() +/obj/item/weapon/melee/energy/blade/Destroy() processing_objects -= src ..() /obj/item/weapon/melee/energy/blade/attack_self(mob/user as mob) user.drop_from_inventory(src) - spawn(1) if(src) del(src) + spawn(1) if(src) qdel(src) /obj/item/weapon/melee/energy/blade/dropped() - spawn(1) if(src) del(src) + spawn(1) if(src) qdel(src) /obj/item/weapon/melee/energy/blade/process() if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src)) @@ -216,4 +217,4 @@ host.pinned -= src host.embedded -= src host.drop_from_inventory(src) - spawn(1) if(src) del(src) + spawn(1) if(src) qdel(src) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index fe9945f8f0..0df10cd97c 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -24,7 +24,7 @@ T.dirt = 0 for(var/obj/effect/O in src) if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - del(O) + qdel(O) source.reagents.reaction(src, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. source.reagents.remove_any(1) //reaction() doesn't use up the reagents diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 4444904c1b..48d1d4cf64 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -9,6 +9,9 @@ var/tape_type = /obj/item/tape var/icon_base +var/list/image/hazard_overlays +var/list/tape_roll_applications = list() + /obj/item/tape name = "tape" icon = 'icons/policetape.dmi' @@ -17,6 +20,15 @@ var/crumpled = 0 var/icon_base +/obj/item/tape/New() + ..() + if(!hazard_overlays) + hazard_overlays = list() + hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") + hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") + hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") + hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") + /obj/item/taperoll/police name = "police tape" desc = "A roll of police tape used to block off crime scenes from the public." @@ -98,7 +110,10 @@ usr << "\blue You finish placing the [src]." //Git Test /obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) - if (proximity && istype(A, /obj/machinery/door/airlock)) + if(!proximity) + return + + if (istype(A, /obj/machinery/door/airlock)) var/turf/T = get_turf(A) var/obj/item/tape/P = new tape_type(T.x,T.y,T.z) P.loc = locate(T.x,T.y,T.z) @@ -106,6 +121,23 @@ P.layer = 3.2 user << "\blue You finish placing the [src]." + if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) + var/turf/F = A + var/direction = user.loc == F ? user.dir : turn(user.dir, 180) + var/icon/hazard_overlay = hazard_overlays["[direction]"] + if(tape_roll_applications[F] == null) + tape_roll_applications[F] = 0 + + if(tape_roll_applications[F] & direction) // hazard_overlay in F.overlays wouldn't work. + user.visible_message("[user] uses the adhesive of \the [src] to remove area markings from \the [F].", "You use the adhesive of \the [src] to remove area markings from \the [F].") + F.overlays -= hazard_overlay + tape_roll_applications[F] &= ~direction + else + user.visible_message("[user] applied \the [src] on \the [F] to create area markings.", "You apply \the [src] on \the [F] to create area markings.") + F.overlays |= hazard_overlay + tape_roll_applications[F] |= direction + return + /obj/item/tape/proc/crumple() if(!crumpled) crumpled = 1 @@ -159,10 +191,10 @@ for (var/obj/item/tape/P in cur) if(P.icon_state == icon_dir) N = 0 - del(P) + qdel(P) cur = get_step(cur,dir[i]) - del(src) + qdel(src) return diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 6b48653a6a..a383d8fb0c 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -64,7 +64,7 @@ G.attackby(NG, user) usr << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheets." //SN src = null - del(src) + qdel(src) return return ..() diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 40937ea61c..541b41f74d 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -6,8 +6,17 @@ /obj/item/weapon/storage/backpack name = "backpack" desc = "You wear this on your back and put items into it." + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_backpacks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_backpacks.dmi', + ) icon_state = "backpack" - item_state = "backpack" + item_state = null + //most backpacks use the default backpack state for inhand overlays + item_state_slots = list( + slot_l_hand_str = "backpack", + slot_r_hand_str = "backpack", + ) w_class = 4 slot_flags = SLOT_BACK max_w_class = 3 @@ -52,18 +61,18 @@ return if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) user << "\red The Bluespace interfaces of the two devices conflict and malfunction." - del(W) + qdel(W) return /* //BoH+BoH=Singularity, commented out. if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) investigate_log("has become a singularity. Caused by [user.key]","singulo") user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!" - del(W) - var/obj/machinery/singularity/singulo = new /obj/machinery/singularity (get_turf(src)) + qdel(W) + var/obj/singularity/singulo = new /obj/singularity (get_turf(src)) singulo.energy = 300 //should make it a bit bigger~ message_admins("[key_name_admin(user)] detonated a bag of holding") log_game("[key_name(user)] detonated a bag of holding") - del(src) + qdel(src) return */ ..() @@ -81,7 +90,7 @@ else user << "\red The Bluespace generator malfunctions!" for (var/obj/O in src.contents) //it broke, delete what was in it - del(O) + qdel(O) crit_fail = 1 icon_state = "brokenpack" @@ -95,6 +104,7 @@ storage_slots = 20 max_w_class = 3 max_storage_space = 400 // can store a ton of shit! + item_state_slots = null /obj/item/weapon/storage/backpack/cultpack name = "trophy rack" @@ -105,61 +115,56 @@ name = "Giggles von Honkerton" desc = "It's a backpack made by Honk! Co." icon_state = "clownpack" - item_state = "clownpack" + item_state_slots = null /obj/item/weapon/storage/backpack/medic name = "medical backpack" desc = "It's a backpack especially designed for use in a sterile environment." icon_state = "medicalpack" - item_state = "medicalpack" + item_state_slots = null /obj/item/weapon/storage/backpack/security name = "security backpack" desc = "It's a very robust backpack." icon_state = "securitypack" - item_state = "securitypack" + item_state_slots = null /obj/item/weapon/storage/backpack/captain name = "captain's backpack" desc = "It's a special backpack made exclusively for Nanotrasen officers." icon_state = "captainpack" - item_state = "captainpack" + item_state_slots = null /obj/item/weapon/storage/backpack/industrial name = "industrial backpack" desc = "It's a tough backpack for the daily grind of station life." icon_state = "engiepack" - item_state = "engiepack" + item_state_slots = null /obj/item/weapon/storage/backpack/toxins name = "laboratory backpack" desc = "It's a light backpack modeled for use in laboratories and other scientific institutions." icon_state = "toxpack" - item_state = "toxpack" /obj/item/weapon/storage/backpack/hydroponics name = "herbalist's backpack" desc = "It's a green backpack with many pockets to store plants and tools in." icon_state = "hydpack" - item_state = "hydpack" /obj/item/weapon/storage/backpack/genetics name = "geneticist backpack" desc = "It's a backpack fitted with slots for diskettes and other workplace tools." icon_state = "genpack" - item_state = "genpack" /obj/item/weapon/storage/backpack/virology name = "sterile backpack" desc = "It's a sterile backpack able to withstand different pathogens from entering its fabric." icon_state = "viropack" - item_state = "viropack" /obj/item/weapon/storage/backpack/chemistry name = "chemistry backpack" desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles." icon_state = "chempack" - item_state = "chempack" /* * Satchel Types @@ -184,13 +189,19 @@ name = "industrial satchel" desc = "A tough satchel with extra pockets." icon_state = "satchel-eng" - item_state = "engiepack" + item_state_slots = list( + slot_l_hand_str = "engiepack", + slot_r_hand_str = "engiepack", + ) /obj/item/weapon/storage/backpack/satchel_med name = "medical satchel" desc = "A sterile satchel used in medical departments." icon_state = "satchel-med" - item_state = "medicalpack" + item_state_slots = list( + slot_l_hand_str = "medicalpack", + slot_r_hand_str = "medicalpack", + ) /obj/item/weapon/storage/backpack/satchel_vir name = "virologist satchel" @@ -216,7 +227,10 @@ name = "security satchel" desc = "A robust satchel for security related needs." icon_state = "satchel-sec" - item_state = "securitypack" + item_state_slots = list( + slot_l_hand_str = "securitypack", + slot_r_hand_str = "securitypack", + ) /obj/item/weapon/storage/backpack/satchel_hyd name = "hydroponics satchel" @@ -228,13 +242,17 @@ desc = "An exclusive satchel for Nanotrasen officers." icon_state = "satchel-cap" item_state = "captainpack" + item_state_slots = null //ERT backpacks. /obj/item/weapon/storage/backpack/ert name = "emergency response team backpack" desc = "A spacious backpack with lots of pockets, used by members of the Nanotrasen Emergency Response Team." icon_state = "ert_commander" - item_state = "backpack" + item_state_slots = list( + slot_l_hand_str = "securitypack", + slot_r_hand_str = "securitypack", + ) //Commander /obj/item/weapon/storage/backpack/ert/commander diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 0ee5df08e0..52eaa4510d 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -162,7 +162,7 @@ usr.client.screen -= S S.dropped(usr) if(!S.amount) - del S + qdel(S) else S.loc = src @@ -207,7 +207,7 @@ N.amount = stacksize S.amount -= stacksize if(!S.amount) - del S // todo: there's probably something missing here + qdel(S) // todo: there's probably something missing here orient2hud(usr) if(usr.s_active) usr.s_active.show_to(usr) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 4c0c58a05a..f8be15d3e4 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -48,7 +48,7 @@ // Now make the cardboard user << "You fold [src] flat." new src.foldable(get_turf(src)) - del(src) + qdel(src) /obj/item/weapon/storage/box/survival/ New() @@ -243,6 +243,20 @@ new /obj/item/ammo_casing/shotgun/stunshell(src) new /obj/item/ammo_casing/shotgun/stunshell(src) +/obj/item/weapon/storage/box/practiceshells + name = "box of practice shells" + desc = "It has a picture of a gun and several warning symbols on the front.
        WARNING: Live ammunition. Misuse may result in serious injury or death." + + New() + ..() + new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/shotgun/practice(src) + /obj/item/weapon/storage/box/sniperammo name = "box of 14.5mm shells" desc = "It has a picture of a gun and several warning symbols on the front.
        WARNING: Live ammunition. Misuse may result in serious injury or death." diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 7af6e3b16e..4e0098eb97 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -146,8 +146,8 @@ new /obj/item/clothing/mask/smokable/cigarette(src) create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one -/obj/item/weapon/storage/fancy/cigarettes/Del() - del(reagents) +/obj/item/weapon/storage/fancy/cigarettes/Destroy() + qdel(reagents) ..() @@ -202,8 +202,8 @@ new /obj/item/clothing/mask/smokable/cigarette/cigar(src) create_reagents(15 * storage_slots) -/obj/item/weapon/storage/fancy/cigar/Del() - del(reagents) +/obj/item/weapon/storage/fancy/cigar/Destroy() + qdel(reagents) ..() /obj/item/weapon/storage/fancy/cigar/update_icon() diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 304c59fb98..7b2c03ba4a 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -131,6 +131,7 @@ /obj/item/weapon/storage/firstaid/surgery name = "surgery kit" desc = "Contains tools for surgery." + storage_slots = 10 /obj/item/weapon/storage/firstaid/surgery/New() ..() @@ -142,6 +143,9 @@ new /obj/item/weapon/retractor(src) new /obj/item/weapon/scalpel(src) new /obj/item/weapon/surgicaldrill(src) + new /obj/item/weapon/bonegel(src) + new /obj/item/weapon/FixOVein(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) return /* diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 5dda9b89c2..89f058ba47 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -9,6 +9,10 @@ name = master_item.name verbs -= /obj/item/verb/verb_pickup //make sure this is never picked up. ..() + +/obj/item/weapon/storage/internal/Destroy() + master_item = null + ..() /obj/item/weapon/storage/internal/attack_hand() return //make sure this is never picked up diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 495d4d7516..61786e10db 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -11,6 +11,7 @@ w_class = 3 var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) + var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set) var/max_storage_space = 14 //The sum of the storage costs of all the items in this storage item. var/storage_slots = 7 //The number of storage slots in this container. @@ -23,6 +24,12 @@ var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile var/use_sound = "rustle" //sound played when used. null for no sound. +/obj/item/weapon/storage/Destroy() + close_all() + qdel(boxes) + qdel(closer) + ..() + /obj/item/weapon/storage/MouseDrop(obj/over_object as obj) if(!canremove) @@ -30,7 +37,7 @@ if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why? return if(over_object == usr && Adjacent(usr)) // this must come before the screen objects only block @@ -44,18 +51,21 @@ //there's got to be a better way of doing this. if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) return - - if (!( usr.restrained() ) && !( usr.stat )) - switch(over_object.name) - if("r_hand") - usr.u_equip(src) - usr.put_in_r_hand(src) - if("l_hand") - usr.u_equip(src) - usr.put_in_l_hand(src) - src.add_fingerprint(usr) + + if (( usr.restrained() ) || ( usr.stat )) return - return + + if ((src.loc == usr) && !usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.u_equip(src) + usr.put_in_r_hand(src) + if("l_hand") + usr.u_equip(src) + usr.put_in_l_hand(src) + src.add_fingerprint(usr) /obj/item/weapon/storage/proc/return_inv() @@ -86,6 +96,7 @@ user.client.screen += src.closer user.client.screen += src.contents user.s_active = src + is_seeing |= user return /obj/item/weapon/storage/proc/hide_from(mob/user as mob) @@ -97,7 +108,7 @@ user.client.screen -= src.contents if(user.s_active == src) user.s_active = null - return + is_seeing -= user /obj/item/weapon/storage/proc/open(mob/user as mob) if (src.use_sound) @@ -109,11 +120,24 @@ show_to(user) /obj/item/weapon/storage/proc/close(mob/user as mob) - src.hide_from(user) user.s_active = null return +/obj/item/weapon/storage/proc/close_all() + for(var/mob/M in can_see_contents()) + close(M) + . = 1 + +/obj/item/weapon/storage/proc/can_see_contents() + var/list/cansee = list() + for(var/mob/M in is_seeing) + if(M.s_active == src && M.client) + cansee |= M + else + is_seeing -= M + return cansee + //This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right. //The numbers are calculated from the bottom-left The bottom-left slot being 1,1. /obj/item/weapon/storage/proc/orient_objs(tx, ty, mx, my) @@ -163,7 +187,7 @@ New(obj/item/sample as obj) if(!istype(sample)) - del(src) + qdel(src) sample_object = sample number = 1 @@ -463,4 +487,4 @@ return depth /obj/item/proc/get_storage_cost() - return 2**(w_class-1) //1,2,4,8,16,... + return 2**(w_class-1) //1,2,4,8,16,... diff --git a/code/game/objects/items/weapons/surgery_limbattachment.dm b/code/game/objects/items/weapons/surgery_limbattachment.dm index 23e5013f1a..b52bb1bb3f 100644 --- a/code/game/objects/items/weapons/surgery_limbattachment.dm +++ b/code/game/objects/items/weapons/surgery_limbattachment.dm @@ -65,7 +65,7 @@ H.update_body() M.updatehealth() M.UpdateDamageIcon() - del(src) + qdel(src) return 1 return 0 diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index e205f20bb0..a0af746ab4 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -44,7 +44,7 @@ D.open() if(istype(T,/turf/simulated/wall)) T.dismantle_wall(1) - del(src) + qdel(src) /*Detonator, disguised as a lighter*/ diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index 2dfc3f4730..79e512321e 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -20,7 +20,7 @@ if (istype(W, /obj/item/weapon/wrench)) for(var/material_type in stack_types) new material_type(get_turf(user)) - del(src) + qdel(src) return else if(alter_type && alter_with && istype(W,alter_with)) @@ -28,7 +28,7 @@ if (R.use(alter_cost)) var/obj/item/new_parts = new alter_type (get_turf(loc)) user << "You modify \the [name] into \a [new_parts]." - del(src) + qdel(src) else user << "You need at least [alter_cost] sheets to reinforce the [name]." return @@ -41,7 +41,7 @@ new build_type( user.loc ) user.drop_item() - del(src) + qdel(src) return /obj/item/weapon/table_parts/reinforced @@ -87,7 +87,7 @@ new /obj/item/stack/tile/carpet( get_turf(loc) ) new /obj/item/weapon/table_parts/wood( get_turf(loc) ) user << "You pry the carpet out of the table." - del(src) + qdel(src) ..() /obj/item/weapon/table_parts/rack diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 422af1d652..67b5f007a5 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -63,7 +63,7 @@ if(allgases >= 0.005) return 1 - del(G) + qdel(G) return /obj/item/weapon/tank/jetpack/ui_action_click() @@ -143,5 +143,5 @@ var/allgases = G.gas["carbon_dioxide"] + G.gas["nitrogen"] + G.gas["oxygen"] + G.gas["phoron"] if(allgases >= 0.005) return 1 - del(G) + qdel(G) return diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 04d32c49b2..f1cd0286ba 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -31,9 +31,9 @@ processing_objects.Add(src) return -/obj/item/weapon/tank/Del() +/obj/item/weapon/tank/Destroy() if(air_contents) - del(air_contents) + qdel(air_contents) processing_objects.Remove(src) @@ -71,12 +71,12 @@ if(prob(50)) var/turf/location = src.loc if (!( istype(location, /turf) )) - del(src) + qdel(src) if(src.air_contents) location.assume_air(air_contents) - del(src) + qdel(src) /obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -274,7 +274,7 @@ //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]" explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) - del(src) + qdel(src) else if(pressure > TANK_RUPTURE_PRESSURE) //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]" @@ -284,7 +284,7 @@ return T.assume_air(air_contents) playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) - del(src) + qdel(src) else integrity-- diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 477bce6b32..911a6334d2 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -58,7 +58,7 @@ user.put_in_hands(stuck) stuck = null overlays = null - del(src) + qdel(src) /obj/item/weapon/ducttape/afterattack(var/A, mob/user, flag, params) if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index bce7eabe9d..edf09f6ea8 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -112,10 +112,10 @@ name = "offhand" unwield() - del(src) + qdel(src) wield() - del(src) + qdel(src) /obj/item/weapon/twohanded/offhand/update_icon() return @@ -144,12 +144,12 @@ var/obj/structure/window/W = A new /obj/item/weapon/shard( W.loc ) - if(W.reinf) new /obj/item/stack/rods( W.loc) + if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc) if (W.dir == SOUTHWEST) new /obj/item/weapon/shard( W.loc ) - if(W.reinf) new /obj/item/stack/rods( W.loc) - del(A) + if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc) + qdel(A) /* diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 295fa0c67d..3cabb3f685 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -177,7 +177,7 @@ if(istype(W,/obj/item/weapon/screwdriver)) user << "You finish the concealed blade weapon." new /obj/item/weapon/butterfly(user.loc) - del(src) + qdel(src) return /obj/item/butterflyblade @@ -198,8 +198,8 @@ if(istype(W,/obj/item/butterflyblade)) user << "You attach the two concealed blade parts." new /obj/item/butterflyconstruction(user.loc) - del(W) - del(src) + qdel(W) + qdel(src) return update_icon(user) @@ -252,8 +252,8 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) user.put_in_hands(S) user << "You fasten the glass shard to the top of the rod with the cable." - del(I) - del(src) + qdel(I) + qdel(src) update_icon(user) else if(istype(I, /obj/item/weapon/wirecutters)) @@ -261,8 +261,8 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) user.put_in_hands(P) user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward." - del(I) - del(src) + qdel(I) + qdel(src) update_icon(user) update_icon(user) @@ -309,7 +309,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) /obj/item/weapon/energy_net/dropped() spawn(10) - if(src) del(src) + if(src) qdel(src) /obj/item/weapon/energy_net/throw_impact(atom/hit_atom) ..() @@ -317,7 +317,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) var/mob/living/M = hit_atom if(!istype(M) || locate(/obj/effect/energy_net) in M.loc) - del(src) + qdel(src) return 0 var/turf/T = get_turf(M) @@ -327,11 +327,11 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) M.captured = 1 net.affecting = M T.visible_message("[M] was caught in an energy net!") - del(src) + qdel(src) // If we miss or hit an obstacle, we still want to delete the net. spawn(10) - if(src) del(src) + if(src) qdel(src) /obj/effect/energy_net name = "energy net" @@ -356,7 +356,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) ..() processing_objects |= src -/obj/effect/energy_net/Del() +/obj/effect/energy_net/Destroy() if(affecting) var/mob/living/carbon/M = affecting @@ -372,13 +372,13 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) if(health <=0) density = 0 src.visible_message("The energy net is torn apart!") - del(src) + qdel(src) return /obj/effect/energy_net/process() if(isnull(affecting) || affecting.loc != loc) - del(src) + qdel(src) return // Countdown begin set to -1 will stop the teleporter from firing. @@ -411,7 +411,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob) playsound(affecting.loc, 'sound/effects/sparks2.ogg', 50, 1) anim(affecting.loc,affecting,'icons/mob/mob.dmi',,"phasein",,affecting.dir) - del(src) + qdel(src) /obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj) health -= Proj.damage diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index f1c786d3e1..74d119f417 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -22,7 +22,7 @@ user << "\red That was stupid of you." explosion(get_turf(src),-1,0,2) if(src) - del(src) + qdel(src) return else if(T.welding) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 51cb54ea2d..fc6ef5b99d 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -16,15 +16,14 @@ var/damtype = "brute" var/force = 0 -/obj/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/custom_state = default_state) +/obj/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state) // Calling Topic without a corresponding window open causes runtime errors if(!nowindow && ..()) return 1 // In the far future no checks are made in an overriding Topic() beyond if(..()) return // Instead any such checks are made in CanUseTopic() - var/obj/host = nano_host() - if(host.CanUseTopic(usr, href_list, custom_state) == STATUS_INTERACTIVE) + if(CanUseTopic(usr, state, href_list) == STATUS_INTERACTIVE) CouldUseTopic(usr) return 0 @@ -62,9 +61,6 @@ else return null -/atom/movable/proc/initialize() - return - /obj/proc/updateUsrDialog() if(in_use) var/is_in_use = 0 diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 7508d34a94..de73e5e7b3 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -11,7 +11,7 @@ ..() if (!prob(spawn_nothing_percentage)) spawn_item() - del src + qdel(src) // this function should return a specific item to spawn diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 900baea3f3..a37ccd6c65 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -4,12 +4,14 @@ var/climbable var/breakable var/parts + var/list/climbers = list() -/obj/structure/proc/destroy() +/obj/structure/Destroy() + if(opacity) + UpdateAffectingLights() if(parts) new parts(loc) - density = 0 - del(src) + ..() /obj/structure/attack_hand(mob/user) if(breakable) @@ -20,14 +22,20 @@ var/mob/living/carbon/human/H = user if(H.species.can_shred(user)) attack_generic(user,1,"slices") + + if(climbers.len && !(user in climbers)) + user.visible_message("[user.name] shakes \the [src].", \ + "You shake \the [src].") + structure_shaken() + return ..() /obj/structure/blob_act() if(prob(50)) - del(src) + qdel(src) /obj/structure/meteorhit(obj/O as obj) - destroy(src) + qdel(src) /obj/structure/attack_tk() return @@ -35,24 +43,24 @@ /obj/structure/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if(prob(50)) - del(src) + qdel(src) return if(3.0) return /obj/structure/meteorhit(obj/O as obj) - del(src) + qdel(src) /obj/structure/New() ..() if(climbable) verbs += /obj/structure/proc/climb_on -/obj/structure/Del() +/obj/structure/Destroy() ..() /obj/structure/proc/climb_on() @@ -73,7 +81,7 @@ return ..() /obj/structure/proc/can_climb(var/mob/living/user) - if (!can_touch(user) || !climbable) + if (!can_touch(user) || !climbable || (user in climbers)) return 0 if (!user.Adjacent(src)) @@ -103,25 +111,32 @@ return usr.visible_message("[user] starts climbing onto \the [src]!") + climbers |= user if(!do_after(user,50)) + climbers -= user return if (!can_climb(user)) + climbers -= user return usr.forceMove(get_turf(src)) if (get_turf(user) == get_turf(src)) usr.visible_message("[user] climbs onto \the [src]!") + climbers -= user /obj/structure/proc/structure_shaken() + for(var/mob/living/M in climbers) + M.Weaken(1) + M << "You topple as you are shaken off \the [src]!" + climbers.Cut(1,2) for(var/mob/living/M in get_turf(src)) - if(M.lying) return //No spamming this on people. - M.Weaken(5) + M.Weaken(3) M << "You topple as \the [src] moves under you!" if(prob(25)) @@ -179,5 +194,5 @@ if(!breakable || !damage || !wallbreaker) return 0 visible_message("[user] [attack_verb] the [src] apart!") - spawn(1) destroy() + spawn(1) qdel(src) return 1 diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index 68681f081a..fd0687dc97 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -2,8 +2,9 @@ icon = 'icons/obj/barsigns.dmi' icon_state = "empty" anchored = 1 + var/cult = 0 New() - ChangeSign(pick("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead", "whiskeyimplant", "carpecarp", "robustroadhouse", "greytide", "theredshirt")) + ChangeSign(pick("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead", "whiskeyimplant", "carpecarp", "robustroadhouse", "greytide", "theredshirt","thebark","theharmbaton","theharmedbaton","thesingulo","thedrukcarp","thedrunkcarp", "scotch","officerbeersky","on")) return proc/ChangeSign(var/Text) src.icon_state = "[Text]" @@ -12,10 +13,13 @@ return /obj/structure/sign/double/barsign/attackby(obj/item/I, mob/user) + if(cult) + return + if(istype(I, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/card = I if(access_bar in card.GetAccess()) - var/sign_type = input(user, "What would you like to change the barsign to?") as null|anything in list("Off", "Pink Flamingo", "Magma Sea", "Limbo", "Rusty Axe", "Armok Bar", "Broken Drum", "Mead Bay", "The Damn Wall", "The Cavern", "Cindi Kate", "The Orchard", "The Saucy Clown", "The Clowns Head", "Whiskey Implant", "Carpe Carp", "Robust Roadhouse", "Greytide", "The Redshirt") + var/sign_type = input(user, "What would you like to change the barsign to?") as null|anything in list("Off", "Pink Flamingo", "Magma Sea", "Limbo", "Rusty Axe", "Armok Bar", "Broken Drum", "Mead Bay", "The Damn Wall", "The Cavern", "Cindi Kate", "The Orchard", "The Saucy Clown", "The Clowns Head", "Whiskey Implant", "Carpe Carp", "Robust Roadhouse", "Greytide", "The Redshirt", "The Bark", "The Harm Baton", "The Harmed Baton", "The Singulo", "The Druk Carp", "The Drunk Carp", "Scotch", "Officer Beersky", "On") if(sign_type == null) return else diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index d838d41e5b..64f1f9925b 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -15,8 +15,6 @@ LINEN BINS throw_speed = 1 throw_range = 2 w_class = 2.0 - item_color = "white" - /obj/item/weapon/bedsheet/attack_self(mob/user as mob) user.drop_item() @@ -30,67 +28,51 @@ LINEN BINS /obj/item/weapon/bedsheet/blue icon_state = "sheetblue" - item_color = "blue" /obj/item/weapon/bedsheet/green icon_state = "sheetgreen" - item_color = "green" /obj/item/weapon/bedsheet/orange icon_state = "sheetorange" - item_color = "orange" /obj/item/weapon/bedsheet/purple icon_state = "sheetpurple" - item_color = "purple" /obj/item/weapon/bedsheet/rainbow icon_state = "sheetrainbow" - item_color = "rainbow" /obj/item/weapon/bedsheet/red icon_state = "sheetred" - item_color = "red" /obj/item/weapon/bedsheet/yellow icon_state = "sheetyellow" - item_color = "yellow" /obj/item/weapon/bedsheet/mime icon_state = "sheetmime" - item_color = "mime" /obj/item/weapon/bedsheet/clown icon_state = "sheetclown" - item_color = "clown" /obj/item/weapon/bedsheet/captain icon_state = "sheetcaptain" - item_color = "captain" /obj/item/weapon/bedsheet/rd icon_state = "sheetrd" - item_color = "director" /obj/item/weapon/bedsheet/medical icon_state = "sheetmedical" - item_color = "medical" /obj/item/weapon/bedsheet/hos icon_state = "sheethos" - item_color = "hosred" /obj/item/weapon/bedsheet/hop icon_state = "sheethop" - item_color = "hop" /obj/item/weapon/bedsheet/ce icon_state = "sheetce" - item_color = "chief" /obj/item/weapon/bedsheet/brown icon_state = "sheetbrown" - item_color = "brown" /obj/structure/bedsheetbin diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 40163e7c78..5e1a551cec 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -10,7 +10,7 @@ var/welded = 0 var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 - var/lastbang + var/breakout = 0 //if someone is currently breaking out. mutex var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate //then open it in a populated area to crash clients. var/open_sound = 'sound/machines/click.ogg' @@ -146,30 +146,33 @@ for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion A.loc = src.loc A.ex_act(severity++) - del(src) + qdel(src) if(2) if(prob(50)) for (var/atom/movable/A as mob|obj in src) A.loc = src.loc A.ex_act(severity++) - del(src) + qdel(src) if(3) if(prob(5)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc A.ex_act(severity++) - del(src) + qdel(src) + +/obj/structure/closet/proc/damage(var/damage) + health -= damage + if(health <= 0) + for(var/atom/movable/A in src) + A.loc = src.loc + qdel(src) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) return - health -= Proj.damage ..() - if(health <= 0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - del(src) + damage(Proj.damage) return @@ -178,14 +181,14 @@ if(prob(75)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc - del(src) + qdel(src) /obj/structure/closet/meteorhit(obj/O as obj) if(O.icon_state == "flaming") for(var/mob/M in src) M.meteorhit(O) src.dump_contents() - del(src) + qdel(src) /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) if(src.opened) @@ -202,7 +205,7 @@ new /obj/item/stack/sheet/metal(src.loc) for(var/mob/M in viewers(src)) M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) - del(src) + qdel(src) return if(isrobot(user)) return @@ -249,18 +252,16 @@ src.add_fingerprint(user) return +/obj/structure/closet/attack_ai(mob/user) + if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Robots can open/close it, but not the AI. + attack_hand(user) + /obj/structure/closet/relaymove(mob/user as mob) if(user.stat || !isturf(src.loc)) return if(!src.open()) user << "It won't budge!" - if(!lastbang) - lastbang = 1 - for (var/mob/M in hearers(src, null)) - M << text("BANG, bang!", max(0, 5 - get_dist(src, M))) - spawn(30) - lastbang = 0 /obj/structure/closet/attack_hand(mob/user as mob) src.add_fingerprint(user) @@ -306,5 +307,66 @@ return visible_message("[user] [attack_message] the [src]!") dump_contents() - spawn(1) del(src) + spawn(1) qdel(src) return 1 + +/obj/structure/closet/proc/req_breakout() + if(breakout) + return 0 //Already breaking out. + if(opened) + return 0 //Door's open... wait, why are you in it's contents then? + if(!welded) + return 0 //closed but not welded... + return 1 + +/obj/structure/closet/proc/mob_breakout(var/mob/living/escapee) + var/breakout_time = 2 //2 minutes by default + + if(!req_breakout()) + return + + //okay, so the closet is either welded or locked... resist!!! + escapee.next_move = world.time + 100 + escapee.last_special = world.time + 100 + escapee << "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" + + visible_message("The [src] begins to shake violently!") + + breakout = 1 //can't think of a better way to do this right now. + for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2 + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + animate_shake() + + if(!do_after(escapee, 50)) //5 seconds + breakout = 0 + return + if(!escapee || escapee.stat || escapee.loc != src) + breakout = 0 + return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened + //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... + if(!req_breakout()) + breakout = 0 + return + + //Well then break it! + breakout = 0 + escapee << "You successfully break out!" + visible_message("\the [escapee] successfully broke out of \the [src]!") + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + break_open() + animate_shake() + +/obj/structure/closet/proc/break_open() + welded = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() + +/obj/structure/closet/proc/animate_shake() + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index bb5fe26e4f..294ee43725 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -18,6 +18,7 @@ /obj/structure/closet/l3closet/general/New() ..() + qdel(contents) contents = list() new /obj/item/clothing/suit/bio_suit/general( src ) new /obj/item/clothing/head/bio_hood/general( src ) @@ -30,6 +31,7 @@ /obj/structure/closet/l3closet/virology/New() ..() + qdel(contents) contents = list() new /obj/item/clothing/suit/bio_suit/virology( src ) new /obj/item/clothing/head/bio_hood/virology( src ) @@ -44,6 +46,7 @@ /obj/structure/closet/l3closet/security/New() ..() + qdel(contents) contents = list() new /obj/item/clothing/suit/bio_suit/security( src ) new /obj/item/clothing/head/bio_hood/security( src ) @@ -56,6 +59,7 @@ /obj/structure/closet/l3closet/janitor/New() ..() + qdel(contents) contents = list() new /obj/item/clothing/suit/bio_suit/janitor( src ) new /obj/item/clothing/head/bio_hood/janitor( src ) @@ -68,6 +72,7 @@ /obj/structure/closet/l3closet/scientist/New() ..() + qdel(contents) contents = list() new /obj/item/clothing/suit/bio_suit/scientist( src ) new /obj/item/clothing/head/bio_hood/scientist( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 0513efd943..0722b5b077 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -19,7 +19,7 @@ New() ..() for(var/i = 0, i < 6, i++) - new /obj/item/weapon/reagent_containers/food/snacks/flour(src) + new /obj/item/weapon/reagent_containers/food/condiment/flour(src) new /obj/item/weapon/reagent_containers/food/condiment/sugar(src) for(var/i = 0, i < 3, i++) new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index 43d440c9f2..019d4873bc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -24,5 +24,6 @@ new /obj/item/weapon/minihoe(src) new /obj/item/weapon/hatchet(src) new /obj/item/weapon/wirecutters/clippers(src) + new /obj/item/weapon/reagent_containers/spray/plantbgone(src) // new /obj/item/weapon/bee_net(src) //No more bees, March 2014 return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index 8fc77c5b92..2534c09caa 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -23,7 +23,7 @@ spawn(4) // Not really the best way to do this, but it's better than "contents = list()"! for(var/atom/movable/AM in contents) - del(AM) + qdel(AM) new /obj/item/clothing/under/color/white( src ) new /obj/item/clothing/shoes/white( src ) return @@ -55,7 +55,7 @@ spawn(4) // Not really the best way to do this, but it's better than "contents = list()"! for(var/atom/movable/AM in contents) - del(AM) + qdel(AM) new /obj/item/weapon/storage/backpack/satchel/withwallet( src ) new /obj/item/device/radio/headset( src ) return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index a3b9f39928..df2985c42e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -132,3 +132,25 @@ overlays += "welded" else icon_state = icon_opened + + +/obj/structure/closet/secure_closet/req_breakout() + if(!opened && locked) return 1 + return ..() //It's a secure closet, but isn't locked. + +/obj/structure/closet/secure_closet/break_open() + desc += " It appears to be broken." + icon_state = icon_off + spawn() + flick(icon_broken, src) + sleep(10) + flick(icon_broken, src) + sleep(10) + broken = 1 + locked = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm new file mode 100644 index 0000000000..67a159e7ca --- /dev/null +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -0,0 +1,133 @@ +/obj/structure/closet/statue + name = "statue" + desc = "An incredibly lifelike marble carving" + icon = 'icons/obj/statue.dmi' + icon_state = "human_male" + density = 1 + anchored = 1 + health = 0 //destroying the statue kills the mob within + var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock + var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils. + var/intialBrute = 0 + var/intialOxy = 0 + var/timer = 240 //eventually the person will be freed + +/obj/structure/closet/statue/New(loc, var/mob/living/L) + if(L && (ishuman(L) || L.isMonkey() || iscorgi(L))) + if(L.buckled) + L.buckled = 0 + L.anchored = 0 + if(L.client) + L.client.perspective = EYE_PERSPECTIVE + L.client.eye = src + L.loc = src + L.sdisabilities |= MUTE + health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues + intialTox = L.getToxLoss() + intialFire = L.getFireLoss() + intialBrute = L.getBruteLoss() + intialOxy = L.getOxyLoss() + if(ishuman(L)) + name = "statue of [L.name]" + if(L.gender == "female") + icon_state = "human_female" + else if(L.isMonkey()) + name = "statue of a monkey" + icon_state = "monkey" + else if(iscorgi(L)) + name = "statue of a corgi" + icon_state = "corgi" + desc = "If it takes forever, I will wait for you..." + + if(health == 0) //meaning if the statue didn't find a valid target + qdel(src) + return + + processing_objects.Add(src) + ..() + +/obj/structure/closet/statue/process() + timer-- + for(var/mob/living/M in src) //Go-go gadget stasis field + M.setToxLoss(intialTox) + M.adjustFireLoss(intialFire - M.getFireLoss()) + M.adjustBruteLoss(intialBrute - M.getBruteLoss()) + M.setOxyLoss(intialOxy) + if (timer <= 0) + dump_contents() + processing_objects.Remove(src) + qdel(src) + +/obj/structure/closet/statue/dump_contents() + + for(var/obj/O in src) + O.loc = src.loc + + for(var/mob/living/M in src) + M.loc = src.loc + M.sdisabilities &= ~MUTE + M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob + if(M.client) + M.client.eye = M.client.mob + M.client.perspective = MOB_PERSPECTIVE + +/obj/structure/closet/statue/open() + return + +/obj/structure/closet/statue/close() + return + +/obj/structure/closet/statue/toggle() + return + +/obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + if(health <= 0) + for(var/mob/M in src) + shatter(M) + + return + +/obj/structure/closet/statue/attack_generic(var/mob/user, damage, attacktext, environment_smash) + if(damage && environment_smash) + for(var/mob/M in src) + shatter(M) + +/obj/structure/closet/statue/blob_act() + for(var/mob/M in src) + shatter(M) + +/obj/structure/closet/statue/meteorhit(obj/O as obj) + if(O.icon_state == "flaming") + for(var/mob/M in src) + M.meteorhit(O) + shatter(M) + +/obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob) + health -= I.force + visible_message("[user] strikes [src] with [I].") + if(health <= 0) + for(var/mob/M in src) + shatter(M) + +/obj/structure/closet/statue/MouseDrop_T() + return + +/obj/structure/closet/statue/relaymove() + return + +/obj/structure/closet/statue/attack_hand() + return + +/obj/structure/closet/statue/verb_toggleopen() + return + +/obj/structure/closet/statue/update_icon() + return + +/obj/structure/closet/statue/proc/shatter(mob/user as mob) + if (user) + user.dust() + dump_contents() + visible_message("[src] shatters!.") + qdel(src) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index c274a237b6..31f8115b91 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -56,12 +56,12 @@ // teehee - Ah, tg coders... if ("delete") - del(src) + qdel(src) //If you want to re-add fire, just add "fire" = 15 to the pick list. /*if ("fire") new /obj/structure/closet/firecloset(src.loc) - del(src)*/ + qdel(src)*/ /obj/structure/closet/emcloset/legacy/New() ..() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 917d244afa..95e8c06e85 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -105,18 +105,18 @@ switch(severity) if(1.0) for(var/obj/O in src.contents) - del(O) - del(src) + qdel(O) + qdel(src) return if(2.0) for(var/obj/O in src.contents) if(prob(50)) - del(O) - del(src) + qdel(O) + qdel(src) return if(3.0) if (prob(50)) - del(src) + qdel(src) return else return diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index d2b1f56eb3..5419ee2639 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -18,7 +18,7 @@ user.visible_message("[user] pries \the [src] open.", \ "You pry open \the [src].", \ "You hear splitting wood.") - del(src) + qdel(src) else return attack_hand(user) diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index 741dc371db..5fd82b27f0 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -1,20 +1,23 @@ +#define SHOWER_OPEN_LAYER MOB_LAYER + 0.1 +#define SHOWER_CLOSED_LAYER OBJ_LAYER + 0.4 + /obj/structure/curtain name = "curtain" icon = 'icons/obj/curtain.dmi' icon_state = "closed" - layer = MOB_LAYER + 0.1 + layer = SHOWER_OPEN_LAYER opacity = 1 density = 0 /obj/structure/curtain/open icon_state = "open" - layer = OBJ_LAYER + layer = SHOWER_CLOSED_LAYER opacity = 0 /obj/structure/curtain/bullet_act(obj/item/projectile/P, def_zone) if(!P.nodamage) visible_message("[P] tears [src] down!") - del(src) + qdel(src) else ..(P, def_zone) @@ -27,10 +30,10 @@ opacity = !opacity if(opacity) icon_state = "closed" - layer = MOB_LAYER + 0.1 + layer = SHOWER_CLOSED_LAYER else icon_state = "open" - layer = OBJ_LAYER + layer = SHOWER_OPEN_LAYER /obj/structure/curtain/black name = "black curtain" @@ -45,3 +48,12 @@ name = "shower curtain" color = "#ACD1E9" alpha = 200 + +/obj/structure/curtain/open/shower/engineering + color = "#FFA500" + +/obj/structure/curtain/open/shower/security + color = "#AA0000" + +#undef SHOWER_OPEN_LAYER +#undef SHOWER_CLOSED_LAYER diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 4eb2236ec0..5150319f15 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -17,7 +17,7 @@ if (occupied) new /obj/item/weapon/gun/energy/captain( src.loc ) occupied = 0 - del(src) + qdel(src) if (2) if (prob(50)) src.health -= 15 @@ -41,13 +41,13 @@ if (occupied) new /obj/item/weapon/gun/energy/captain( src.loc ) occupied = 0 - del(src) + qdel(src) /obj/structure/displaycase/meteorhit(obj/O as obj) new /obj/item/weapon/shard( src.loc ) new /obj/item/weapon/gun/energy/captain( src.loc ) - del(src) + qdel(src) /obj/structure/displaycase/proc/healthcheck() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 1b92926acd..a15650405e 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -166,7 +166,7 @@ if(!src || !WT.isOn()) return user << "\blue You dissasembled the airlock assembly!" new /obj/item/stack/sheet/metal(src.loc, 4) - del (src) + qdel (src) else user << "\blue You need more welding fuel." return @@ -277,7 +277,7 @@ var/obj/machinery/door/new_airlock = new path(src.loc, src) new_airlock.dir = src.dir - del(src) + qdel(src) else ..() update_state() diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 074d7c7618..2608a311e3 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -19,7 +19,7 @@ part.loc = loc part.master = null part = null - del(src) + qdel(src) return return diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index f68c7ae7cb..186f1debac 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -13,7 +13,7 @@ relativewall_neighbours() ..() -/obj/structure/falsewall/Del() +/obj/structure/falsewall/Destroy() var/temploc = src.loc @@ -98,7 +98,7 @@ T.ChangeTurf(/turf/simulated/wall) else T.ChangeTurf(text2path("/turf/simulated/wall/mineral/[mineral]")) - del(src) + qdel(src) if( istype(W, /obj/item/weapon/weldingtool) ) var/obj/item/weapon/weldingtool/WT = W @@ -110,7 +110,7 @@ if(mineral != "phoron")//Stupid shit keeps me from pushing the attackby() to phoron walls -Sieve T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) else user << "\blue You can't reach, close it first!" @@ -123,7 +123,7 @@ if(mineral != "phoron") T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) //DRILLING else if (istype(W, /obj/item/weapon/pickaxe/diamonddrill)) @@ -134,7 +134,7 @@ T.ChangeTurf(text2path("/turf/simulated/wall/mineral/[mineral]")) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) else if( istype(W, /obj/item/weapon/melee/energy/blade) ) var/turf/T = get_turf(src) @@ -145,7 +145,7 @@ if(mineral != "phoron") T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) /obj/structure/falsewall/update_icon()//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open ..() @@ -232,7 +232,7 @@ var/turf/T = get_turf(src) user.visible_message("[user] tightens some bolts on the r wall.", "You tighten the bolts on the wall.") T.ChangeTurf(/turf/simulated/wall) //Intentionally makes a regular wall instead of an r-wall (no cheap r-walls for you). - del(src) + qdel(src) if( istype(W, /obj/item/weapon/weldingtool) ) var/obj/item/weapon/weldingtool/WT = W @@ -241,14 +241,14 @@ T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) else if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) ) var/turf/T = get_turf(src) T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) //DRILLING else if (istype(W, /obj/item/weapon/pickaxe/diamonddrill)) @@ -256,14 +256,14 @@ T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) else if( istype(W, /obj/item/weapon/melee/energy/blade) ) var/turf/T = get_turf(src) T.ChangeTurf(/turf/simulated/wall) T = get_turf(src) T.attackby(W,user) - del(src) + qdel(src) /* diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 85415cd162..8c53135528 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -31,7 +31,7 @@ ..() if(health <= 0) new /obj/item/stack/sheet/metal(get_turf(src)) - del(src) + qdel(src) return @@ -50,7 +50,7 @@ if(get_turf(user, 40)) user << "\blue You secured the girder!" new/obj/structure/girder( src.loc ) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) user << "\blue Now slicing apart the girder" @@ -78,7 +78,7 @@ if(!src) return user << "\blue You removed the support struts!" new/obj/structure/girder( src.loc ) - del(src) + qdel(src) else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) @@ -87,7 +87,7 @@ if(!src) return user << "\blue You dislodged the girder!" new/obj/structure/girder/displaced( src.loc ) - del(src) + qdel(src) else if(istype(W, /obj/item/stack/sheet)) @@ -99,7 +99,7 @@ if(S.use(2)) user << "You create a false wall! Push on it to open or close the passage." new /obj/structure/falsewall (src.loc) - del(src) + qdel(src) else if(S.get_amount() < 2) return ..() user << "Now adding plating..." @@ -110,15 +110,15 @@ Tsrc.ChangeTurf(/turf/simulated/wall) for(var/turf/simulated/wall/X in Tsrc.loc) if(X) X.add_hiddenprint(usr) - del(src) + qdel(src) return - if(/obj/item/stack/sheet/plasteel) + if(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/plasteel/cyborg) if(!anchored) if(S.use(2)) user << "\blue You create a false wall! Push on it to open or close the passage." new /obj/structure/falserwall (src.loc) - del(src) + qdel(src) else if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... if(S.get_amount() < 1) return ..() @@ -130,7 +130,7 @@ Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) if(X) X.add_hiddenprint(usr) - del(src) + qdel(src) return else if(S.get_amount() < 1) return ..() @@ -139,7 +139,7 @@ if(S.use(1)) user << "Girders reinforced!" new/obj/structure/girder/reinforced( src.loc ) - del(src) + qdel(src) return if(S.sheettype) @@ -154,7 +154,7 @@ user << "\blue You create a false wall! Push on it to open or close the passage." var/F = text2path("/obj/structure/falsewall/[M]") new F (src.loc) - del(src) + qdel(src) else if(S.amount < 2) return ..() user << "\blue Now adding plating..." @@ -166,7 +166,7 @@ Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) for(var/turf/simulated/wall/mineral/X in Tsrc.loc) if(X) X.add_hiddenprint(usr) - del(src) + qdel(src) return add_hiddenprint(usr) @@ -182,7 +182,7 @@ /obj/structure/girder/proc/dismantle() new /obj/item/stack/sheet/metal(get_turf(src)) - del(src) + qdel(src) /obj/structure/girder/attack_hand(mob/user as mob) if (HULK in user.mutations) @@ -193,25 +193,25 @@ /obj/structure/girder/blob_act() if(prob(40)) - del(src) + qdel(src) /obj/structure/girder/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(30)) var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) new remains(loc) - del(src) + qdel(src) return if(3.0) if (prob(5)) var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal) new remains(loc) - del(src) + qdel(src) return else return @@ -246,7 +246,7 @@ /obj/structure/cultgirder/proc/dismantle() new /obj/effect/decal/remains/human(get_turf(src)) - del(src) + qdel(src) /obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) @@ -289,7 +289,7 @@ /obj/structure/cultgirder/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(30)) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index b6407fd376..b18658d4a6 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -8,20 +8,25 @@ flags = CONDUCT pressure_resistance = 5*ONE_ATMOSPHERE layer = 2.9 - explosion_resistance = 5 + explosion_resistance = 1 var/health = 10 var/destroyed = 0 /obj/structure/grille/ex_act(severity) - del(src) + qdel(src) /obj/structure/grille/blob_act() - del(src) + qdel(src) /obj/structure/grille/meteorhit(var/obj/M) - del(src) + qdel(src) +/obj/structure/grille/update_icon() + if(destroyed) + icon_state = "[initial(icon_state)]-b" + else + icon_state = initial(icon_state) /obj/structure/grille/Bumped(atom/user) if(ismob(user)) shock(user, 70) @@ -98,8 +103,8 @@ if(iswirecutter(W)) if(!shock(user, 100)) playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) - new /obj/item/stack/rods(loc, 2) - del(src) + PoolOrNew(/obj/item/stack/rods, list(get_turf(src), destroyed ? 1 : 2)) + qdel(src) else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored)) if(!shock(user, 90)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) @@ -165,15 +170,15 @@ /obj/structure/grille/proc/healthcheck() if(health <= 0) if(!destroyed) - icon_state = "brokengrille" density = 0 destroyed = 1 - new /obj/item/stack/rods(loc) + update_icon() + PoolOrNew(/obj/item/stack/rods, get_turf(src)) else if(health <= -6) - new /obj/item/stack/rods(loc) - del(src) + PoolOrNew(/obj/item/stack/rods, get_turf(src)) + qdel(src) return return @@ -215,3 +220,24 @@ health -= damage spawn(1) healthcheck() return 1 + +// Used in mapping to avoid +/obj/structure/grille/broken + destroyed = 1 + icon_state = "grille-b" + density = 0 + New() + ..() + health = rand(-5, -1) //In the destroyed but not utterly threshold. + healthcheck() //Send this to healthcheck just in case we want to do something else with it. + +/obj/structure/grille/cult + name = "cult grille" + desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it" + icon_state = "grillecult" + health = 40 //Make it strong enough to avoid people breaking in too easily + +/obj/structure/grille/cult/CanPass(atom/movable/mover, turf/target, height = 1.5, air_group = 0) + if(air_group) + return 0 //Make sure air doesn't drain + ..() diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 4bbb01a9c5..a9b1359b75 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -11,7 +11,7 @@ var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc) src.transfer_fingerprints_to(R) R.add_fingerprint(user) - del(src) + qdel(src) /obj/structure/inflatable name = "inflatable wall" @@ -30,7 +30,7 @@ ..() update_nearby_tiles(need_rebuild=1) -/obj/structure/inflatable/Del() +/obj/structure/inflatable/Destroy() update_nearby_tiles() ..() @@ -50,7 +50,7 @@ /obj/structure/inflatable/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) deflate(1) @@ -94,14 +94,14 @@ visible_message("[src] rapidly deflates!") var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc) src.transfer_fingerprints_to(R) - del(src) + qdel(src) else //user << "\blue You slowly deflate the inflatable wall." visible_message("[src] slowly deflates.") spawn(50) var/obj/item/inflatable/R = new /obj/item/inflatable(loc) src.transfer_fingerprints_to(R) - del(src) + qdel(src) /obj/structure/inflatable/verb/hand_deflate() set name = "Deflate" @@ -134,7 +134,7 @@ var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc) src.transfer_fingerprints_to(R) R.add_fingerprint(user) - del(src) + qdel(src) /obj/structure/inflatable/door //Based on mineral door code name = "inflatable door" @@ -219,13 +219,13 @@ visible_message("[src] rapidly deflates!") var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) src.transfer_fingerprints_to(R) - del(src) + qdel(src) else visible_message("[src] slowly deflates.") spawn(50) var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc) src.transfer_fingerprints_to(R) - del(src) + qdel(src) /obj/item/inflatable/torn name = "torn inflatable wall" diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index de2fef2875..e865805991 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -20,8 +20,8 @@ else if(spike(G.affecting)) visible_message("[user] has forced [G.affecting] onto the spike, killing them instantly!") - del(G.affecting) - del(G) + qdel(G.affecting) + qdel(G) else user << "They are too big for the spike, try something smaller!" diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 6bbb8cfa24..3c32052d72 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -15,7 +15,7 @@ if (1) new /obj/item/weapon/shard( src.loc ) Break() - del(src) + qdel(src) if (2) if (prob(50)) src.health -= 15 @@ -37,13 +37,13 @@ if (prob(75)) new /obj/item/weapon/shard( src.loc ) Break() - del(src) + qdel(src) /obj/structure/lamarr/meteorhit(obj/O as obj) new /obj/item/weapon/shard( src.loc ) Break() - del(src) + qdel(src) /obj/structure/lamarr/proc/healthcheck() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index a32af450d5..078f4bc06b 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -13,10 +13,10 @@ ///// Z-Level Stuff if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/floor/open))) ///// Z-Level Stuff - del(src) + qdel(src) for(var/obj/structure/lattice/LAT in src.loc) if(LAT != src) - del(LAT) + qdel(LAT) icon = 'icons/obj/smoothlattice.dmi' icon_state = "latticeblank" updateOverlays() @@ -26,7 +26,7 @@ L = locate(/obj/structure/lattice, get_step(src, dir)) L.updateOverlays() -/obj/structure/lattice/Del() +/obj/structure/lattice/Destroy() for (var/dir in cardinal) var/obj/structure/lattice/L if(locate(/obj/structure/lattice, get_step(src, dir))) @@ -35,16 +35,16 @@ ..() /obj/structure/lattice/blob_act() - del(src) + qdel(src) return /obj/structure/lattice/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) - del(src) + qdel(src) return if(3.0) return @@ -61,14 +61,14 @@ var/obj/item/weapon/weldingtool/WT = C if(WT.remove_fuel(0, user)) user << "\blue Slicing lattice joints ..." - new /obj/item/stack/rods(src.loc) - del(src) + PoolOrNew(/obj/item/stack/rods, src.loc) + qdel(src) return /obj/structure/lattice/proc/updateOverlays() //if(!(istype(src.loc, /turf/space))) - // del(src) + // qdel(src) spawn(1) overlays = list() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 8ce25ddb67..d0a60d2a3e 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -22,7 +22,7 @@ name = "[mineralType] door" update_nearby_tiles(need_rebuild=1) - Del() + Destroy() update_nearby_tiles() ..() @@ -137,7 +137,7 @@ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]") for(var/i = 3, i <= oreAmount, i++) new ore(get_turf(src)) - del(src) + qdel(src) ex_act(severity = 1) switch(severity) @@ -239,7 +239,7 @@ if(!devastated) for(var/i = 1, i <= oreAmount, i++) new/obj/item/stack/sheet/wood(get_turf(src)) - del(src) + qdel(src) /obj/structure/mineral_door/resin mineralType = "resin" @@ -279,7 +279,7 @@ isSwitchingStates = 0 Dismantle(devastated = 0) - del(src) + qdel(src) CheckHardness() playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 83f295f9ef..4868f6e0ca 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -80,16 +80,16 @@ var/mob/living/carbon/human/vox/vox = new(get_turf(src),"Vox") vox.gender = user.gender raiders.equip(vox) + new /obj/item/organ/stack/vox(vox) if(user.mind) user.mind.transfer_to(vox) spawn(1) - var/newname = input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text - newname = sanitize(newname) + var/newname = sanitizeSafe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) if(!newname || newname == "") var/datum/language/L = all_languages[vox.species.default_language] newname = L.get_random_name() vox.real_name = newname vox.name = vox.real_name raiders.update_access(vox) - del(user) + qdel(user) ..() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 1f597b0c96..599e8aabc8 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -36,21 +36,21 @@ for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(2.0) if (prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(3.0) if (prob(5)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return return @@ -64,7 +64,7 @@ A.loc = src playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) //src.connected = null - del(src.connected) + qdel(src.connected) else playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) src.connected = new /obj/structure/m_tray( src.loc ) @@ -80,7 +80,7 @@ src.connected.set_dir(src.dir) else //src.connected = null - del(src.connected) + qdel(src.connected) src.add_fingerprint(user) update() return @@ -92,7 +92,7 @@ return if ((!in_range(src, usr) && src.loc != user)) return - t = sanitize(t) + t = sanitizeSafe(t, MAX_NAME_LEN) if (t) src.name = text("Morgue- '[]'", t) else @@ -116,7 +116,7 @@ src.connected.icon_state = "morguet" else //src.connected = null - del(src.connected) + qdel(src.connected) return @@ -144,7 +144,7 @@ src.connected.update() add_fingerprint(user) //SN src = null - del(src) + qdel(src) return return @@ -195,21 +195,21 @@ for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(2.0) if (prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return if(3.0) if (prob(5)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) - del(src) + qdel(src) return return @@ -232,7 +232,7 @@ A.loc = src playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) //src.connected = null - del(src.connected) + qdel(src.connected) else if (src.locked == 0) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) src.connected = new /obj/structure/c_tray( src.loc ) @@ -247,7 +247,7 @@ src.connected.icon_state = "cremat" else //src.connected = null - del(src.connected) + qdel(src.connected) src.add_fingerprint(user) update() @@ -258,7 +258,7 @@ return if ((!in_range(src, usr) > 1 && src.loc != user)) return - t = sanitize(t) + t = sanitizeSafe(t, MAX_NAME_LEN) if (t) src.name = text("Crematorium- '[]'", t) else @@ -282,7 +282,7 @@ src.connected.icon_state = "cremat" else //src.connected = null - del(src.connected) + qdel(src.connected) return /obj/structure/crematorium/proc/cremate(atom/A, mob/user as mob) @@ -323,10 +323,10 @@ //log_attack("\[[time_stamp()]\] [user]/[user.ckey] cremated [M]/[M.ckey]") M.death(1) M.ghostize() - del(M) + qdel(M) for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up - del(O) + qdel(O) new /obj/effect/decal/cleanable/ash(src) sleep(30) @@ -360,7 +360,7 @@ src.connected.update() add_fingerprint(user) //SN src = null - del(src) + qdel(src) return return diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 0b11d09fcc..f5c988ae97 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -8,19 +8,19 @@ /obj/structure/sign/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) - del(src) + qdel(src) return if(3.0) - del(src) + qdel(src) return else return /obj/structure/sign/blob_act() - del(src) + qdel(src) return /obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction @@ -33,7 +33,7 @@ //var/icon/I = icon('icons/obj/decals.dmi', icon_state) //S.icon = I.Scale(24, 24) S.sign_state = icon_state - del(src) + qdel(src) else ..() /obj/item/sign @@ -62,7 +62,7 @@ S.desc = desc S.icon_state = sign_state user << "You fasten \the [S] with your [tool]." - del(src) + qdel(src) else ..() /obj/structure/sign/double/map diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index fad0c3d0bd..46cf8ffcd8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -79,5 +79,5 @@ /obj/structure/bed/nest/proc/healthcheck() if(health <=0) density = 0 - del(src) + qdel(src) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 6d50066a74..7e412cfaa9 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -20,27 +20,27 @@ /obj/structure/bed/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(5)) - del(src) + qdel(src) return /obj/structure/bed/blob_act() if(prob(75)) new /obj/item/stack/sheet/metal(src.loc) - del(src) + qdel(src) /obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/stack/sheet/metal(src.loc) - del(src) + qdel(src) else ..() @@ -71,7 +71,7 @@ visible_message("[user] collapses \the [src.name].") new/obj/item/roller(get_turf(src)) spawn(0) - del(src) + qdel(src) return ..() @@ -85,7 +85,7 @@ /obj/item/roller/attack_self(mob/user) var/obj/structure/bed/roller/R = new /obj/structure/bed/roller(user.loc) R.add_fingerprint(user) - del(src) + qdel(src) /obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -119,7 +119,7 @@ user << "\blue You deploy the roller bed." var/obj/structure/bed/roller/R = new /obj/structure/bed/roller(user.loc) R.add_fingerprint(user) - del(held) + qdel(held) held = null @@ -153,5 +153,5 @@ visible_message("[usr] collapses \the [src.name].") new/obj/item/roller(get_turf(src)) spawn(0) - del(src) + qdel(src) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 5c4728313b..b811294a07 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -26,7 +26,7 @@ E.part = SK SK.loc = E SK.master = E - del(src) + qdel(src) /obj/structure/bed/chair/attack_tk(mob/user as mob) if(buckled_mob) @@ -67,21 +67,19 @@ return // Chair types -/obj/structure/bed/chair/wood/normal +/obj/structure/bed/chair/wood icon_state = "wooden_chair" name = "wooden chair" desc = "Old is never too old to not be in fashion." /obj/structure/bed/chair/wood/wings icon_state = "wooden_chair_wings" - name = "wooden chair" - desc = "Old is never too old to not be in fashion." /obj/structure/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/stack/sheet/wood(src.loc) - del(src) + qdel(src) else ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index 16e9161dcf..8de3bcf0a5 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -13,7 +13,7 @@ user.remove_from_mob(src) var/obj/item/stack/sheet/metal/m = new/obj/item/stack/sheet/metal m.loc = get_turf(src) - del src + qdel(src) var/mob/living/T = M T.Weaken(10) T.apply_damage(20) @@ -23,25 +23,25 @@ /obj/item/weapon/stool/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(5)) - del(src) + qdel(src) return /obj/item/weapon/stool/blob_act() if(prob(75)) new /obj/item/stack/sheet/metal(src.loc) - del(src) + qdel(src) /obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/stack/sheet/metal(src.loc) - del(src) + qdel(src) ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index d14ddf1405..f206bfc11f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -59,11 +59,11 @@ ..() for(var/obj/structure/table/T in src.loc) if(T != src) - del(T) + qdel(T) update_icon() update_adjacent() -/obj/structure/table/Del() +/obj/structure/table/Destroy() update_adjacent() ..() @@ -328,7 +328,7 @@ return 0 else visible_message("[src] breaks down!") - destroy() + qdel(src) return 1 return 1 @@ -375,7 +375,7 @@ G.affecting.loc = src.loc G.affecting.Weaken(5) visible_message("[G.assailant] puts [G.affecting] on \the [src].") - del(W) + qdel(W) return // Handle dissembly. @@ -386,7 +386,7 @@ user << "You locate the bolts and begin disassembling \the [src]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user,50)) - destroy() + qdel(src) return // Handle weakening. @@ -429,7 +429,7 @@ playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(src.loc, "sparks", 50, 1) user.visible_message("The [src] was sliced apart by [user]!") - destroy() + qdel(src) user.drop_item(src.loc) return diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index fcd65e2cdf..47a2f53fb3 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -47,7 +47,7 @@ -/obj/structure/transit_tube_pod/Del() +/obj/structure/transit_tube_pod/Destroy() for(var/atom/movable/AM in contents) AM.loc = loc @@ -63,7 +63,7 @@ obj/structure/ex_act(severity) AM.loc = loc AM.ex_act(severity++) - del(src) + qdel(src) return if(2.0) if(prob(50)) @@ -71,7 +71,7 @@ obj/structure/ex_act(severity) AM.loc = loc AM.ex_act(severity++) - del(src) + qdel(src) return if(3.0) return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 62f3ef60c1..81a3a16cdd 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -173,7 +173,7 @@ /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up overlays.Cut() //once it's been on for a while, in addition to handling the water overlay. if(mymist) - del(mymist) + qdel(mymist) if(on) overlays += image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir) @@ -183,16 +183,16 @@ spawn(50) if(src && on) ismist = 1 - mymist = new /obj/effect/mist(loc) + mymist = PoolOrNew(/obj/effect/mist,loc) else ismist = 1 - mymist = new /obj/effect/mist(loc) + mymist = PoolOrNew(/obj/effect/mist,loc) else if(ismist) ismist = 1 - mymist = new /obj/effect/mist(loc) + mymist = PoolOrNew(/obj/effect/mist,loc) spawn(250) if(src && !on) - del(mymist) + qdel(mymist) ismist = 0 /obj/machinery/shower/Crossed(atom/movable/O) @@ -292,7 +292,7 @@ loc.clean_blood() for(var/obj/effect/E in tile) if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay)) - del(E) + qdel(E) /obj/machinery/shower/process() if(!on) return diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index a0855a35b0..36135a775e 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -37,7 +37,7 @@ obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0) update_nearby_tiles(need_rebuild=1) -obj/structure/windoor_assembly/Del() +obj/structure/windoor_assembly/Destroy() density = 0 update_nearby_tiles() ..() @@ -78,8 +78,8 @@ obj/structure/windoor_assembly/Del() user << "\blue You dissasembled the windoor assembly!" new /obj/item/stack/sheet/glass/reinforced(get_turf(src), 5) if(secure) - new /obj/item/stack/rods(get_turf(src), 4) - del(src) + PoolOrNew(/obj/item/stack/rods, list(get_turf(src), 4)) + qdel(src) else user << "\blue You need more welding fuel to dissassemble the windoor assembly." return @@ -249,7 +249,7 @@ obj/structure/windoor_assembly/Del() src.electronics.loc = windoor - del(src) + qdel(src) else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index fd96873b7a..36d5bcc657 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -88,12 +88,12 @@ index = 0 while(index < 2) new shardtype(loc) - if(reinf) new /obj/item/stack/rods(loc) + if(reinf) PoolOrNew(/obj/item/stack/rods, loc) index++ else new shardtype(loc) - if(reinf) new /obj/item/stack/rods(loc) - del(src) + if(reinf) PoolOrNew(/obj/item/stack/rods, loc) + qdel(src) return @@ -111,7 +111,7 @@ /obj/structure/window/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) shatter(0) @@ -216,7 +216,7 @@ if(istype(G.affecting,/mob/living)) var/mob/living/M = G.affecting var/state = G.state - del(W) //gotta delete it here because if window breaks, it won't get deleted + qdel(W) //gotta delete it here because if window breaks, it won't get deleted switch (state) if(1) M.visible_message("[user] slams [M] against \the [src]!") @@ -266,7 +266,7 @@ mats.amount = is_fulltile() ? 4 : 2 else new glasstype(loc) - del(src) + qdel(src) else if(W.damtype == BRUTE || W.damtype == BURN) hit(W.force) @@ -334,7 +334,7 @@ update_nearby_icons() -/obj/structure/window/Del() +/obj/structure/window/Destroy() density = 0 update_nearby_tiles() update_nearby_icons() diff --git a/code/game/response_team.dm b/code/game/response_team.dm index a64230b1d6..23e5f764a3 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -58,7 +58,7 @@ client/verb/JoinResponseTeam() L.name = "Commando" return create_response_team(L.loc, new_name) - del(L) + qdel(L) else usr << "You need to be an observer or new player to use this." diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm index 907b2f6758..c31b5a8ef1 100644 --- a/code/game/smoothwall.dm +++ b/code/game/smoothwall.dm @@ -100,7 +100,7 @@ ..()*/ -/turf/simulated/wall/Del() +/turf/simulated/wall/Destroy() spawn(10) for(var/turf/simulated/wall/W in range(src,1)) W.relativewall() diff --git a/code/game/sound.dm b/code/game/sound.dm index b5a4006e34..1cc6f98807 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -53,34 +53,34 @@ var/const/FALLOFF_SOUNDS = 0.5 if(isturf(turf_source)) // 3D sounds, the technology is here! var/turf/T = get_turf(src) - + //sound volume falloff with distance var/distance = get_dist(T, turf_source) - + S.volume -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff. - + //sound volume falloff with pressure var/pressure_factor = 1.0 - + var/datum/gas_mixture/hearer_env = T.return_air() var/datum/gas_mixture/source_env = turf_source.return_air() - + if (hearer_env && source_env) var/pressure = min(hearer_env.return_pressure(), source_env.return_pressure()) - + if (pressure < ONE_ATMOSPHERE) pressure_factor = max((pressure - SOUND_MINIMUM_PRESSURE)/(ONE_ATMOSPHERE - SOUND_MINIMUM_PRESSURE), 0) else //in space pressure_factor = 0 - + if (distance <= 1) pressure_factor = max(pressure_factor, 0.15) //hearing through contact - + S.volume *= pressure_factor - + if (S.volume <= 0) return //no volume means no sound - + var/dx = turf_source.x - T.x // Hearing from the right/left S.x = dx var/dz = turf_source.y - T.y // Hearing from infront/behind @@ -88,8 +88,11 @@ var/const/FALLOFF_SOUNDS = 0.5 // The y value is for above your head, but there is no ceiling in 2d spessmens. S.y = 1 S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) + if(!is_global) - S.environment = 2 + var/area/A = get_area(src) + S.environment = A.sound_env + src << S /client/proc/playtitlemusic() diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index d32173c267..3c6e434b8c 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -84,13 +84,13 @@ var/list/mechtoys = list( /obj/structure/plasticflaps/ex_act(severity) switch(severity) if (1) - del(src) + qdel(src) if (2) if (prob(50)) - del(src) + qdel(src) if (3) if (prob(5)) - del(src) + qdel(src) /obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates name = "airtight plastic flaps" @@ -102,7 +102,7 @@ var/list/mechtoys = list( T.blocks_air = 1 ..() - Del() //lazy hack to set the turf to allow air to pass if it's a simulated floor + Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor var/turf/T = get_turf(loc) if(T) if(istype(T, /turf/simulated/floor)) @@ -217,7 +217,7 @@ var/list/mechtoys = list( var/obj/item/stack/sheet/mineral/platinum/P = A plat_count += P.get_amount() - del(MA) + qdel(MA) if(phoron_count) points += phoron_count * points_per_phoron diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 9546bf9ba1..dcecf46ad6 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -12,6 +12,8 @@ /turf/simulated/New() ..() + if(istype(loc, /area/chapel)) + holy = 1 levelupdate() /turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808") diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 07b68a329a..9541e67116 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -82,19 +82,19 @@ var/list/wood_icons = list("wood","wood-broken") if(1.0) src.ChangeTurf(/turf/space) if(2.0) - switch(pick(1,2;75,3)) + switch(pick(40;1,40;2,3)) if (1) - src.ReplaceWithLattice() if(prob(33)) new /obj/item/stack/sheet/metal(src) + src.ReplaceWithLattice() if(2) src.ChangeTurf(/turf/space) if(3) + if(prob(33)) new /obj/item/stack/sheet/metal(src) if(prob(80)) src.break_tile_to_plating() else src.break_tile() src.hotspot_expose(1000,CELL_VOLUME) - if(prob(33)) new /obj/item/stack/sheet/metal(src) if(3.0) if (prob(50)) src.break_tile() @@ -457,7 +457,7 @@ turf/simulated/floor/proc/update_icon() if(is_light_floor()) if(get_lightfloor_state()) user.remove_from_mob(C) - del(C) + qdel(C) set_lightfloor_state(0) //fixing it by bashing it with a light bulb, fun eh? update_icon() user << "\blue You replace the light bulb." diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 4c4682c5c5..b036df007a 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -64,7 +64,7 @@ user << "\blue Removing rods..." playsound(src, 'sound/items/Ratchet.ogg', 80, 1) if(do_after(user, 30)) - new /obj/item/stack/rods(src, 2) + PoolOrNew(/obj/item/stack/rods, list(loc, 2)) ChangeTurf(/turf/simulated/floor) var/turf/simulated/floor/F = src F.make_plating() @@ -74,6 +74,8 @@ name = "engraved floor" icon_state = "cult" +/turf/simulated/floor/engine/cult/cultify() + return /turf/simulated/floor/engine/n20 New() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 969b872caf..ef7dd74e8f 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -45,12 +45,12 @@ take_damage(tforce) -/turf/simulated/wall/Del() - for(var/obj/effect/E in src) if(E.name == "Wallrot") del E +/turf/simulated/wall/Destroy() + for(var/obj/effect/E in src) if(E.name == "Wallrot") qdel(E) ..() /turf/simulated/wall/ChangeTurf(var/newtype) - for(var/obj/effect/E in src) if(E.name == "Wallrot") del E + for(var/obj/effect/E in src) if(E.name == "Wallrot") qdel(E) for(var/obj/effect/plant/plant in range(1)) plant.update_neighbors() ..(newtype) @@ -106,6 +106,20 @@ //Damage +/turf/simulated/wall/melt() + if(mineral == "diamond") + return + + src.ChangeTurf(/turf/simulated/floor/plating) + + var/turf/simulated/floor/F = src + if(!F) + return + F.burn_tile() + F.icon_state = "wall_thermite" + visible_message("\The [src] spontaneously combusts!.") //!!OH SHIT!! + return + /turf/simulated/wall/proc/take_damage(dam) if(dam) damage = max(0, damage + dam) @@ -237,7 +251,7 @@ user << "The thermite starts melting through the wall." spawn(100) - if(O) del(O) + if(O) qdel(O) // F.sd_LumReset() //TODO: ~Carn return @@ -312,7 +326,7 @@ user << "You burn away the fungi with \the [WT]." playsound(src, 'sound/items/Welder.ogg', 10, 1) for(var/obj/effect/E in src) if(E.name == "Wallrot") - del E + qdel(E) rotting = 0 return else if(!is_sharp(W) && W.force >= 10 || W.force >= 20) diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index 5585de31d8..335d701656 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -92,7 +92,7 @@ for(var/obj/structure/falsewall/phoron/F in range(3,src))//Hackish as fuck, but until temperature_expose works, there is nothing I can do -Sieve var/turf/T = get_turf(F) T.ChangeTurf(/turf/simulated/wall/mineral/phoron/) - del (F) + qdel(F) for(var/turf/simulated/wall/mineral/phoron/W in range(3,src)) W.ignite((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index b1a06f6e88..fdc5d92995 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -2,4 +2,7 @@ name = "wall" desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick" icon_state = "cult" - walltype = "cult" \ No newline at end of file + walltype = "cult" + +/turf/unsimulated/wall/cult/cultify() + return diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 497371eb5f..0ddf0c34e7 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -41,7 +41,7 @@ user << "You burn away the fungi with \the [WT]." playsound(src, 'sound/items/Welder.ogg', 10, 1) for(var/obj/effect/E in src) if(E.name == "Wallrot") - del E + qdel(E) rotting = 0 return else if(!is_sharp(W) && W.force >= 10 || W.force >= 20) @@ -98,7 +98,7 @@ playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) src.d_state = 1 src.icon_state = "r_wall-1" - new /obj/item/stack/rods( src ) + PoolOrNew(/obj/item/stack/rods, src) user << "You cut the outer grille." return @@ -126,7 +126,7 @@ if (O.amount > 1) O.amount-- else - del(O) + qdel(O) return if(2) @@ -206,7 +206,7 @@ if( d_state == 5 && user.loc == T && user.get_active_hand() == WT ) src.d_state = 6 src.icon_state = "r_wall-6" - new /obj/item/stack/rods( src ) + PoolOrNew(/obj/item/stack/rods, src) user << "The support rods drop out as you cut them loose from the frame." else user << "You need more welding fuel to complete this task." @@ -223,7 +223,7 @@ if( d_state == 5 && user.loc == T && user.get_active_hand() == W ) src.d_state = 6 src.icon_state = "r_wall-6" - new /obj/item/stack/rods( src ) + PoolOrNew(/obj/item/stack/rods, src) user << "The support rods drop out as you cut them loose from the frame." return @@ -272,7 +272,7 @@ if (MS.amount > 1) MS.amount-- else - del(MS) + qdel(MS) //APC else if( istype(W,/obj/item/apc_frame) ) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 884c5c5dbe..bfd7548276 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -43,7 +43,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = var/obj/item/stack/tile/plasteel/S = C if (S.get_amount() < 1) return - del(L) + qdel(L) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) S.build(src) S.use(1) @@ -69,11 +69,11 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = if(A.z > 6 && !config.use_overmap) return if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1)) if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) + qdel(A) return if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level. - del(A) //The disk's Del() proc ensures a new one is created + qdel(A) //The disk's Destroy() proc ensures a new one is created return if(config.use_overmap) overmap_spacetravel(src,A) @@ -94,10 +94,10 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = MM.inertia_dir = 2 else for(var/obj/item/weapon/disk/nuclear/N in disk_search) - del(N)//Make the disk respawn it is on a clientless mob or corpse + qdel(N)//Make the disk respawn it is on a clientless mob or corpse else for(var/obj/item/weapon/disk/nuclear/N in disk_search) - del(N)//Make the disk respawn if it is floating on its own + qdel(N)//Make the disk respawn if it is floating on its own return var/move_to_z = src.z @@ -148,7 +148,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = if(src.x <= 1) if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() @@ -173,7 +173,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = A.loc.Entered(A) else if (src.x >= world.maxx) if(istype(A, /obj/effect/meteor)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() @@ -198,7 +198,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = A.loc.Entered(A) else if (src.y <= 1) if(istype(A, /obj/effect/meteor)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() if(!cur_pos) return @@ -223,7 +223,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = else if (src.y >= world.maxy) if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) + qdel(A) return var/list/cur_pos = src.get_global_map_pos() if(!cur_pos) return @@ -245,4 +245,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = spawn (0) if ((A && A.loc)) A.loc.Entered(A) - return \ No newline at end of file + return + +/turf/space/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0) + return ..(N, tell_universe, 1) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 29f425d4a3..98f56361fe 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -26,6 +26,12 @@ var/has_resources var/list/resources + // Flick animation + var/atom/movable/overlay/c_animation = null + + // holy water + var/holy = 0 + /turf/New() ..() for(var/atom/movable/AM as mob|obj in src) @@ -191,10 +197,10 @@ /turf/proc/RemoveLattice() var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) if(L) - del L + qdel(L) //Creates a new turf -/turf/proc/ChangeTurf(var/turf/N) +/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0) if (!N) return @@ -227,20 +233,14 @@ if(S.zone) S.zone.rebuild() if(ispath(N, /turf/simulated/floor)) - //if the old turf had a zone, connect the new turf to it as well - Cael - //Adjusted by SkyMarshal 5/10/13 - The air master will handle the addition of the new turf. - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) //W.Assimilate_Air() W.lighting_lumcount += old_lumcount - - if(W.lighting_lumcount) - W.UpdateAffectingLights() + if((old_lumcount != W.lighting_lumcount) || (loc.name != "Space" && force_lighting_update)) + W.lighting_changed = 1 + lighting_controller.changed_turfs += W if(old_fire) fire = old_fire @@ -248,8 +248,11 @@ if (istype(W,/turf/simulated/floor)) W.RemoveLattice() + if(tell_universe) + universe.OnTurfChange(W) + if(air_master) - air_master.mark_for_update(src) + air_master.mark_for_update(src) //handle the addition of the new turf. for(var/turf/space/S in range(W,1)) S.update_starlight() @@ -258,20 +261,19 @@ return W else - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/W = new N( locate(src.x, src.y, src.z) ) W.lighting_lumcount += old_lumcount - if(old_lumcount != W.lighting_lumcount) + if((old_lumcount != W.lighting_lumcount) || (loc.name != "Space" && force_lighting_update)) W.lighting_changed = 1 lighting_controller.changed_turfs += W if(old_fire) old_fire.RemoveFire() + if(tell_universe) + universe.OnTurfChange(W) + if(air_master) air_master.mark_for_update(src) @@ -336,7 +338,8 @@ /turf/proc/ReplaceWithLattice() src.ChangeTurf(/turf/space) - new /obj/structure/lattice( locate(src.x, src.y, src.z) ) + spawn() + new /obj/structure/lattice( locate(src.x, src.y, src.z) ) /turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N //Useful to batch-add creatures to the list. diff --git a/code/game/turfs/turf_flick_animations.dm b/code/game/turfs/turf_flick_animations.dm new file mode 100644 index 0000000000..b1bccd51bc --- /dev/null +++ b/code/game/turfs/turf_flick_animations.dm @@ -0,0 +1,21 @@ +/turf/proc/turf_animation(var/anim_icon,var/anim_state,var/anim_x=0, var/anim_y=0, var/anim_layer=MOB_LAYER+1, var/anim_sound=null, var/anim_color=null) + if(!c_animation)//spamming turf animations can have unintended effects, such as the overlays never disapearing. hence this check. + if(anim_sound) + playsound(src, anim_sound, 50, 1) + c_animation = PoolOrNew(/atom/movable/overlay, src) + c_animation.name = "turf_animation" + c_animation.density = 0 + c_animation.anchored = 1 + c_animation.icon = anim_icon + c_animation.icon_state = anim_state + c_animation.layer = anim_layer + c_animation.master = src + c_animation.pixel_x = anim_x + c_animation.pixel_y = anim_y + if(anim_color) + c_animation.color = anim_color + flick("turf_animation",c_animation) + spawn(10) + if(c_animation) + qdel(c_animation) + c_animation = null diff --git a/code/game/vehicles/vehicle.dm b/code/game/vehicles/vehicle.dm index 3ec73f3eeb..4088528b35 100644 --- a/code/game/vehicles/vehicle.dm +++ b/code/game/vehicles/vehicle.dm @@ -1,190 +1,190 @@ - - -/obj/vehicle - name = "Vehicle" - icon = 'icons/vehicles/vehicles.dmi' - density = 1 - anchored = 1 - unacidable = 1 //To avoid the pilot-deleting shit that came with mechas - layer = MOB_LAYER - //var/can_move = 1 - var/mob/living/carbon/occupant = null - //var/step_in = 10 //make a step in step_in/10 sec. - //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. - //var/step_energy_drain = 10 - var/health = 300 //health is health - //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - //the values in this list show how much damage will pass through, not how much will be absorbed. - var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) - var/obj/item/weapon/cell/cell //Our power source - var/state = 0 - var/list/log = new - var/last_message = 0 - var/add_req_access = 1 - var/maint_access = 1 - //var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect/effect/system/spark_spread/spark_system = new - var/lights = 0 - var/lights_power = 6 - - //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri - //var/use_internal_tank = 0 - //var/internal_tank_valve = ONE_ATMOSPHERE - //var/obj/machinery/portable_atmospherics/canister/internal_tank - //var/datum/gas_mixture/cabin_air - //var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/obj/item/device/radio/radio = null - - var/max_temperature = 2500 - //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible - var/internal_damage = 0 //contains bitflags - - var/list/operation_req_access = list()//required access level for mecha operation - var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment - - //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri - var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss - - //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri - - var/datum/global_iterator/pr_internal_damage //processes internal damage - - - var/wreckage - - var/list/equipment = new - var/obj/selected - //var/max_equip = 3 - - var/datum/events/events - - - -/obj/vehicle/New() - ..() - events = new - icon_state += "-unmanned" - add_radio() - //add_cabin() //No cabin for non-airtights - - spark_system.set_up(2, 0, src) - spark_system.attach(src) - add_cell() - add_iterators() - removeVerb(/obj/mecha/verb/disconnect_from_port) - removeVerb(/atom/movable/verb/pull) - log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") - loc.Entered(src) - return - - -//################ Helpers ########################################################### - - -/obj/vehicle/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/vehicle/proc/addVerb(verb_path) - verbs += verb_path - -/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank*/ - -/obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 15000 - cell.maxcharge = 15000 - -/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air*/ - -/obj/vehicle/proc/add_radio() - radio = new(src) - radio.name = "[src] radio" - radio.icon = icon - radio.icon_state = icon_state - radio.subspace_transmission = 1 - -/obj/vehicle/proc/add_iterators() - pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) - //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) - //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri - //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri - -/obj/vehicle/proc/check_for_support() - if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) - return 1 - else - return 0 - -//################ Logs and messages ############################################ - - -/obj/vehicle/proc/log_message(message as text,red=null) - log.len++ - log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") - return log.len - - - -//################ Global Iterator Datums ###################################### - - -/datum/global_iterator/vehicle_intertial_movement //inertial movement in space - delay = 7 - - process(var/obj/vehicle/V as obj, direction) - if(direction) - if(!step(V, direction)||V.check_for_support()) - src.stop() - else - src.stop() - return - - -/datum/global_iterator/mecha_internal_damage // processing internal damage - - process(var/obj/mecha/mecha) - if(!mecha.hasInternalDamage()) - return stop() - if(mecha.hasInternalDamage(MECHA_INT_FIRE)) - if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) - mecha.clearInternalDamage(MECHA_INT_FIRE) - if(mecha.internal_tank) - if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) - mecha.setInternalDamage(MECHA_INT_TANK_BREACH) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) - if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) - mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) - if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) - mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") - if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum - mecha.pr_int_temp_processor.stop() - if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank - if(mecha.internal_tank) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) - if(mecha.loc && hascall(mecha.loc,"assume_air")) - mecha.loc.assume_air(leaked_gas) - else - del(leaked_gas) - if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - if(mecha.get_charge()) - mecha.spark_system.start() - mecha.cell.charge -= min(20,mecha.cell.charge) - mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) + + +/obj/vehicle + name = "Vehicle" + icon = 'icons/vehicles/vehicles.dmi' + density = 1 + anchored = 1 + unacidable = 1 //To avoid the pilot-deleting shit that came with mechas + layer = MOB_LAYER + //var/can_move = 1 + var/mob/living/carbon/occupant = null + //var/step_in = 10 //make a step in step_in/10 sec. + //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. + //var/step_energy_drain = 10 + var/health = 300 //health is health + //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. + //the values in this list show how much damage will pass through, not how much will be absorbed. + var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) + var/obj/item/weapon/cell/cell //Our power source + var/state = 0 + var/list/log = new + var/last_message = 0 + var/add_req_access = 1 + var/maint_access = 1 + //var/dna //dna-locking the mech + var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference + var/datum/effect/effect/system/spark_spread/spark_system = new + var/lights = 0 + var/lights_power = 6 + + //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri + //var/use_internal_tank = 0 + //var/internal_tank_valve = ONE_ATMOSPHERE + //var/obj/machinery/portable_atmospherics/canister/internal_tank + //var/datum/gas_mixture/cabin_air + //var/obj/machinery/atmospherics/portables_connector/connected_port = null + + var/obj/item/device/radio/radio = null + + var/max_temperature = 2500 + //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible + var/internal_damage = 0 //contains bitflags + + var/list/operation_req_access = list()//required access level for mecha operation + var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment + + //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri + var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss + + //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri + + var/datum/global_iterator/pr_internal_damage //processes internal damage + + + var/wreckage + + var/list/equipment = new + var/obj/selected + //var/max_equip = 3 + + var/datum/events/events + + + +/obj/vehicle/New() + ..() + events = new + icon_state += "-unmanned" + add_radio() + //add_cabin() //No cabin for non-airtights + + spark_system.set_up(2, 0, src) + spark_system.attach(src) + add_cell() + add_iterators() + removeVerb(/obj/mecha/verb/disconnect_from_port) + removeVerb(/atom/movable/verb/pull) + log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") + loc.Entered(src) + return + + +//################ Helpers ########################################################### + + +/obj/vehicle/proc/removeVerb(verb_path) + verbs -= verb_path + +/obj/vehicle/proc/addVerb(verb_path) + verbs += verb_path + +/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri + internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) + return internal_tank*/ + +/obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null) + if(C) + C.forceMove(src) + cell = C + return + cell = new(src) + cell.charge = 15000 + cell.maxcharge = 15000 + +/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri + cabin_air = new + cabin_air.temperature = T20C + cabin_air.volume = 200 + cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + return cabin_air*/ + +/obj/vehicle/proc/add_radio() + radio = new(src) + radio.name = "[src] radio" + radio.icon = icon + radio.icon_state = icon_state + radio.subspace_transmission = 1 + +/obj/vehicle/proc/add_iterators() + pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) + //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) + //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri + //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri + +/obj/vehicle/proc/check_for_support() + if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) + return 1 + else + return 0 + +//################ Logs and messages ############################################ + + +/obj/vehicle/proc/log_message(message as text,red=null) + log.len++ + log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") + return log.len + + + +//################ Global Iterator Datums ###################################### + + +/datum/global_iterator/vehicle_intertial_movement //inertial movement in space + delay = 7 + + process(var/obj/vehicle/V as obj, direction) + if(direction) + if(!step(V, direction)||V.check_for_support()) + src.stop() + else + src.stop() + return + + +/datum/global_iterator/mecha_internal_damage // processing internal damage + + process(var/obj/mecha/mecha) + if(!mecha.hasInternalDamage()) + return stop() + if(mecha.hasInternalDamage(MECHA_INT_FIRE)) + if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) + mecha.clearInternalDamage(MECHA_INT_FIRE) + if(mecha.internal_tank) + if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) + mecha.setInternalDamage(MECHA_INT_TANK_BREACH) + var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() + if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents + int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) + if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) + mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) + if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) + mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") + if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum + mecha.pr_int_temp_processor.stop() + if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank + if(mecha.internal_tank) + var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() + var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) + if(mecha.loc && hascall(mecha.loc,"assume_air")) + mecha.loc.assume_air(leaked_gas) + else + qdel(leaked_gas) + if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) + if(mecha.get_charge()) + mecha.spark_system.start() + mecha.cell.charge -= min(20,mecha.cell.charge) + mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) return \ No newline at end of file diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 92b0638b9f..82fef02e97 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -85,8 +85,8 @@ return if(!holder) - if(!config.ooc_allowed) - src << "OOC is globally muted." + if(!config.looc_allowed) + src << "LOOC is globally muted." return if(!config.dooc_allowed && (mob.stat == DEAD)) usr << "OOC for dead mobs has been turned off." diff --git a/code/global.dm b/code/global.dm index 3836229649..2e7ddeb0e6 100644 --- a/code/global.dm +++ b/code/global.dm @@ -1,4 +1,7 @@ //#define TESTING +#if DM_VERSION < 506 +#warn This compiler is out of date. You may experience issues with projectile animations. +#endif // Items that ask to be called every cycle. var/global/obj/effect/datacore/data_core = null @@ -27,6 +30,8 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called // 3: AI satellite. // 5: Empty space. +var/global/datum/universal_state/universe = new + var/global/list/global_map = null //var/global/list/global_map = list(list(1,5),list(4,3)) @@ -228,7 +233,8 @@ var/list/cheartstopper = list("potassium_chloride") // Thi // Used by robots and robot preferences. var/list/robot_module_types = list( "Standard", "Engineering", "Construction", "Surgeon", "Crisis", - "Miner", "Janitor", "Service", "Clerical", "Security" + "Miner", "Janitor", "Service", "Clerical", "Security", + "Research" ) // Some scary sounds. @@ -261,4 +267,4 @@ var/global/obj/item/device/radio/intercom/global_announcer = new(null) var/list/station_departments = list("Command", "Medical", "Engineering", "Science", "Security", "Cargo", "Civilian") var/global/const/TICKS_IN_DAY = 864000 -var/global/const/TICKS_IN_SECOND = 10 \ No newline at end of file +var/global/const/TICKS_IN_SECOND = 10 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 96b7a7c244..b42313261d 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -670,6 +670,16 @@ var/global/floorIsLava = 0 if(check_rights(R_SERVER,0)) dat += "Toggle bomb cap
        " + if(check_rights(R_SERVER|R_FUN,0)) + dat += {" +
        + Final Solutions
        + (Warning, these will end the round!)
        +
        + Summon Nar-Sie
        + Start a Supermatter Cascade
        + "} + dat += "
        " if(check_rights(R_DEBUG,0)) @@ -737,20 +747,43 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Globally Toggles OOC" set name="Toggle OOC" + + if(!check_rights(R_ADMIN)) + return + config.ooc_allowed = !(config.ooc_allowed) if (config.ooc_allowed) world << "The OOC channel has been globally enabled!" else world << "The OOC channel has been globally disabled!" - log_admin("[key_name(usr)] toggled OOC.") - message_admins("[key_name_admin(usr)] toggled OOC.", 1) + log_and_message_admins("toggled OOC.") feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/togglelooc() + set category = "Server" + set desc="Globally Toggles LOOC" + set name="Toggle LOOC" + + if(!check_rights(R_ADMIN)) + return + + config.looc_allowed = !(config.looc_allowed) + if (config.looc_allowed) + world << "The LOOC channel has been globally enabled!" + else + world << "The LOOC channel has been globally disabled!" + log_and_message_admins("toggled LOOC.") + feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /datum/admins/proc/toggledsay() set category = "Server" set desc="Globally Toggles DSAY" set name="Toggle DSAY" + + if(!check_rights(R_ADMIN)) + return + config.dsay_allowed = !(config.dsay_allowed) if (config.dsay_allowed) world << "Deadchat has been globally enabled!" @@ -764,6 +797,10 @@ var/global/floorIsLava = 0 set category = "Server" set desc="Toggle Dead OOC." set name="Toggle Dead OOC" + + if(!check_rights(R_ADMIN)) + return + config.dooc_allowed = !( config.dooc_allowed ) log_admin("[key_name(usr)] toggled Dead OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.", 1) @@ -1245,3 +1282,32 @@ var/global/floorIsLava = 0 //ALL DONE //********************************************************************************************************* // + +//Returns 1 to let the dragdrop code know we are trapping this event +//Returns 0 if we don't plan to trap the event +/datum/admins/proc/cmd_ghost_drag(var/mob/dead/observer/frommob, var/mob/living/tomob) + if(!istype(frommob)) + return //Extra sanity check to make sure only observers are shoved into things + + //Same as assume-direct-control perm requirements. + if (!check_rights(R_VAREDIT,0) || !check_rights(R_ADMIN|R_DEBUG,0)) + return 0 + if (!frommob.ckey) + return 0 + var/question = "" + if (tomob.ckey) + question = "This mob already has a user ([tomob.key]) in control of it! " + question += "Are you sure you want to place [frommob.name]([frommob.key]) in control of [tomob.name]?" + var/ask = alert(question, "Place ghost in control of mob?", "Yes", "No") + if (ask != "Yes") + return 1 + if (!frommob || !tomob) //make sure the mobs don't go away while we waited for a response + return 1 + if(tomob.client) //No need to ghostize if there is no client + tomob.ghostize(0) + message_admins("[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].") + log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].") + feedback_add_details("admin_verb","CGD") + tomob.ckey = frommob.ckey + qdel(frommob) + return 1 diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b4da2f8542..d495bacecb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -58,6 +58,7 @@ var/list/admin_verbs_admin = list( /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/secrets, /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ + /datum/admins/proc/togglelooc, /*toggles looc on/off for everyone*/ /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/ /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ @@ -296,7 +297,7 @@ var/list/admin_verbs_mentor = list( if(holder.rights & R_SERVER) verbs += admin_verbs_server if(holder.rights & R_DEBUG) verbs += admin_verbs_debug - if(config.debugparanoid && !check_rights(R_ADMIN)) + if(config.debugparanoid && !(holder.rights & R_ADMIN)) verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. if(holder.rights & R_POSSESS) verbs += admin_verbs_possess if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions @@ -523,7 +524,7 @@ var/list/admin_verbs_mentor = list( if(C) message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban.") C << "You have been autobanned due to a warning by [ckey].
        This is a temporary ban, it will be removed in [AUTOBANTIME] minutes." - del(C) + qdel(C) else message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.") AddBan(warned_ckey, D.last_id, "Autobanning due to too many formal warnings", ckey, 1, AUTOBANTIME) @@ -724,7 +725,8 @@ var/list/admin_verbs_mentor = list( return if(holder) - S.subsystem_law_manager() + var/obj/nano_module/law_manager/L = new(S) + L.ui_interact(usr, state = admin_state) admin_log_and_message_admins("has opened [S]'s law manager.") feedback_add_details("admin_verb","MSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -738,7 +740,7 @@ var/list/admin_verbs_mentor = list( if(holder) admin_log_and_message_admins("is altering the appearance of [H].") - H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0) + H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0, state = admin_state) feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/change_human_appearance_self(mob/living/carbon/human/H in mob_list) @@ -944,3 +946,14 @@ var/list/admin_verbs_mentor = list( log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1) + +/client/proc/give_spell(mob/T as mob in mob_list) // -- Urist + set category = "Fun" + set name = "Give Spell" + set desc = "Gives a spell to a mob." + var/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells + if(!S) return + T.spell_list += new S + feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") + message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index d1cc15b0fe..dbd4de6444 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -16,7 +16,7 @@ var/list/admin_datums = list() /datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey) if(!ckey) error("Admin datum created without a ckey argument. Datum has been deleted") - del(src) + qdel(src) return admincaster_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" rank = initial_rank @@ -55,8 +55,7 @@ proc/admin_proc() if(!check_rights(R_ADMIN)) return world << "you have enough rights!" -NOTE: it checks usr! not src! So if you're checking somebody's rank in a proc which they did not call -you will have to do something like if(client.holder.rights & R_ADMIN) yourself. +NOTE: It checks usr by default. Supply the "user" argument if you wish to check for a specific mob. */ /proc/check_rights(rights_required, show_msg=1, var/mob/user = usr) if(user && user.client) @@ -92,5 +91,5 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. /client/proc/deadmin() if(holder) holder.disassociate() - //del(holder) + //qdel(holder) return 1 diff --git a/code/modules/admin/player_notes.dm b/code/modules/admin/player_notes.dm index 3a74da5fca..a00a208d3b 100644 --- a/code/modules/admin/player_notes.dm +++ b/code/modules/admin/player_notes.dm @@ -1,167 +1,167 @@ -//This stuff was originally intended to be integrated into the ban-system I was working on -//but it's safe to say that'll never be finished. So I've merged it into the current player panel. -//enjoy ~Carn -/* -#define NOTESFILE "data/player_notes.sav" //where the player notes are saved - -datum/admins/proc/notes_show(var/ckey) - usr << browse("Player Notes[notes_gethtml(ckey)]","window=player_notes;size=700x400") - - -datum/admins/proc/notes_gethtml(var/ckey) - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) return "Error: Cannot access [NOTESFILE]" - if(ckey) - . = "Notes for [ckey]: \[+\] \[-\]
        " - notesfile.cd = "/[ckey]" - var/index = 1 - while( !notesfile.eof ) - var/note - notesfile >> note - . += "[note] \[-\]
        " - index++ - else - . = "All Notes: \[+\] \[-\]
        " - notesfile.cd = "/" - for(var/dir in notesfile.dir) - . += "[dir]
        " - return - - -//handles adding notes to the end of a ckey's buffer -//originally had seperate entries such as var/by to record who left the note and when -//but the current bansystem is a heap of dung. -/proc/notes_add(var/ckey, var/note) - if(!ckey) - ckey = ckey(input(usr,"Who would you like to add notes for?","Enter a ckey",null) as text|null) - if(!ckey) return - - if(!note) - note = html_encode(input(usr,"Enter your note:","Enter some text",null) as message|null) - if(!note) return - - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) return - notesfile.cd = "/[ckey]" - notesfile.eof = 1 //move to the end of the buffer - notesfile << "[time2text(world.realtime,"DD-MMM-YYYY")] | [note][(usr && usr.ckey)?" ~[usr.ckey]":""]" - return - -//handles removing entries from the buffer, or removing the entire directory if no start_index is given -/proc/notes_remove(var/ckey, var/start_index, var/end_index) - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) return - - if(!ckey) - notesfile.cd = "/" - ckey = ckey(input(usr,"Who would you like to remove notes for?","Enter a ckey",null) as null|anything in notesfile.dir) - if(!ckey) return - - if(start_index) - notesfile.cd = "/[ckey]" - var/list/noteslist = list() - if(!end_index) end_index = start_index - var/index = 0 - while( !notesfile.eof ) - index++ - var/temp - notesfile >> temp - if( (start_index <= index) && (index <= end_index) ) - continue - noteslist += temp - - notesfile.eof = -2 //Move to the start of the buffer and then erase. - - for( var/note in noteslist ) - notesfile << note - else - notesfile.cd = "/" - if(alert(usr,"Are you sure you want to remove all their notes?","Confirmation","No","Yes - Remove all notes") == "Yes - Remove all notes") - notesfile.dir.Remove(ckey) - return - -#undef NOTESFILE -*/ - -//Hijacking this file for BS12 playernotes functions. I like this ^ one systemm alright, but converting sounds too bothersome~ Chinsky. - -/proc/notes_add(var/key, var/note, var/mob/usr) - if (!key || !note) - return - - //Loading list of notes for this key - var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") - var/list/infos - info >> infos - if(!infos) infos = list() - - //Overly complex timestamp creation - var/modifyer = "th" - switch(time2text(world.timeofday, "DD")) - if("01","21","31") - modifyer = "st" - if("02","22",) - modifyer = "nd" - if("03","23") - modifyer = "rd" - var/day_string = "[time2text(world.timeofday, "DD")][modifyer]" - if(copytext(day_string,1,2) == "0") - day_string = copytext(day_string,2) - var/full_date = time2text(world.timeofday, "DDD, Month DD of YYYY") - var/day_loc = findtext(full_date, time2text(world.timeofday, "DD")) - - var/datum/player_info/P = new - if (usr) - P.author = usr.key - P.rank = usr.client.holder.rank - else - P.author = "Adminbot" - P.rank = "Friendly Robot" - P.content = note - P.timestamp = "[copytext(full_date,1,day_loc)][day_string][copytext(full_date,day_loc+2)]" - - infos += P - info << infos - - message_admins("\blue [key_name_admin(usr)] has edited [key]'s notes.") - log_admin("[key_name(usr)] has edited [key]'s notes.") - - del info - - //Updating list of keys with notes on them - var/savefile/note_list = new("data/player_notes.sav") - var/list/note_keys - note_list >> note_keys - if(!note_keys) note_keys = list() - if(!note_keys.Find(key)) note_keys += key - note_list << note_keys - del note_list - - -/proc/notes_del(var/key, var/index) - var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") - var/list/infos - info >> infos - if(!infos || infos.len < index) return - - var/datum/player_info/item = infos[index] - infos.Remove(item) - info << infos - - message_admins("\blue [key_name_admin(usr)] deleted one of [key]'s notes.") - log_admin("[key_name(usr)] deleted one of [key]'s notes.") - - del info - -/proc/show_player_info_irc(var/key as text) - var/dat = " Info on [key]%0D%0A" - var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") - var/list/infos - info >> infos - if(!infos) - dat = "No information found on the given key." - else - for(var/datum/player_info/I in infos) - dat += "[I.content]%0D%0Aby [I.author] ([I.rank]) on [I.timestamp]%0D%0A%0D%0A" - - return dat +//This stuff was originally intended to be integrated into the ban-system I was working on +//but it's safe to say that'll never be finished. So I've merged it into the current player panel. +//enjoy ~Carn +/* +#define NOTESFILE "data/player_notes.sav" //where the player notes are saved + +datum/admins/proc/notes_show(var/ckey) + usr << browse("Player Notes[notes_gethtml(ckey)]","window=player_notes;size=700x400") + + +datum/admins/proc/notes_gethtml(var/ckey) + var/savefile/notesfile = new(NOTESFILE) + if(!notesfile) return "Error: Cannot access [NOTESFILE]" + if(ckey) + . = "Notes for [ckey]: \[+\] \[-\]
        " + notesfile.cd = "/[ckey]" + var/index = 1 + while( !notesfile.eof ) + var/note + notesfile >> note + . += "[note] \[-\]
        " + index++ + else + . = "All Notes: \[+\] \[-\]
        " + notesfile.cd = "/" + for(var/dir in notesfile.dir) + . += "[dir]
        " + return + + +//handles adding notes to the end of a ckey's buffer +//originally had seperate entries such as var/by to record who left the note and when +//but the current bansystem is a heap of dung. +/proc/notes_add(var/ckey, var/note) + if(!ckey) + ckey = ckey(input(usr,"Who would you like to add notes for?","Enter a ckey",null) as text|null) + if(!ckey) return + + if(!note) + note = html_encode(input(usr,"Enter your note:","Enter some text",null) as message|null) + if(!note) return + + var/savefile/notesfile = new(NOTESFILE) + if(!notesfile) return + notesfile.cd = "/[ckey]" + notesfile.eof = 1 //move to the end of the buffer + notesfile << "[time2text(world.realtime,"DD-MMM-YYYY")] | [note][(usr && usr.ckey)?" ~[usr.ckey]":""]" + return + +//handles removing entries from the buffer, or removing the entire directory if no start_index is given +/proc/notes_remove(var/ckey, var/start_index, var/end_index) + var/savefile/notesfile = new(NOTESFILE) + if(!notesfile) return + + if(!ckey) + notesfile.cd = "/" + ckey = ckey(input(usr,"Who would you like to remove notes for?","Enter a ckey",null) as null|anything in notesfile.dir) + if(!ckey) return + + if(start_index) + notesfile.cd = "/[ckey]" + var/list/noteslist = list() + if(!end_index) end_index = start_index + var/index = 0 + while( !notesfile.eof ) + index++ + var/temp + notesfile >> temp + if( (start_index <= index) && (index <= end_index) ) + continue + noteslist += temp + + notesfile.eof = -2 //Move to the start of the buffer and then erase. + + for( var/note in noteslist ) + notesfile << note + else + notesfile.cd = "/" + if(alert(usr,"Are you sure you want to remove all their notes?","Confirmation","No","Yes - Remove all notes") == "Yes - Remove all notes") + notesfile.dir.Remove(ckey) + return + +#undef NOTESFILE +*/ + +//Hijacking this file for BS12 playernotes functions. I like this ^ one systemm alright, but converting sounds too bothersome~ Chinsky. + +/proc/notes_add(var/key, var/note, var/mob/usr) + if (!key || !note) + return + + //Loading list of notes for this key + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos) infos = list() + + //Overly complex timestamp creation + var/modifyer = "th" + switch(time2text(world.timeofday, "DD")) + if("01","21","31") + modifyer = "st" + if("02","22",) + modifyer = "nd" + if("03","23") + modifyer = "rd" + var/day_string = "[time2text(world.timeofday, "DD")][modifyer]" + if(copytext(day_string,1,2) == "0") + day_string = copytext(day_string,2) + var/full_date = time2text(world.timeofday, "DDD, Month DD of YYYY") + var/day_loc = findtext(full_date, time2text(world.timeofday, "DD")) + + var/datum/player_info/P = new + if (usr) + P.author = usr.key + P.rank = usr.client.holder.rank + else + P.author = "Adminbot" + P.rank = "Friendly Robot" + P.content = note + P.timestamp = "[copytext(full_date,1,day_loc)][day_string][copytext(full_date,day_loc+2)]" + + infos += P + info << infos + + message_admins("\blue [key_name_admin(usr)] has edited [key]'s notes.") + log_admin("[key_name(usr)] has edited [key]'s notes.") + + qdel(info) + + //Updating list of keys with notes on them + var/savefile/note_list = new("data/player_notes.sav") + var/list/note_keys + note_list >> note_keys + if(!note_keys) note_keys = list() + if(!note_keys.Find(key)) note_keys += key + note_list << note_keys + qdel(note_list) + + +/proc/notes_del(var/key, var/index) + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos || infos.len < index) return + + var/datum/player_info/item = infos[index] + infos.Remove(item) + info << infos + + message_admins("\blue [key_name_admin(usr)] deleted one of [key]'s notes.") + log_admin("[key_name(usr)] deleted one of [key]'s notes.") + + qdel(info) + +/proc/show_player_info_irc(var/key as text) + var/dat = " Info on [key]%0D%0A" + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos) + dat = "No information found on the given key." + else + for(var/datum/player_info/I in infos) + dat += "[I.content]%0D%0Aby [I.author] ([I.rank]) on [I.timestamp]%0D%0A%0D%0A" + + return dat diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index fc2ee0a0b2..ffa64ce64f 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -745,7 +745,7 @@ log_admin("[key_name(usr)] booted [key_name(M)].") message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1) //M.client = null - del(M.client) + qdel(M.client) /* //Player Notes else if(href_list["notes"]) @@ -811,8 +811,8 @@ log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - del(M.client) - //del(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. + qdel(M.client) + //qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. if("No") if(!check_rights(R_BAN)) return var/reason = sanitize(input(usr,"Reason?","reason","Griefer") as text|null) @@ -836,8 +836,8 @@ feedback_inc("ban_perma",1) DB_ban_record(BANTYPE_PERMA, M, -1, reason) - del(M.client) - //del(M) + qdel(M.client) + //qdel(M) if("Cancel") return @@ -1301,7 +1301,7 @@ S.victim = M S.loc = M.loc spawn(20) - del(S) + qdel(S) var/turf/simulated/floor/T = get_turf(M) if(istype(T)) @@ -1317,21 +1317,27 @@ M.stuttering = 20 else if(href_list["CentcommReply"]) - var/mob/living/carbon/human/H = locate(href_list["CentcommReply"]) - if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" - return - if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) - usr << "The person you are trying to contact is not wearing a headset" + var/mob/living/L = locate(href_list["CentcommReply"]) + if(!istype(L)) + usr << "This can only be used on instances of type /mob/living/" return - var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcomm", "")) - if(!input) return + if(L.can_centcom_reply()) + var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from Centcomm", "")) + if(!input) return + + src.owner << "You sent [input] to [L] via a secure channel." + log_admin("[src.owner] replied to [key_name(L)]'s Centcomm message with the message [input].") + message_admins("[src.owner] replied to [key_name(L)]'s Centcom message with: \"[input]\"") + if(!L.isAI()) + L << "You hear something crackle in your headset for a moment before a voice speaks." + L << "Please stand by for a message from Central Command." + L << "Message as follows." + L << "[input]" + L << "Message ends." + else + src.owner << "The person you are trying to contact does not have functional radio equipment." - src.owner << "You sent [input] to [H] via a secure channel." - log_admin("[src.owner] replied to [key_name(H)]'s Centcomm message with the message [input].") - message_admins("[src.owner] replied to [key_name(H)]'s Centcom message with: \"[input]\"") - H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. \"[input]\" Message ends.\"" else if(href_list["SyndicateReply"]) var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"]) @@ -1363,8 +1369,8 @@ var/data = "" var/obj/item/weapon/paper_bundle/B = fax - for (var/page = 1, page <= B.amount, page++) - var/obj/pageobj = B.contents[page] + for (var/page = 1, page <= B.pages.len, page++) + var/obj/pageobj = B.pages[page] data += "Page [page] - [pageobj.name]
        " usr << browse(data, "window=[B.name]") @@ -1377,11 +1383,11 @@ if (!bundle) return - if (istype(bundle.contents[page], /obj/item/weapon/paper)) - var/obj/item/weapon/paper/P = bundle.contents[page] + if (istype(bundle.pages[page], /obj/item/weapon/paper)) + var/obj/item/weapon/paper/P = bundle.pages[page] P.show_content(src.owner, 1) - else if (istype(bundle.contents[page], /obj/item/weapon/photo)) - var/obj/item/weapon/photo/H = bundle.contents[page] + else if (istype(bundle.pages[page], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/H = bundle.pages[page] H.show(src.owner) return @@ -1418,7 +1424,7 @@ src.owner << "\red Message reply failed." spawn(100) - del(P) + qdel(P) return else if(href_list["SolGovFaxReply"]) @@ -1663,28 +1669,28 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SC") for(var/obj/item/clothing/under/O in world) - del(O) + qdel(O) ok = 1 if("sec_all_clothes") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SAC") for(var/obj/item/clothing/O in world) - del(O) + qdel(O) ok = 1 if("sec_classic1") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SC1") for(var/obj/item/clothing/suit/fire/O in world) - del(O) + qdel(O) for(var/obj/structure/grille/O in world) - del(O) + qdel(O) /* for(var/obj/machinery/vehicle/pod/O in world) for(var/mob/M in src) M.loc = src.loc if (M.client) M.client.perspective = MOB_PERSPECTIVE M.client.eye = M - del(O) + qdel(O) ok = 1*/ if("monkey") feedback_inc("admin_secrets_fun_used",1) @@ -2038,7 +2044,7 @@ var/turf/T = pick(blobstart) var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 ) spawn(rand(100, 600)) - del(bh) + qdel(bh) if("timeanomalies") //dear god this code was awful :P Still needs further optimisation feedback_inc("admin_secrets_fun_used",1) @@ -2210,7 +2216,6 @@ for(var/obj/item/clothing/under/W in world) W.icon_state = "schoolgirl" W.item_state = "w_suit" - W.item_color = "schoolgirl" message_admins("[key_name_admin(usr)] activated Japanese Animes mode") world << sound('sound/AI/animes.ogg') if("paintball") @@ -2251,6 +2256,33 @@ feedback_add_details("admin_secrets_fun_used","OO") only_one() message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)") + + if("togglenarsie") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","NA") + var/choice = input("How do you wish for narsie to interact with her surroundings?") in list("CultStation13", "Nar-Singulo") + if(choice == "CultStation13") + message_admins("[key_name_admin(usr)] has set narsie's behaviour to \"CultStation13\".") + narsie_behaviour = "CultStation13" + if(choice == "Nar-Singulo") + message_admins("[key_name_admin(usr)] has set narsie's behaviour to \"Nar-Singulo\".") + narsie_behaviour = "Nar-Singulo" + if("hellonearth") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","NS") + var/choice = input("You sure you want to end the round and summon narsie at your location? Misuse of this could result in removal of flags or halarity.") in list("PRAISE SATAN", "Cancel") + if(choice == "PRAISE SATAN") + new /obj/singularity/narsie/large(get_turf(usr)) + message_admins("[key_name_admin(usr)] has summoned narsie and brought about a new realm of suffering.") + if("supermattercascade") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","SC") + var/choice = input("You sure you want to destroy the universe and create a large explosion at your location? Misuse of this could result in removal of flags or halarity.") in list("NO TIME TO EXPLAIN", "Cancel") + if(choice == "NO TIME TO EXPLAIN") + explosion(get_turf(usr), 8, 16, 24, 32, 1) + new /turf/unsimulated/wall/supermatter(get_turf(usr)) + SetUniversalState(/datum/universal_state/supermatter_cascade) + message_admins("[key_name_admin(usr)] has managed to destroy the universe with a supermatter cascade. Good job, [key_name_admin(usr)]") if(usr) log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]") if (ok) @@ -2619,3 +2651,12 @@ if("list") PlayerNotesPage(text2num(href_list["index"])) return + +mob/living/proc/can_centcom_reply() + return 0 + +mob/living/carbon/human/can_centcom_reply() + return istype(l_ear, /obj/item/device/radio/headset) || istype(r_ear, /obj/item/device/radio/headset) + +mob/living/silicon/ai/can_centcom_reply() + return common_radio != null && !check_unable(2) \ No newline at end of file diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index 914ba1b5df..e5d6dc2661 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -26,7 +26,7 @@ // if(!istates.Find(O.item_state)) // text += "[O.type] MISSING NORMAL ICON CALLED\n\"[O.item_state]\" IN \"[O.icon]\"\n" //text+="\n" - del(O) + qdel(O) if(text) var/F = file("broken_icons.txt") fdel(F) diff --git a/code/modules/admin/verbs/SDQL.dm b/code/modules/admin/verbs/SDQL.dm index d8626da403..a98cc3a1d9 100644 --- a/code/modules/admin/verbs/SDQL.dm +++ b/code/modules/admin/verbs/SDQL.dm @@ -1,497 +1,497 @@ - -//Structured Datum Query Language. Basically SQL meets BYOND objects. - -//Note: For use in BS12, need text_starts_with proc, and to modify the action on select to use BS12's object edit command(s). - -/client/proc/SDQL_query(query_text as message) - set category = "Admin" - if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. - message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") - log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") - - var/list/query_list = SDQL_tokenize(query_text) - - if(query_list.len < 2) - if(query_list.len > 0) - usr << "\red SDQL: Too few discrete tokens in query \"[query_text]\". Please check your syntax and try again." - return - - if(!(lowertext(query_list[1]) in list("select", "delete", "update"))) - usr << "\red SDQL: Unknown query type: \"[query_list[1]]\" in query \"[query_text]\". Please check your syntax and try again." - return - - var/list/types = list() - - var/i - for(i = 2; i <= query_list.len; i += 2) - types += query_list[i] - - if(i + 1 >= query_list.len || query_list[i + 1] != ",") - break - - i++ - - var/list/from = list() - - if(i <= query_list.len) - if(lowertext(query_list[i]) in list("from", "in")) - for(i++; i <= query_list.len; i += 2) - from += query_list[i] - - if(i + 1 >= query_list.len || query_list[i + 1] != ",") - break - - i++ - - if(from.len < 1) - from += "world" - - var/list/set_vars = list() - - if(lowertext(query_list[1]) == "update") - if(i <= query_list.len && lowertext(query_list[i]) == "set") - for(i++; i <= query_list.len; i++) - if(i + 2 <= query_list.len && query_list[i + 1] == "=") - set_vars += query_list[i] - set_vars[query_list[i]] = query_list[i + 2] - - else - usr << "\red SDQL: Invalid set parameter in query \"[query_text]\". Please check your syntax and try again." - return - - i += 3 - - if(i >= query_list.len || query_list[i] != ",") - break - - if(set_vars.len < 1) - usr << "\red SDQL: Invalid or missing set in query \"[query_text]\". Please check your syntax and try again." - return - - var/list/where = list() - - if(i <= query_list.len && lowertext(query_list[i]) == "where") - where = query_list.Copy(i + 1) - - var/list/from_objs = list() - if("world" in from) - from_objs += world - else - for(var/f in from) - if(copytext(f, 1, 2) == "'" || copytext(f, 1, 2) == "\"") - from_objs += locate(copytext(f, 2, length(f))) - else if(copytext(f, 1, 2) != "/") - from_objs += locate(f) - else - var/f2 = text2path(f) - if(text_starts_with(f, "/mob")) - for(var/mob/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/turf/space")) - for(var/turf/space/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/turf/simulated")) - for(var/turf/simulated/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/turf/unsimulated")) - for(var/turf/unsimulated/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/turf")) - for(var/turf/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/area")) - for(var/area/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/obj/item")) - for(var/obj/item/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/obj/machinery")) - for(var/obj/machinery/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/obj")) - for(var/obj/m in world) - if(istype(m, f2)) - from_objs += m - - else if(text_starts_with(f, "/atom")) - for(var/atom/m in world) - if(istype(m, f2)) - from_objs += m -/* - else - for(var/datum/m in world) - if(istype(m, f2)) - from_objs += m -*/ - - var/list/objs = list() - - for(var/from_obj in from_objs) - if("*" in types) - objs += from_obj:contents - else - for(var/f in types) - if(copytext(f, 1, 2) == "'" || copytext(f, 1, 2) == "\"") - objs += locate(copytext(f, 2, length(f))) in from_obj - else if(copytext(f, 1, 2) != "/") - objs += locate(f) in from_obj - else - var/f2 = text2path(f) - if(text_starts_with(f, "/mob")) - for(var/mob/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/turf/space")) - for(var/turf/space/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/turf/simulated")) - for(var/turf/simulated/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/turf/unsimulated")) - for(var/turf/unsimulated/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/turf")) - for(var/turf/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/area")) - for(var/area/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/obj/item")) - for(var/obj/item/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/obj/machinery")) - for(var/obj/machinery/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/obj")) - for(var/obj/m in from_obj) - if(istype(m, f2)) - objs += m - - else if(text_starts_with(f, "/atom")) - for(var/atom/m in from_obj) - if(istype(m, f2)) - objs += m - - else - for(var/datum/m in from_obj) - if(istype(m, f2)) - objs += m - - - for(var/datum/t in objs) - var/currently_false = 0 - for(i = 1, i - 1 < where.len, i++) - var/v = where[i++] - var/compare_op = where[i++] - if(!(compare_op in list("==", "=", "<>", "<", ">", "<=", ">=", "!="))) - usr << "\red SDQL: Unknown comparison operator [compare_op] in where clause following [v] in query \"[query_text]\". Please check your syntax and try again." - return - - var/j - for(j = i, j <= where.len, j++) - if(lowertext(where[j]) in list("and", "or", ";")) - break - - if(!currently_false) - var/value = SDQL_text2value(t, v) - var/result = SDQL_evaluate(t, where.Copy(i, j)) - - switch(compare_op) - if("=", "==") - currently_false = !(value == result) - - if("!=", "<>") - currently_false = !(value != result) - - if("<") - currently_false = !(value < result) - - if(">") - currently_false = !(value > result) - - if("<=") - currently_false = !(value <= result) - - if(">=") - currently_false = !(value >= result) - - - if(j > where.len || lowertext(where[j]) == ";") - break - else if(lowertext(where[j]) == "or") - if(currently_false) - currently_false = 0 - else - break - - i = j - - if(currently_false) - objs -= t - - - - usr << "\blue SQDL Query: [query_text]" - message_admins("[usr] executed SDQL query: \"[query_text]\".") -/* - for(var/t in types) - usr << "Type: [t]" - - for(var/t in from) - usr << "From: [t]" - - for(var/t in set_vars) - usr << "Set: [t] = [set_vars[t]]" - - if(where.len) - var/where_str = "" - for(var/t in where) - where_str += "[t] " - - usr << "Where: [where_str]" - - usr << "From objects:" - for(var/datum/t in from_objs) - usr << t - - usr << "Objects:" - for(var/datum/t in objs) - usr << t -*/ - switch(lowertext(query_list[1])) - if("delete") - for(var/datum/t in objs) - del t - - if("update") - for(var/datum/t in objs) - objs[t] = list() - for(var/v in set_vars) - if(v in t.vars) - objs[t][v] = SDQL_text2value(t, set_vars[v]) - - for(var/datum/t in objs) - for(var/v in objs[t]) - t.vars[v] = objs[t][v] - - if("select") - var/text = "" - for(var/datum/t in objs) - if(istype(t, /atom)) - var/atom/a = t - - if(a.x) - text += "\ref[t]: [t] at ([a.x], [a.y], [a.z])
        " - - else if(a.loc && a.loc.x) - text += "\ref[t]: [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
        " - - else - text += "\ref[t]: [t]
        " - - else - text += "\ref[t]: [t]
        " - - //text += "[t]
        " - usr << browse(text, "window=sdql_result") - - -/client/Topic(href,href_list[],hsrc) - if(href_list["SDQL_select"]) - debug_variables(locate(href_list["SDQL_select"])) - - ..() - - -/proc/SDQL_evaluate(datum/object, list/equation) - if(equation.len == 0) - return null - - else if(equation.len == 1) - return SDQL_text2value(object, equation[1]) - - else if(equation[1] == "!") - return !SDQL_evaluate(object, equation.Copy(2)) - - else if(equation[1] == "-") - return -SDQL_evaluate(object, equation.Copy(2)) - - - else - usr << "\red SDQL: Sorry, equations not yet supported :(" - return null - - -/proc/SDQL_text2value(datum/object, text) - if(text2num(text) != null) - return text2num(text) - else if(text == "null") - return null - else if(copytext(text, 1, 2) == "'" || copytext(text, 1, 2) == "\"" ) - return copytext(text, 2, length(text)) - else if(copytext(text, 1, 2) == "/") - return text2path(text) - else - if(findtext(text, ".")) - var/split = findtext(text, ".") - var/v = copytext(text, 1, split) - - if((v in object.vars) && istype(object.vars[v], /datum)) - return SDQL_text2value(object.vars[v], copytext(text, split + 1)) - else - return null - - else - if(text in object.vars) - return object.vars[text] - else - return null - - -/proc/text_starts_with(text, start) - if(copytext(text, 1, length(start) + 1) == start) - return 1 - else - return 0 - - - - - -/proc/SDQL_tokenize(query_text) - - var/list/whitespace = list(" ", "\n", "\t") - var/list/single = list("(", ")", ",", "+", "-") - var/list/multi = list( - "=" = list("", "="), - "<" = list("", "=", ">"), - ">" = list("", "="), - "!" = list("", "=")) - - var/word = "" - var/list/query_list = list() - var/len = length(query_text) - - for(var/i = 1, i <= len, i++) - var/char = copytext(query_text, i, i + 1) - - if(char in whitespace) - if(word != "") - query_list += word - word = "" - - else if(char in single) - if(word != "") - query_list += word - word = "" - - query_list += char - - else if(char in multi) - if(word != "") - query_list += word - word = "" - - var/char2 = copytext(query_text, i + 1, i + 2) - - if(char2 in multi[char]) - query_list += "[char][char2]" - i++ - - else - query_list += char - - else if(char == "'") - if(word != "") - usr << "\red SDQL: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." - return null - - word = "'" - - for(i++, i <= len, i++) - char = copytext(query_text, i, i + 1) - - if(char == "'") - if(copytext(query_text, i + 1, i + 2) == "'") - word += "'" - i++ - - else - break - - else - word += char - - if(i > len) - usr << "\red SDQL: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again." - return null - - query_list += "[word]'" - word = "" - - else if(char == "\"") - if(word != "") - usr << "\red SDQL: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." - return null - - word = "\"" - - for(i++, i <= len, i++) - char = copytext(query_text, i, i + 1) - - if(char == "\"") - if(copytext(query_text, i + 1, i + 2) == "'") - word += "\"" - i++ - - else - break - - else - word += char - - if(i > len) - usr << "\red SDQL: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again." - return null - - query_list += "[word]\"" - word = "" - - else - word += char - - if(word != "") - query_list += word - - return query_list + +//Structured Datum Query Language. Basically SQL meets BYOND objects. + +//Note: For use in BS12, need text_starts_with proc, and to modify the action on select to use BS12's object edit command(s). + +/client/proc/SDQL_query(query_text as message) + set category = "Admin" + if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. + message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") + log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") + + var/list/query_list = SDQL_tokenize(query_text) + + if(query_list.len < 2) + if(query_list.len > 0) + usr << "\red SDQL: Too few discrete tokens in query \"[query_text]\". Please check your syntax and try again." + return + + if(!(lowertext(query_list[1]) in list("select", "delete", "update"))) + usr << "\red SDQL: Unknown query type: \"[query_list[1]]\" in query \"[query_text]\". Please check your syntax and try again." + return + + var/list/types = list() + + var/i + for(i = 2; i <= query_list.len; i += 2) + types += query_list[i] + + if(i + 1 >= query_list.len || query_list[i + 1] != ",") + break + + i++ + + var/list/from = list() + + if(i <= query_list.len) + if(lowertext(query_list[i]) in list("from", "in")) + for(i++; i <= query_list.len; i += 2) + from += query_list[i] + + if(i + 1 >= query_list.len || query_list[i + 1] != ",") + break + + i++ + + if(from.len < 1) + from += "world" + + var/list/set_vars = list() + + if(lowertext(query_list[1]) == "update") + if(i <= query_list.len && lowertext(query_list[i]) == "set") + for(i++; i <= query_list.len; i++) + if(i + 2 <= query_list.len && query_list[i + 1] == "=") + set_vars += query_list[i] + set_vars[query_list[i]] = query_list[i + 2] + + else + usr << "\red SDQL: Invalid set parameter in query \"[query_text]\". Please check your syntax and try again." + return + + i += 3 + + if(i >= query_list.len || query_list[i] != ",") + break + + if(set_vars.len < 1) + usr << "\red SDQL: Invalid or missing set in query \"[query_text]\". Please check your syntax and try again." + return + + var/list/where = list() + + if(i <= query_list.len && lowertext(query_list[i]) == "where") + where = query_list.Copy(i + 1) + + var/list/from_objs = list() + if("world" in from) + from_objs += world + else + for(var/f in from) + if(copytext(f, 1, 2) == "'" || copytext(f, 1, 2) == "\"") + from_objs += locate(copytext(f, 2, length(f))) + else if(copytext(f, 1, 2) != "/") + from_objs += locate(f) + else + var/f2 = text2path(f) + if(text_starts_with(f, "/mob")) + for(var/mob/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/turf/space")) + for(var/turf/space/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/turf/simulated")) + for(var/turf/simulated/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/turf/unsimulated")) + for(var/turf/unsimulated/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/turf")) + for(var/turf/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/area")) + for(var/area/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/obj/item")) + for(var/obj/item/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/obj/machinery")) + for(var/obj/machinery/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/obj")) + for(var/obj/m in world) + if(istype(m, f2)) + from_objs += m + + else if(text_starts_with(f, "/atom")) + for(var/atom/m in world) + if(istype(m, f2)) + from_objs += m +/* + else + for(var/datum/m in world) + if(istype(m, f2)) + from_objs += m +*/ + + var/list/objs = list() + + for(var/from_obj in from_objs) + if("*" in types) + objs += from_obj:contents + else + for(var/f in types) + if(copytext(f, 1, 2) == "'" || copytext(f, 1, 2) == "\"") + objs += locate(copytext(f, 2, length(f))) in from_obj + else if(copytext(f, 1, 2) != "/") + objs += locate(f) in from_obj + else + var/f2 = text2path(f) + if(text_starts_with(f, "/mob")) + for(var/mob/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/turf/space")) + for(var/turf/space/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/turf/simulated")) + for(var/turf/simulated/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/turf/unsimulated")) + for(var/turf/unsimulated/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/turf")) + for(var/turf/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/area")) + for(var/area/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/obj/item")) + for(var/obj/item/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/obj/machinery")) + for(var/obj/machinery/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/obj")) + for(var/obj/m in from_obj) + if(istype(m, f2)) + objs += m + + else if(text_starts_with(f, "/atom")) + for(var/atom/m in from_obj) + if(istype(m, f2)) + objs += m + + else + for(var/datum/m in from_obj) + if(istype(m, f2)) + objs += m + + + for(var/datum/t in objs) + var/currently_false = 0 + for(i = 1, i - 1 < where.len, i++) + var/v = where[i++] + var/compare_op = where[i++] + if(!(compare_op in list("==", "=", "<>", "<", ">", "<=", ">=", "!="))) + usr << "\red SDQL: Unknown comparison operator [compare_op] in where clause following [v] in query \"[query_text]\". Please check your syntax and try again." + return + + var/j + for(j = i, j <= where.len, j++) + if(lowertext(where[j]) in list("and", "or", ";")) + break + + if(!currently_false) + var/value = SDQL_text2value(t, v) + var/result = SDQL_evaluate(t, where.Copy(i, j)) + + switch(compare_op) + if("=", "==") + currently_false = !(value == result) + + if("!=", "<>") + currently_false = !(value != result) + + if("<") + currently_false = !(value < result) + + if(">") + currently_false = !(value > result) + + if("<=") + currently_false = !(value <= result) + + if(">=") + currently_false = !(value >= result) + + + if(j > where.len || lowertext(where[j]) == ";") + break + else if(lowertext(where[j]) == "or") + if(currently_false) + currently_false = 0 + else + break + + i = j + + if(currently_false) + objs -= t + + + + usr << "\blue SQDL Query: [query_text]" + message_admins("[usr] executed SDQL query: \"[query_text]\".") +/* + for(var/t in types) + usr << "Type: [t]" + + for(var/t in from) + usr << "From: [t]" + + for(var/t in set_vars) + usr << "Set: [t] = [set_vars[t]]" + + if(where.len) + var/where_str = "" + for(var/t in where) + where_str += "[t] " + + usr << "Where: [where_str]" + + usr << "From objects:" + for(var/datum/t in from_objs) + usr << t + + usr << "Objects:" + for(var/datum/t in objs) + usr << t +*/ + switch(lowertext(query_list[1])) + if("delete") + for(var/datum/t in objs) + qdel(t) + + if("update") + for(var/datum/t in objs) + objs[t] = list() + for(var/v in set_vars) + if(v in t.vars) + objs[t][v] = SDQL_text2value(t, set_vars[v]) + + for(var/datum/t in objs) + for(var/v in objs[t]) + t.vars[v] = objs[t][v] + + if("select") + var/text = "" + for(var/datum/t in objs) + if(istype(t, /atom)) + var/atom/a = t + + if(a.x) + text += "\ref[t]: [t] at ([a.x], [a.y], [a.z])
        " + + else if(a.loc && a.loc.x) + text += "\ref[t]: [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
        " + + else + text += "\ref[t]: [t]
        " + + else + text += "\ref[t]: [t]
        " + + //text += "[t]
        " + usr << browse(text, "window=sdql_result") + + +/client/Topic(href,href_list[],hsrc) + if(href_list["SDQL_select"]) + debug_variables(locate(href_list["SDQL_select"])) + + ..() + + +/proc/SDQL_evaluate(datum/object, list/equation) + if(equation.len == 0) + return null + + else if(equation.len == 1) + return SDQL_text2value(object, equation[1]) + + else if(equation[1] == "!") + return !SDQL_evaluate(object, equation.Copy(2)) + + else if(equation[1] == "-") + return -SDQL_evaluate(object, equation.Copy(2)) + + + else + usr << "\red SDQL: Sorry, equations not yet supported :(" + return null + + +/proc/SDQL_text2value(datum/object, text) + if(text2num(text) != null) + return text2num(text) + else if(text == "null") + return null + else if(copytext(text, 1, 2) == "'" || copytext(text, 1, 2) == "\"" ) + return copytext(text, 2, length(text)) + else if(copytext(text, 1, 2) == "/") + return text2path(text) + else + if(findtext(text, ".")) + var/split = findtext(text, ".") + var/v = copytext(text, 1, split) + + if((v in object.vars) && istype(object.vars[v], /datum)) + return SDQL_text2value(object.vars[v], copytext(text, split + 1)) + else + return null + + else + if(text in object.vars) + return object.vars[text] + else + return null + + +/proc/text_starts_with(text, start) + if(copytext(text, 1, length(start) + 1) == start) + return 1 + else + return 0 + + + + + +/proc/SDQL_tokenize(query_text) + + var/list/whitespace = list(" ", "\n", "\t") + var/list/single = list("(", ")", ",", "+", "-") + var/list/multi = list( + "=" = list("", "="), + "<" = list("", "=", ">"), + ">" = list("", "="), + "!" = list("", "=")) + + var/word = "" + var/list/query_list = list() + var/len = length(query_text) + + for(var/i = 1, i <= len, i++) + var/char = copytext(query_text, i, i + 1) + + if(char in whitespace) + if(word != "") + query_list += word + word = "" + + else if(char in single) + if(word != "") + query_list += word + word = "" + + query_list += char + + else if(char in multi) + if(word != "") + query_list += word + word = "" + + var/char2 = copytext(query_text, i + 1, i + 2) + + if(char2 in multi[char]) + query_list += "[char][char2]" + i++ + + else + query_list += char + + else if(char == "'") + if(word != "") + usr << "\red SDQL: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + return null + + word = "'" + + for(i++, i <= len, i++) + char = copytext(query_text, i, i + 1) + + if(char == "'") + if(copytext(query_text, i + 1, i + 2) == "'") + word += "'" + i++ + + else + break + + else + word += char + + if(i > len) + usr << "\red SDQL: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again." + return null + + query_list += "[word]'" + word = "" + + else if(char == "\"") + if(word != "") + usr << "\red SDQL: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + return null + + word = "\"" + + for(i++, i <= len, i++) + char = copytext(query_text, i, i + 1) + + if(char == "\"") + if(copytext(query_text, i + 1, i + 2) == "'") + word += "\"" + i++ + + else + break + + else + word += char + + if(i > len) + usr << "\red SDQL: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again." + return null + + query_list += "[word]\"" + word = "" + + else + word += char + + if(word != "") + query_list += word + + return query_list diff --git a/code/modules/admin/verbs/SDQL_2.dm b/code/modules/admin/verbs/SDQL_2.dm index 549447da11..236237c23a 100644 --- a/code/modules/admin/verbs/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL_2.dm @@ -1,426 +1,426 @@ - - -/client/proc/SDQL2_query(query_text as message) - set category = "Admin" - if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. - message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") - log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") - - if(!query_text || length(query_text) < 1) - return - - //world << query_text - - var/list/query_list = SDQL2_tokenize(query_text) - - if(!query_list || query_list.len < 1) - return - - var/list/query_tree = SDQL_parse(query_list) - - if(query_tree.len < 1) - return - - var/list/from_objs = list() - var/list/select_types = list() - - switch(query_tree[1]) - if("explain") - SDQL_testout(query_tree["explain"]) - return - - if("call") - if("on" in query_tree) - select_types = query_tree["on"] - else - return - - if("select", "delete", "update") - select_types = query_tree[query_tree[1]] - - from_objs = SDQL_from_objs(query_tree["from"]) - - var/list/objs = list() - - for(var/type in select_types) - var/char = copytext(type, 1, 2) - - if(char == "/" || char == "*") - for(var/from in from_objs) - objs += SDQL_get_all(type, from) - - else if(char == "'" || char == "\"") - objs += locate(copytext(type, 2, length(type))) - - if("where" in query_tree) - var/objs_temp = objs - objs = list() - for(var/datum/d in objs_temp) - if(SDQL_expression(d, query_tree["where"])) - objs += d - - //usr << "Query: [query_text]" - message_admins("[usr] executed SDQL query: \"[query_text]\".") - - switch(query_tree[1]) - if("delete") - for(var/datum/d in objs) - del d - - if("select") - var/text = "" - for(var/datum/t in objs) - if(istype(t, /atom)) - var/atom/a = t - - if(a.x) - text += "\ref[t]: [t] at ([a.x], [a.y], [a.z])
        " - - else if(a.loc && a.loc.x) - text += "\ref[t]: [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
        " - - else - text += "\ref[t]: [t]
        " - - else - text += "\ref[t]: [t]
        " - - usr << browse(text, "window=SDQL-result") - - if("update") - if("set" in query_tree) - var/list/set_list = query_tree["set"] - for(var/datum/d in objs) - var/list/vals = list() - for(var/v in set_list) - if(v in d.vars) - vals += v - vals[v] = SDQL_expression(d, set_list[v]) - - if(istype(d, /turf)) - for(var/v in vals) - if(v == "x" || v == "y" || v == "z") - continue - - d.vars[v] = vals[v] - - else - for(var/v in vals) - d.vars[v] = vals[v] - - - - - -/proc/SDQL_parse(list/query_list) - var/datum/SDQL_parser/parser = new(query_list) - var/list/query_tree = parser.parse() - - del(parser) - - return query_tree - - - -/proc/SDQL_testout(list/query_tree, indent = 0) - var/spaces = "" - for(var/s = 0, s < indent, s++) - spaces += " " - - for(var/item in query_tree) - if(istype(item, /list)) - world << "[spaces](" - SDQL_testout(item, indent + 1) - world << "[spaces])" - - else - world << "[spaces][item]" - - if(!isnum(item) && query_tree[item]) - - if(istype(query_tree[item], /list)) - world << "[spaces] (" - SDQL_testout(query_tree[item], indent + 2) - world << "[spaces] )" - - else - world << "[spaces] [query_tree[item]]" - - - -/proc/SDQL_from_objs(list/tree) - if("world" in tree) - return list(world) - - var/list/out = list() - - for(var/type in tree) - var/char = copytext(type, 1, 2) - - if(char == "/") - out += SDQL_get_all(type, world) - - else if(char == "'" || char == "\"") - out += locate(copytext(type, 2, length(type))) - - return out - - -/proc/SDQL_get_all(type, location) - var/list/out = list() - - if(type == "*") - for(var/datum/d in location) - out += d - - return out - - type = text2path(type) - - if(ispath(type, /mob)) - for(var/mob/d in location) - if(istype(d, type)) - out += d - - else if(ispath(type, /turf)) - for(var/turf/d in location) - if(istype(d, type)) - out += d - - else if(ispath(type, /obj)) - for(var/obj/d in location) - if(istype(d, type)) - out += d - - else if(ispath(type, /area)) - for(var/area/d in location) - if(istype(d, type)) - out += d - - else if(ispath(type, /atom)) - for(var/atom/d in location) - if(istype(d, type)) - out += d - - else - for(var/datum/d in location) - if(istype(d, type)) - out += d - - return out - - -/proc/SDQL_expression(datum/object, list/expression, start = 1) - var/result = 0 - var/val - - for(var/i = start, i <= expression.len, i++) - var/op = "" - - if(i > start) - op = expression[i] - i++ - - var/list/ret = SDQL_value(object, expression, i) - val = ret["val"] - i = ret["i"] - - if(op != "") - switch(op) - if("+") - result += val - if("-") - result -= val - if("*") - result *= val - if("/") - result /= val - if("&") - result &= val - if("|") - result |= val - if("^") - result ^= val - if("=", "==") - result = (result == val) - if("!=", "<>") - result = (result != val) - if("<") - result = (result < val) - if("<=") - result = (result <= val) - if(">") - result = (result > val) - if(">=") - result = (result >= val) - if("and", "&&") - result = (result && val) - if("or", "||") - result = (result || val) - else - usr << "\red SDQL2: Unknown op [op]" - result = null - else - result = val - - return result - -/proc/SDQL_value(datum/object, list/expression, start = 1) - var/i = start - var/val = null - - if(i > expression.len) - return list("val" = null, "i" = i) - - if(istype(expression[i], /list)) - val = SDQL_expression(object, expression[i]) - - else if(expression[i] == "!") - var/list/ret = SDQL_value(object, expression, i + 1) - val = !ret["val"] - i = ret["i"] - - else if(expression[i] == "~") - var/list/ret = SDQL_value(object, expression, i + 1) - val = ~ret["val"] - i = ret["i"] - - else if(expression[i] == "-") - var/list/ret = SDQL_value(object, expression, i + 1) - val = -ret["val"] - i = ret["i"] - - else if(expression[i] == "null") - val = null - - else if(isnum(expression[i])) - val = expression[i] - - else if(copytext(expression[i], 1, 2) in list("'", "\"")) - val = copytext(expression[i], 2, length(expression[i])) - - else - val = SDQL_var(object, expression, i) - i = expression.len - - return list("val" = val, "i" = i) - -/proc/SDQL_var(datum/object, list/expression, start = 1) - - if(expression[start] in object.vars) - - if(start < expression.len && expression[start + 1] == ".") - return SDQL_var(object.vars[expression[start]], expression[start + 2]) - - else - return object.vars[expression[start]] - - else - return null - -/proc/SDQL2_tokenize(query_text) - - var/list/whitespace = list(" ", "\n", "\t") - var/list/single = list("(", ")", ",", "+", "-", ".") - var/list/multi = list( - "=" = list("", "="), - "<" = list("", "=", ">"), - ">" = list("", "="), - "!" = list("", "=")) - - var/word = "" - var/list/query_list = list() - var/len = length(query_text) - - for(var/i = 1, i <= len, i++) - var/char = copytext(query_text, i, i + 1) - - if(char in whitespace) - if(word != "") - query_list += word - word = "" - - else if(char in single) - if(word != "") - query_list += word - word = "" - - query_list += char - - else if(char in multi) - if(word != "") - query_list += word - word = "" - - var/char2 = copytext(query_text, i + 1, i + 2) - - if(char2 in multi[char]) - query_list += "[char][char2]" - i++ - - else - query_list += char - - else if(char == "'") - if(word != "") - usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." - return null - - word = "'" - - for(i++, i <= len, i++) - char = copytext(query_text, i, i + 1) - - if(char == "'") - if(copytext(query_text, i + 1, i + 2) == "'") - word += "'" - i++ - - else - break - - else - word += char - - if(i > len) - usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again." - return null - - query_list += "[word]'" - word = "" - - else if(char == "\"") - if(word != "") - usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." - return null - - word = "\"" - - for(i++, i <= len, i++) - char = copytext(query_text, i, i + 1) - - if(char == "\"") - if(copytext(query_text, i + 1, i + 2) == "'") - word += "\"" - i++ - - else - break - - else - word += char - - if(i > len) - usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again." - return null - - query_list += "[word]\"" - word = "" - - else - word += char - - if(word != "") - query_list += word - - return query_list + + +/client/proc/SDQL2_query(query_text as message) + set category = "Admin" + if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. + message_admins("\red ERROR: Non-admin [usr.key] attempted to execute a SDQL query!") + log_admin("Non-admin [usr.key] attempted to execute a SDQL query!") + + if(!query_text || length(query_text) < 1) + return + + //world << query_text + + var/list/query_list = SDQL2_tokenize(query_text) + + if(!query_list || query_list.len < 1) + return + + var/list/query_tree = SDQL_parse(query_list) + + if(query_tree.len < 1) + return + + var/list/from_objs = list() + var/list/select_types = list() + + switch(query_tree[1]) + if("explain") + SDQL_testout(query_tree["explain"]) + return + + if("call") + if("on" in query_tree) + select_types = query_tree["on"] + else + return + + if("select", "delete", "update") + select_types = query_tree[query_tree[1]] + + from_objs = SDQL_from_objs(query_tree["from"]) + + var/list/objs = list() + + for(var/type in select_types) + var/char = copytext(type, 1, 2) + + if(char == "/" || char == "*") + for(var/from in from_objs) + objs += SDQL_get_all(type, from) + + else if(char == "'" || char == "\"") + objs += locate(copytext(type, 2, length(type))) + + if("where" in query_tree) + var/objs_temp = objs + objs = list() + for(var/datum/d in objs_temp) + if(SDQL_expression(d, query_tree["where"])) + objs += d + + //usr << "Query: [query_text]" + message_admins("[usr] executed SDQL query: \"[query_text]\".") + + switch(query_tree[1]) + if("delete") + for(var/datum/d in objs) + qdel(d) + + if("select") + var/text = "" + for(var/datum/t in objs) + if(istype(t, /atom)) + var/atom/a = t + + if(a.x) + text += "\ref[t]: [t] at ([a.x], [a.y], [a.z])
        " + + else if(a.loc && a.loc.x) + text += "\ref[t]: [t] in [a.loc] at ([a.loc.x], [a.loc.y], [a.loc.z])
        " + + else + text += "\ref[t]: [t]
        " + + else + text += "\ref[t]: [t]
        " + + usr << browse(text, "window=SDQL-result") + + if("update") + if("set" in query_tree) + var/list/set_list = query_tree["set"] + for(var/datum/d in objs) + var/list/vals = list() + for(var/v in set_list) + if(v in d.vars) + vals += v + vals[v] = SDQL_expression(d, set_list[v]) + + if(istype(d, /turf)) + for(var/v in vals) + if(v == "x" || v == "y" || v == "z") + continue + + d.vars[v] = vals[v] + + else + for(var/v in vals) + d.vars[v] = vals[v] + + + + + +/proc/SDQL_parse(list/query_list) + var/datum/SDQL_parser/parser = new(query_list) + var/list/query_tree = parser.parse() + + qdel(parser) + + return query_tree + + + +/proc/SDQL_testout(list/query_tree, indent = 0) + var/spaces = "" + for(var/s = 0, s < indent, s++) + spaces += " " + + for(var/item in query_tree) + if(istype(item, /list)) + world << "[spaces](" + SDQL_testout(item, indent + 1) + world << "[spaces])" + + else + world << "[spaces][item]" + + if(!isnum(item) && query_tree[item]) + + if(istype(query_tree[item], /list)) + world << "[spaces] (" + SDQL_testout(query_tree[item], indent + 2) + world << "[spaces] )" + + else + world << "[spaces] [query_tree[item]]" + + + +/proc/SDQL_from_objs(list/tree) + if("world" in tree) + return list(world) + + var/list/out = list() + + for(var/type in tree) + var/char = copytext(type, 1, 2) + + if(char == "/") + out += SDQL_get_all(type, world) + + else if(char == "'" || char == "\"") + out += locate(copytext(type, 2, length(type))) + + return out + + +/proc/SDQL_get_all(type, location) + var/list/out = list() + + if(type == "*") + for(var/datum/d in location) + out += d + + return out + + type = text2path(type) + + if(ispath(type, /mob)) + for(var/mob/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /turf)) + for(var/turf/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /obj)) + for(var/obj/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /area)) + for(var/area/d in location) + if(istype(d, type)) + out += d + + else if(ispath(type, /atom)) + for(var/atom/d in location) + if(istype(d, type)) + out += d + + else + for(var/datum/d in location) + if(istype(d, type)) + out += d + + return out + + +/proc/SDQL_expression(datum/object, list/expression, start = 1) + var/result = 0 + var/val + + for(var/i = start, i <= expression.len, i++) + var/op = "" + + if(i > start) + op = expression[i] + i++ + + var/list/ret = SDQL_value(object, expression, i) + val = ret["val"] + i = ret["i"] + + if(op != "") + switch(op) + if("+") + result += val + if("-") + result -= val + if("*") + result *= val + if("/") + result /= val + if("&") + result &= val + if("|") + result |= val + if("^") + result ^= val + if("=", "==") + result = (result == val) + if("!=", "<>") + result = (result != val) + if("<") + result = (result < val) + if("<=") + result = (result <= val) + if(">") + result = (result > val) + if(">=") + result = (result >= val) + if("and", "&&") + result = (result && val) + if("or", "||") + result = (result || val) + else + usr << "\red SDQL2: Unknown op [op]" + result = null + else + result = val + + return result + +/proc/SDQL_value(datum/object, list/expression, start = 1) + var/i = start + var/val = null + + if(i > expression.len) + return list("val" = null, "i" = i) + + if(istype(expression[i], /list)) + val = SDQL_expression(object, expression[i]) + + else if(expression[i] == "!") + var/list/ret = SDQL_value(object, expression, i + 1) + val = !ret["val"] + i = ret["i"] + + else if(expression[i] == "~") + var/list/ret = SDQL_value(object, expression, i + 1) + val = ~ret["val"] + i = ret["i"] + + else if(expression[i] == "-") + var/list/ret = SDQL_value(object, expression, i + 1) + val = -ret["val"] + i = ret["i"] + + else if(expression[i] == "null") + val = null + + else if(isnum(expression[i])) + val = expression[i] + + else if(copytext(expression[i], 1, 2) in list("'", "\"")) + val = copytext(expression[i], 2, length(expression[i])) + + else + val = SDQL_var(object, expression, i) + i = expression.len + + return list("val" = val, "i" = i) + +/proc/SDQL_var(datum/object, list/expression, start = 1) + + if(expression[start] in object.vars) + + if(start < expression.len && expression[start + 1] == ".") + return SDQL_var(object.vars[expression[start]], expression[start + 2]) + + else + return object.vars[expression[start]] + + else + return null + +/proc/SDQL2_tokenize(query_text) + + var/list/whitespace = list(" ", "\n", "\t") + var/list/single = list("(", ")", ",", "+", "-", ".") + var/list/multi = list( + "=" = list("", "="), + "<" = list("", "=", ">"), + ">" = list("", "="), + "!" = list("", "=")) + + var/word = "" + var/list/query_list = list() + var/len = length(query_text) + + for(var/i = 1, i <= len, i++) + var/char = copytext(query_text, i, i + 1) + + if(char in whitespace) + if(word != "") + query_list += word + word = "" + + else if(char in single) + if(word != "") + query_list += word + word = "" + + query_list += char + + else if(char in multi) + if(word != "") + query_list += word + word = "" + + var/char2 = copytext(query_text, i + 1, i + 2) + + if(char2 in multi[char]) + query_list += "[char][char2]" + i++ + + else + query_list += char + + else if(char == "'") + if(word != "") + usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + return null + + word = "'" + + for(i++, i <= len, i++) + char = copytext(query_text, i, i + 1) + + if(char == "'") + if(copytext(query_text, i + 1, i + 2) == "'") + word += "'" + i++ + + else + break + + else + word += char + + if(i > len) + usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again." + return null + + query_list += "[word]'" + word = "" + + else if(char == "\"") + if(word != "") + usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + return null + + word = "\"" + + for(i++, i <= len, i++) + char = copytext(query_text, i, i + 1) + + if(char == "\"") + if(copytext(query_text, i + 1, i + 2) == "'") + word += "\"" + i++ + + else + break + + else + word += char + + if(i > len) + usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again." + return null + + query_list += "[word]\"" + word = "" + + else + word += char + + if(word != "") + query_list += word + + return query_list diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 71bdabf4be..4b90283a56 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -8,7 +8,7 @@ M.client.show_popup_menus = 1 for(var/obj/effect/bmode/buildholder/H) if(H.cl == M.client) - del(H) + qdel(H) else log_admin("[key_name(usr)] has entered build mode.") M.client.buildmode = 1 @@ -220,7 +220,7 @@ T.ChangeTurf(/turf/simulated/wall) return else if(istype(object,/obj)) - del(object) + qdel(object) return else if(istype(object,/turf) && pa.Find("alt") && pa.Find("left")) new/obj/machinery/door/airlock(get_turf(object)) @@ -250,7 +250,7 @@ var/obj/A = new holder.buildmode.objholder (get_turf(object)) A.set_dir(holder.builddir.dir) else if(pa.Find("right")) - if(isobj(object)) del(object) + if(isobj(object)) qdel(object) if(pa.Find("middle")) holder.buildmode.objholder = text2path("[object.type]") if(holder.buildmode.objsay) usr << "[object.type]" diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index e21de8641d..a643b370fc 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,12 +1,17 @@ /client/proc/cinematic(var/cinematic as anything in list("explosion",null)) - set name = "cinematic" + set name = "Cinematic" set category = "Fun" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. - set hidden = 1 + + if(!check_rights(R_FUN)) + return + if(alert("Are you sure you want to run [cinematic]?","Confirmation","Yes","No")=="No") return if(!ticker) return switch(cinematic) if("explosion") + if(alert("The game will be over. Are you really sure?", "Confirmation" ,"Continue", "Cancel") == "Cancel") + return var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num var/override switch(parameter) @@ -15,4 +20,8 @@ if(0) override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","mercenary","AI malfunction","no override") ticker.station_explosion_cinematic(parameter,override) + + log_admin("[key_name(src)] launched cinematic \"[cinematic]\"") + message_admins("[key_name_admin(src)] launched cinematic \"[cinematic]\"", 1) + return \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 325f04f9e8..62c9de0d6f 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -350,7 +350,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(hsbitem) for(var/atom/O in world) if(istype(O, hsbitem)) - del(O) + qdel(O) log_admin("[key_name(src)] has deleted all instances of [hsbitem].") message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0) feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -420,7 +420,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/mob/adminmob = src.mob M.ckey = src.ckey if( isobserver(adminmob) ) - del(adminmob) + qdel(adminmob) feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -555,7 +555,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for (var/obj/item/I in M) if (istype(I, /obj/item/weapon/implant)) continue - del(I) + qdel(I) switch(dresscode) if ("strip") //do nothing @@ -590,7 +590,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) @@ -614,7 +614,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) var/obj/item/weapon/storage/backpack/backpack = new(M) for(var/obj/item/I in backpack) - del(I) + qdel(I) M.equip_to_slot_or_del(backpack, slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand) @@ -660,7 +660,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store) @@ -681,7 +681,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) @@ -705,7 +705,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M) for(var/obj/item/briefcase_item in sec_briefcase) - del(briefcase_item) + qdel(briefcase_item) for(var/i=3, i>0, i--) sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow @@ -832,7 +832,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/M1911(M), slot_belt) @@ -888,7 +888,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) @@ -927,9 +927,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that spawn(30) for(var/obj/machinery/the_singularitygen/G in world) if(G.anchored) - var/obj/machinery/singularity/S = new /obj/machinery/singularity(get_turf(G), 50) + var/obj/singularity/S = new /obj/singularity(get_turf(G), 50) spawn(0) - del(G) + qdel(G) S.energy = 1750 S.current_size = 7 S.icon = 'icons/effects/224x224.dmi' diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index c6f91e89d3..bd3c4be0d9 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -55,7 +55,7 @@ var/intercom_range_display_status = 0 for(var/obj/effect/debugging/camera_range/C in world) - del(C) + qdel(C) if(camera_range_display_status) for(var/obj/machinery/camera/C in cameranet.cameras) @@ -114,14 +114,14 @@ var/intercom_range_display_status = 0 intercom_range_display_status = 1 for(var/obj/effect/debugging/marker/M in world) - del(M) + qdel(M) if(intercom_range_display_status) for(var/obj/item/device/radio/intercom/I in world) for(var/turf/T in orange(7,I)) var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) if (!(F in view(7,I.loc))) - del(F) + qdel(F) feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! var/list/debug_verbs = list ( @@ -276,7 +276,7 @@ var/list/debug_verbs = list ( var/datum/controller/air_system/old_air = air_master for(var/zone/zone in old_air.zones) zone.c_invalidate() - del old_air + qdel(old_air) air_master = new air_master.Setup() spawn air_master.Start() diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index de69f149d7..6de30853ce 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -2,7 +2,7 @@ set name = "Possess Obj" set category = "Object" - if(istype(O,/obj/machinery/singularity)) + if(istype(O,/obj/singularity)) if(config.forbid_singulo_possession) usr << "It is forbidden to possess singularities." return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 8b2d070003..d987c52260 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -28,15 +28,13 @@ feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") -/proc/Centcomm_announce(var/text , var/mob/Sender , var/iamessage) - var/msg = sanitize(text) +/proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage) msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) C << msg -/proc/Syndicate_announce(var/text , var/mob/Sender) - var/msg = sanitize(text) +/proc/Syndicate_announce(var/msg, var/mob/Sender) msg = "\blue ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 4b3661375f..b240f087a9 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -527,7 +527,7 @@ Traitors and the like can also be revived with the previous role mostly intact. switch(alert("Should this be announced to the general population?",,"Yes","No")) if("Yes") - command_announcement.Announce(input, customname, new_sound = 'sound/AI/commandreport.ogg'); + command_announcement.Announce(input, customname, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); if("No") world << "\red New NanoTrasen Update available at all communication consoles." world << sound('sound/AI/commandreport.ogg') @@ -548,7 +548,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1) feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - del(O) + qdel(O) /client/proc/cmd_admin_list_open_jobs() set category = "Admin" @@ -686,7 +686,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=[mins]&server=[replacetext(config.server_name, "#", "")]") del(M.client) - del(M) + qdel(M) else if("No") @@ -701,7 +701,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") world.Export("http://216.38.134.132/adminlog.php?type=ban&key=[usr.client.key]&key2=[M.key]&msg=[html_decode(reason)]&time=perma&server=[replacetext(config.server_name, "#", "")]") del(M.client) - del(M) + qdel(M) */ /client/proc/update_world() diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index ed3edf5fc0..ba071d7c72 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -39,7 +39,7 @@ bombtank.master = null bombtank = null - del(src) + qdel(src) return if((istype(W, /obj/item/weapon/weldingtool) && W:welding)) if(!status) @@ -144,8 +144,8 @@ ground_zero.hotspot_expose(1000, 125) if(master) - del(master) - del(src) + qdel(master) + qdel(src) /obj/item/weapon/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out. var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index f3bf44b53b..a8a3d246c8 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -190,7 +190,7 @@ a_right:holder = null a_right.loc = T spawn(0) - del(src) + qdel(src) return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 79e3cf8637..3f3c4f4dbd 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -32,7 +32,7 @@ processing_objects.Add(src) else on = 0 - if(first) del(first) + if(first) qdel(first) processing_objects.Remove(src) update_icon() return secured @@ -53,7 +53,7 @@ process()//Old code if(!on) if(first) - del(first) + qdel(first) return if((!(first) && (secured && (istype(loc, /turf) || (holder && istype(holder.loc, /turf)))))) @@ -77,7 +77,7 @@ attack_hand() - del(first) + qdel(first) ..() return @@ -86,14 +86,14 @@ var/t = dir ..() set_dir(t) - del(first) + qdel(first) return holder_movement() if(!holder) return 0 // set_dir(holder.dir) - del(first) + qdel(first) return 1 @@ -175,7 +175,7 @@ if(master) //world << "beam hit \ref[src]: calling master \ref[master].hit" master.trigger_beam() - del(src) + qdel(src) return /obj/effect/beam/i_beam/proc/vis_spread(v) @@ -193,7 +193,7 @@ if((loc.density || !(master))) // world << "beam hit loc [loc] or no master [master], deleting" - del(src) + qdel(src) return //world << "proccess: [src.left] left" @@ -233,17 +233,17 @@ return else //world << "is a next: \ref[next], deleting beam \ref[I]" - del(I) + qdel(I) else //world << "step failed, deleting \ref[next]" - del(next) + qdel(next) spawn(10) process() return return /obj/effect/beam/i_beam/Bump() - del(src) + qdel(src) return /obj/effect/beam/i_beam/Bumped() @@ -258,7 +258,10 @@ return return -/obj/effect/beam/i_beam/Del() - del(next) +/obj/effect/beam/i_beam/Destroy() + if(master.first == src) + master.first = null + if(next) + qdel(next) + next = null ..() - return diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 5e501e3313..8ba62cdc37 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -8,9 +8,9 @@ w_class = 5.0 flags = CONDUCT -/obj/item/assembly/shock_kit/Del() - del(part1) - del(part2) +/obj/item/assembly/shock_kit/Destroy() + qdel(part1) + qdel(part2) ..() return @@ -25,7 +25,7 @@ part2.master = null part1 = null part2 = null - del(src) + qdel(src) return if(istype(W, /obj/item/weapon/screwdriver)) status = !status diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 0b2acd5a5b..271b63e6d5 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -141,6 +141,8 @@ proc/set_frequency(new_frequency) + if(!frequency) + return if(!radio_controller) sleep(20) if(!radio_controller) @@ -169,4 +171,11 @@ set desc = "BOOOOM!" deadman = 1 processing_objects.Add(src) + log_and_message_admins("is threatening to trigger a signaler deadman's switch") usr.visible_message("\red [usr] moves their finger over [src]'s signal button...") + +/obj/item/device/assembly/signaler/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + frequency = 0 + ..() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 11f78326c6..b6415f22b5 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -77,7 +77,7 @@ W.assignment = corpseidjob W.registered_name = M.real_name M.equip_to_slot_or_del(W, slot_wear_id) - del(src) + qdel(src) diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm index 706e1716af..5aeb9651d2 100644 --- a/code/modules/awaymissions/loot.dm +++ b/code/modules/awaymissions/loot.dm @@ -21,4 +21,4 @@ continue new loot_path(get_turf(src)) - del(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm index 65ad8f543d..4afaf4a135 100644 --- a/code/modules/awaymissions/trigger.dm +++ b/code/modules/awaymissions/trigger.dm @@ -6,7 +6,7 @@ if(M.client) M << "[message]" if(once) - del(src) + qdel(src) /obj/effect/step_trigger/teleport_fancy var/locationx @@ -41,4 +41,4 @@ uses-- if(uses == 0) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index b0ba29dcd0..4f9002409f 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -3,7 +3,7 @@ proc/createRandomZlevel() return var/list/potentialRandomZlevels = list() - world << "\red \b Searching for away missions..." + admin_notice("\red \b Searching for away missions...", R_DEBUG) var/list/Lines = file2list("maps/RandomZLevels/fileList.txt") if(!Lines.len) return for (var/t in Lines) @@ -35,7 +35,7 @@ proc/createRandomZlevel() if(potentialRandomZlevels.len) - world << "\red \b Loading away mission..." + admin_notice("\red \b Loading away mission...", R_DEBUG) var/map = pick(potentialRandomZlevels) var/file = file(map) @@ -48,8 +48,8 @@ proc/createRandomZlevel() continue awaydestinations.Add(L) - world << "\red \b Away mission loaded." + admin_notice("\red \b Away mission loaded.", R_DEBUG) else - world << "\red \b No away missions found." + admin_notice("\red \b No away missions found.", R_DEBUG) return diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 45ca127f13..e1095e55b0 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -33,7 +33,7 @@ if( findtext(href,"You have unread updates in the changelog." + winset(src, "rpane.changelogb", "background-color=#eaeaea;font-style=bold") + if(config.aggressive_changelog) + src.changes() + ////////////// @@ -259,8 +263,9 @@ getFiles( 'html/search.js', 'html/panels.css', - 'html/painew.png', - 'html/loading.gif', + 'html/images/loading.gif', + 'html/images/ntlogo.png', + 'html/images/talisman.png', 'icons/pda_icons/pda_atmos.png', 'icons/pda_icons/pda_back.png', 'icons/pda_icons/pda_bell.png', @@ -298,7 +303,5 @@ 'icons/spideros_icons/sos_11.png', 'icons/spideros_icons/sos_12.png', 'icons/spideros_icons/sos_13.png', - 'icons/spideros_icons/sos_14.png', - 'html/images/ntlogo.png', - 'html/images/talisman.png' + 'icons/spideros_icons/sos_14.png' ) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 5ac54a0498..03a1104905 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -31,7 +31,7 @@ var/global/list/gear_datums = list() /datum/gear var/display_name //Name/index. Must be unique. var/path //Path to item. - var/cost //Number of points used. + var/cost //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points. var/slot //Slot to equip to. var/list/allowed_roles //Roles that can spawn with this item. var/whitelisted //Term to check the whitelist for.. @@ -48,19 +48,19 @@ var/global/list/gear_datums = list() /datum/gear/gbandana display_name = "bandana, green" path = /obj/item/clothing/head/greenbandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/obandana display_name = "bandana, orange" path = /obj/item/clothing/head/orangebandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/bandana display_name = "bandana, pirate-red" path = /obj/item/clothing/head/bandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/bsec_beret @@ -73,20 +73,20 @@ var/global/list/gear_datums = list() /datum/gear/eng_beret display_name = "beret, engie-orange" path = /obj/item/clothing/head/beret/eng - cost = 2 + cost = 1 slot = slot_head // allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") /datum/gear/purp_beret display_name = "beret, purple" path = /obj/item/clothing/head/beret/jan - cost = 2 + cost = 1 slot = slot_head /datum/gear/red_beret display_name = "beret, red" path = /obj/item/clothing/head/beret - cost = 2 + cost = 1 slot = slot_head /datum/gear/sec_beret @@ -99,74 +99,80 @@ var/global/list/gear_datums = list() /datum/gear/bcap display_name = "cap, blue" path = /obj/item/clothing/head/soft/blue - cost = 2 + cost = 1 slot = slot_head /datum/gear/mailman display_name = "cap, blue station" path = /obj/item/clothing/head/mailman - cost = 2 + cost = 1 slot = slot_head /datum/gear/flatcap display_name = "cap, brown-flat" path = /obj/item/clothing/head/flatcap - cost = 2 + cost = 1 slot = slot_head /datum/gear/corpcap display_name = "cap, corporate (Security)" path = /obj/item/clothing/head/soft/sec/corp - cost = 2 + cost = 1 slot = slot_head allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/gcap display_name = "cap, green" path = /obj/item/clothing/head/soft/green - cost = 2 + cost = 1 slot = slot_head /datum/gear/grcap display_name = "cap, grey" path = /obj/item/clothing/head/soft/grey - cost = 2 + cost = 1 slot = slot_head /datum/gear/ocap display_name = "cap, orange" path = /obj/item/clothing/head/soft/orange - cost = 2 + cost = 1 slot = slot_head /datum/gear/purcap display_name = "cap, purple" path = /obj/item/clothing/head/soft/purple - cost = 2 + cost = 1 slot = slot_head /datum/gear/raincap display_name = "cap, rainbow" path = /obj/item/clothing/head/soft/rainbow - cost = 3 + cost = 1 slot = slot_head /datum/gear/rcap display_name = "cap, red" path = /obj/item/clothing/head/soft/red - cost = 2 + cost = 1 slot = slot_head /datum/gear/ycap display_name = "cap, yellow" path = /obj/item/clothing/head/soft/yellow - cost = 2 + cost = 1 + slot = slot_head + +/datum/gear/wcap + display_name = "cap, white" + path = /obj/item/clothing/head/soft/mime + cost = 1 slot = slot_head /datum/gear/hairflower display_name = "hair flower pin" path = /obj/item/clothing/head/hairflower - cost = 2 + cost = 1 slot = slot_head /datum/gear/dbhardhat @@ -181,6 +187,12 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_head +/datum/gear/rhardhat + display_name = "hardhat, red" + path = /obj/item/clothing/head/hardhat/red + cost = 2 + slot = slot_head + /datum/gear/yhardhat display_name = "hardhat, yellow" path = /obj/item/clothing/head/hardhat @@ -190,32 +202,38 @@ var/global/list/gear_datums = list() /datum/gear/boater display_name = "hat, boatsman" path = /obj/item/clothing/head/boaterhat - cost = 2 + cost = 1 slot = slot_head /datum/gear/bowler display_name = "hat, bowler" path = /obj/item/clothing/head/bowler - cost = 2 + cost = 1 slot = slot_head /datum/gear/fez display_name = "hat, fez" path = /obj/item/clothing/head/fez - cost = 2 + cost = 1 + slot = slot_head + +/datum/gear/tophat + display_name = "hat, tophat" + path = /obj/item/clothing/head/that + cost = 1 slot = slot_head // Wig by Earthcrusher, blame him. /datum/gear/philosopher_wig display_name = "natural philosopher's wig" path = /obj/item/clothing/head/philosopher_wig - cost = 3 + cost = 1 slot = slot_head /datum/gear/ushanka display_name = "ushanka" path = /obj/item/clothing/head/ushanka - cost = 2 + cost = 1 slot = slot_head // This was sprited and coded specifically for Zhan-Khazan characters. Before you @@ -223,7 +241,7 @@ var/global/list/gear_datums = list() /datum/gear/zhan_scarf display_name = "Zhan headscarf" path = /obj/item/clothing/head/tajaran/scarf - cost = 2 + cost = 1 slot = slot_head whitelisted = "Tajara" @@ -239,12 +257,37 @@ var/global/list/gear_datums = list() display_name = "Glasses, green" path = /obj/item/clothing/glasses/gglasses cost = 1 + slot = slot_glasses + +/datum/gear/prescriptionhipster + display_name = "Glasses, hipster" + path = /obj/item/clothing/glasses/regular/hipster + cost = 1 + slot = slot_glasses + +/datum/gear/prescription + display_name = "Glasses, prescription" + path = /obj/item/clothing/glasses/regular + cost = 1 + slot = slot_glasses + +/datum/gear/monocle + display_name = "Monocle" + path = /obj/item/clothing/glasses/monocle + cost = 1 + slot = slot_glasses /datum/gear/scanning_goggles display_name = "scanning goggles" path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 cost = 1 -// allowed_roles = list("Roboticist", "Scientist", "Research Director") + slot = slot_glasses + +/datum/gear/sciencegoggles + display_name = "Science Goggles" + path = /obj/item/clothing/glasses/science + cost = 1 + slot = slot_glasses /datum/gear/security display_name = "Security HUD" @@ -260,10 +303,10 @@ var/global/list/gear_datums = list() slot = slot_glasses allowed_roles = list("Security Officer","Head of Security","Warden") -/datum/gear/prescription +/datum/gear/prescriptionsun display_name = "sunglasses, presciption" path = /obj/item/clothing/glasses/sunglasses/prescription - cost = 3 + cost = 2 slot = slot_glasses // Mask @@ -276,71 +319,184 @@ var/global/list/gear_datums = list() // Uniform slot -/datum/gear/exec_suit - display_name = "executive suit" - path = /obj/item/clothing/under/suit_jacket/really_black - slot = slot_w_uniform - cost = 2 - /datum/gear/blazer_blue display_name = "blazer, blue" path = /obj/item/clothing/under/blazer slot = slot_w_uniform - cost = 2 - -/datum/gear/kilt - display_name = "kilt" - path = /obj/item/clothing/under/kilt - slot = slot_w_uniform - cost = 3 - -/datum/gear/blackjumpskirt - display_name = "jumpskirt, black" - path = /obj/item/clothing/under/blackjumpskirt - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_blue - display_name = "plaid skirt, blue" - path = /obj/item/clothing/under/dress/plaid_blue - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_purple - display_name = "plaid skirt, purple" - path = /obj/item/clothing/under/dress/plaid_purple - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_red - display_name = "plaid skirt, red" - path = /obj/item/clothing/under/dress/plaid_red - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_black - display_name = "skirt, black" - path = /obj/item/clothing/under/blackskirt - slot = slot_w_uniform - cost = 2 - -/datum/gear/sundress - display_name = "sundress" - path = /obj/item/clothing/under/sundress - slot = slot_w_uniform - cost = 3 - -/datum/gear/sundress_white - display_name = "sundress, white" - path = /obj/item/clothing/under/sundress_white - slot = slot_w_uniform - cost = 3 + cost = 1 /datum/gear/cheongsam display_name = "cheongsam, white" path = /obj/item/clothing/under/cheongsam slot = slot_w_uniform - cost = 3 + cost = 1 + +/datum/gear/kilt + display_name = "kilt" + path = /obj/item/clothing/under/kilt + slot = slot_w_uniform + cost = 1 + +/datum/gear/blackjumpskirt + display_name = "jumpskirt, black" + path = /obj/item/clothing/under/blackjumpskirt + slot = slot_w_uniform + cost = 1 + +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, female-black" + path = /obj/item/clothing/under/color/blackf + slot = slot_w_uniform + cost = 1 +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, rainbow" + path = /obj/item/clothing/under/rainbow + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_blue + display_name = "plaid skirt, blue" + path = /obj/item/clothing/under/dress/plaid_blue + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_purple + display_name = "plaid skirt, purple" + path = /obj/item/clothing/under/dress/plaid_purple + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_red + display_name = "plaid skirt, red" + path = /obj/item/clothing/under/dress/plaid_red + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_black + display_name = "skirt, black" + path = /obj/item/clothing/under/blackskirt + slot = slot_w_uniform + cost = 1 + +/datum/gear/amishsuit + display_name = "suit, amish" + path = /obj/item/clothing/under/sl_suit + slot = slot_w_uniform + cost = 1 + +/datum/gear/blacksuit + display_name = "suit, black" + path = /obj/item/clothing/under/suit_jacket + slot = slot_w_uniform + cost = 1 + +/datum/gear/shinyblacksuit + display_name = "suit, shiny-black" + path = /obj/item/clothing/under/lawyer/black + slot = slot_w_uniform + cost = 1 + +/datum/gear/bluesuit + display_name = "suit, blue" + path = /obj/item/clothing/under/lawyer/blue + slot = slot_w_uniform + cost = 1 + +/datum/gear/burgundysuit + display_name = "suit, burgundy" + path = /obj/item/clothing/under/suit_jacket/burgundy + slot = slot_w_uniform + cost = 1 + +/datum/gear/checkeredsuit + display_name = "suit, checkered" + path = /obj/item/clothing/under/suit_jacket/checkered + slot = slot_w_uniform + cost = 1 + +/datum/gear/charcoalsuit + display_name = "suit, charcoal" + path = /obj/item/clothing/under/suit_jacket/charcoal + slot = slot_w_uniform + cost = 1 + +/datum/gear/execsuit + display_name = "suit, executive" + path = /obj/item/clothing/under/suit_jacket/really_black + slot = slot_w_uniform + cost = 1 + +/datum/gear/femaleexecsuit + display_name = "suit, female-executive" + path = /obj/item/clothing/under/suit_jacket/female + slot = slot_w_uniform + cost = 1 + +/datum/gear/gentlesuit + display_name = "suit, gentlemen" + path = /obj/item/clothing/under/gentlesuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/navysuit + display_name = "suit, navy" + path = /obj/item/clothing/under/suit_jacket/navy + slot = slot_w_uniform + cost = 1 + +/datum/gear/redsuit + display_name = "suit, red" + path = /obj/item/clothing/under/suit_jacket/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/redlawyer + display_name = "suit, lawyer-red" + path = /obj/item/clothing/under/lawyer/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/oldmansuit + display_name = "suit, old-man" + path = /obj/item/clothing/under/lawyer/oldman + slot = slot_w_uniform + cost = 1 + +/datum/gear/purplesuit + display_name = "suit, purple" + path = /obj/item/clothing/under/lawyer/purpsuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/tansuit + display_name = "suit, tan" + path = /obj/item/clothing/under/suit_jacket/tan + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitesuit + display_name = "suit, white" + path = /obj/item/clothing/under/scratch + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitebluesuit + display_name = "suit, white-blue" + path = /obj/item/clothing/under/lawyer/bluesuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/sundress + display_name = "sundress" + path = /obj/item/clothing/under/sundress + slot = slot_w_uniform + cost = 1 + +/datum/gear/sundress_white + display_name = "sundress, white" + path = /obj/item/clothing/under/sundress_white + slot = slot_w_uniform + cost = 1 /datum/gear/uniform_captain display_name = "uniform, captain's dress" @@ -352,7 +508,7 @@ var/global/list/gear_datums = list() /datum/gear/corpsecsuit display_name = "uniform, corporate (Security)" path = /obj/item/clothing/under/rank/security/corp - cost = 2 + cost = 1 slot = slot_w_uniform allowed_roles = list("Security Officer","Head of Security","Warden") @@ -373,7 +529,7 @@ var/global/list/gear_datums = list() /datum/gear/navysecsuit display_name = "uniform, navyblue (Security)" path = /obj/item/clothing/under/rank/security/navyblue - cost = 2 + cost = 1 slot = slot_w_uniform allowed_roles = list("Security Officer","Head of Security","Warden") @@ -389,7 +545,7 @@ var/global/list/gear_datums = list() display_name = "armband, EMT" path = /obj/item/clothing/accessory/armband/medgreen slot = slot_tie - cost = 2 + cost = 1 /datum/gear/armband_engineering display_name = "armband, engineering" @@ -425,21 +581,21 @@ var/global/list/gear_datums = list() display_name = "holster, armpit" path = /obj/item/clothing/accessory/holster/armpit slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") /datum/gear/hip display_name = "holster, hip" path = /obj/item/clothing/accessory/holster/hip slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security", "Detective") /datum/gear/waist display_name = "holster, waist" path = /obj/item/clothing/accessory/holster/waist slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security", "Detective") /datum/gear/tie_blue @@ -464,14 +620,14 @@ var/global/list/gear_datums = list() display_name = "webbing, engineering" path = /obj/item/clothing/accessory/storage/brown_vest slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") /datum/gear/black_vest display_name = "webbing, security" path = /obj/item/clothing/accessory/storage/black_vest slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/webbing @@ -491,37 +647,37 @@ var/global/list/gear_datums = list() /datum/gear/bomber display_name = "bomber jacket" path = /obj/item/clothing/suit/storage/toggle/bomber - cost = 4 + cost = 2 slot = slot_wear_suit /datum/gear/leather_jacket display_name = "leather jacket, black" path = /obj/item/clothing/suit/storage/leather_jacket - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/leather_jacket_nt display_name = "leather jacket, NanoTrasen, black" path = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/brown_jacket display_name = "leather jacket, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/brown_jacket_nt display_name = "leather jacket, NanoTrasen, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen - cost = 3 + cost = 2 slot = slot_wear_suit -/datum/gear/blue_lawyer_jacket - display_name = "suit jacket, blue" - path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket - cost = 3 +/datum/gear/hazard_vest + display_name = "hazard vest" + path = /obj/item/clothing/suit/storage/hazardvest + cost = 2 slot = slot_wear_suit /datum/gear/hoodie @@ -533,79 +689,122 @@ var/global/list/gear_datums = list() /datum/gear/hoodie/black display_name = "hoodie, black" path = /obj/item/clothing/suit/storage/toggle/hoodie/black + cost = 2 /datum/gear/unathi_mantle display_name = "hide mantle (Unathi)" path = /obj/item/clothing/suit/unathi/mantle - cost = 2 + cost = 1 slot = slot_wear_suit whitelisted = "Unathi" /datum/gear/labcoat display_name = "labcoat" path = /obj/item/clothing/suit/storage/toggle/labcoat - cost = 3 + cost = 2 + slot = slot_wear_suit + +/datum/gear/bluelabcoat + display_name = "labcoat, blue" + path = /obj/item/clothing/suit/storage/toggle/labcoat/blue + cost = 2 + slot = slot_wear_suit + +/datum/gear/greenlabcoat + display_name = "labcoat, green" + path = /obj/item/clothing/suit/storage/toggle/labcoat/green + cost = 2 + slot = slot_wear_suit + +/datum/gear/orangelabcoat + display_name = "labcoat, orange" + path = /obj/item/clothing/suit/storage/toggle/labcoat/orange + cost = 2 + slot = slot_wear_suit + +/datum/gear/purplelabcoat + display_name = "labcoat, purple" + path = /obj/item/clothing/suit/storage/toggle/labcoat/purple + cost = 2 + slot = slot_wear_suit + +/datum/gear/redlabcoat + display_name = "labcoat, red" + path = /obj/item/clothing/suit/storage/toggle/labcoat/red + cost = 2 slot = slot_wear_suit /datum/gear/overalls display_name = "overalls" path = /obj/item/clothing/suit/apron/overalls - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/bponcho display_name = "poncho, blue" path = /obj/item/clothing/suit/poncho/blue - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/gponcho display_name = "poncho, green" path = /obj/item/clothing/suit/poncho/green - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/pponcho display_name = "poncho, purple" path = /obj/item/clothing/suit/poncho/purple - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/rponcho display_name = "poncho, red" path = /obj/item/clothing/suit/poncho/red - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/poncho display_name = "poncho, tan" path = /obj/item/clothing/suit/poncho - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/unathi_robe display_name = "roughspun robe (Unathi)" path = /obj/item/clothing/suit/unathi/robe - cost = 3 + cost = 1 slot = slot_wear_suit // whitelisted = "Unathi" // You don't have a monopoly on a robe! +/datum/gear/blue_lawyer_jacket + display_name = "suit jacket, blue" + path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket + cost = 2 + slot = slot_wear_suit + +/datum/gear/purple_lawyer_jacket + display_name = "suit jacket, purple" + path = /obj/item/clothing/suit/storage/lawyer/purpjacket + cost = 2 + slot = slot_wear_suit + /datum/gear/suspenders display_name = "suspenders" path = /obj/item/clothing/suit/suspenders - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/wcoat display_name = "waistcoat" path = /obj/item/clothing/suit/wcoat - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/zhan_furs display_name = "Zhan-Khazan furs (Tajaran)" path = /obj/item/clothing/suit/tajaran/furs - cost = 3 + cost = 1 slot = slot_wear_suit whitelisted = "Tajara" // You do have a monopoly on a fur suit tho @@ -620,7 +819,7 @@ var/global/list/gear_datums = list() /datum/gear/blue_gloves display_name = "gloves, blue" path = /obj/item/clothing/gloves/blue - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/brown_gloves @@ -629,22 +828,53 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_gloves +/datum/gear/light_brown_gloves + display_name = "gloves, light-brown" + path = /obj/item/clothing/gloves/light_brown + cost = 2 + slot = slot_gloves + /datum/gear/green_gloves display_name = "gloves, green" path = /obj/item/clothing/gloves/green - cost = 1 + cost = 2 slot = slot_gloves +/datum/gear/grey_gloves + display_name = "gloves, grey" + path = /obj/item/clothing/gloves/grey + cost = 2 + slot = slot_gloves + +/datum/gear/latex_gloves + display_name = "gloves, latex" + path = /obj/item/clothing/gloves/latex + cost = 2 + slot = slot_gloves + + /datum/gear/orange_gloves display_name = "gloves, orange" path = /obj/item/clothing/gloves/orange - cost = 1 + cost = 2 + slot = slot_gloves + +/datum/gear/purple_gloves + display_name = "gloves, purple" + path = /obj/item/clothing/gloves/purple + cost = 2 + slot = slot_gloves + +/datum/gear/rainbow_gloves + display_name = "gloves, rainbow" + path = /obj/item/clothing/gloves/rainbow + cost = 2 slot = slot_gloves /datum/gear/red_gloves display_name = "gloves, red" path = /obj/item/clothing/gloves/red - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/white_gloves @@ -658,7 +888,13 @@ var/global/list/gear_datums = list() /datum/gear/jackboots display_name = "jackboots" path = /obj/item/clothing/shoes/jackboots - cost = 2 + cost = 1 + slot = slot_shoes + +/datum/gear/toeless_jackboots + display_name = "toe-less jackboots" + path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran + cost = 1 slot = slot_shoes /datum/gear/sandal @@ -721,6 +957,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_shoes +/datum/gear/rainbow_shoes + display_name = "shoes, rainbow" + path = /obj/item/clothing/shoes/rainbow + cost = 1 + slot = slot_shoes + /datum/gear/red_shoes display_name = "shoes, red" path = /obj/item/clothing/shoes/red @@ -801,7 +1043,7 @@ var/global/list/gear_datums = list() display_name = "cane" path = /obj/item/weapon/cane sort_category = "misc" - cost = 2 + cost = 1 /datum/gear/dice display_name = "d20" @@ -815,6 +1057,17 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/flask + display_name = "flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask + sort_category = "misc" + cost = 1 + +/datum/gear/vacflask + display_name = "vacuum-flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask + sort_category = "misc" + cost = 1 /datum/gear/blipstick display_name = "lipstick, black" path = /obj/item/weapon/lipstick/black @@ -839,17 +1092,35 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/smokingpipe + display_name = "pipe, smoking" + path = /obj/item/clothing/mask/smokable/pipe + sort_category = "misc" + cost = 1 + +/datum/gear/cornpipe + display_name = "pipe, corn" + path = /obj/item/clothing/mask/smokable/pipe/cobpipe + sort_category = "misc" + cost = 1 + /datum/gear/matchbook display_name = "matchbook" path = /obj/item/weapon/storage/box/matches sort_category = "misc" - cost = 2 + cost = 1 /datum/gear/comb display_name = "purple comb" path = /obj/item/weapon/haircomb sort_category = "misc" - cost = 2 + cost = 1 + +/datum/gear/zippo + display_name = "zippo" + path = /obj/item/weapon/flame/lighter/zippo + sort_category = "misc" + cost = 1 /*/datum/gear/combitool display_name = "combi-tool" @@ -858,30 +1129,36 @@ var/global/list/gear_datums = list() // Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use // the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset. +/datum/gear/earmuffs + display_name = "earmuffs" + path = /obj/item/clothing/ears/earmuffs + cost = 1 + sort_category = "ears" + /datum/gear/skrell_chain display_name = "skrell headtail-wear, female, chain" path = /obj/item/clothing/ears/skrell/chain - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_plate display_name = "skrell headtail-wear, male, bands" path = /obj/item/clothing/ears/skrell/band - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_cloth_male display_name = "skrell headtail-wear, male, cloth" path = /obj/item/clothing/ears/skrell/cloth_male - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_cloth_female display_name = "skrell headtail-wear, female, cloth" path = /obj/item/clothing/ears/skrell/cloth_female - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 2cd1450a97..527f596f54 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -117,7 +117,7 @@ O = (H.l_ear == src ? H.r_ear : H.l_ear) user.u_equip(O) if(!istype(src,/obj/item/clothing/ears/offear)) - del(O) + qdel(O) O = src else O = src @@ -129,7 +129,7 @@ O.add_fingerprint(user) if(istype(src,/obj/item/clothing/ears/offear)) - del(src) + qdel(src) /obj/item/clothing/ears/update_clothing_icon() if (ismob(src.loc)) @@ -191,7 +191,7 @@ BLIND // can't see anything gender = PLURAL //Carn: for grammarically correct text-parsing w_class = 2.0 icon = 'icons/obj/clothing/gloves.dmi' - siemens_coefficient = 0.50 + siemens_coefficient = 0.75 var/wired = 0 var/obj/item/weapon/cell/cell = 0 var/clipped = 0 @@ -391,13 +391,17 @@ BLIND // can't see anything //Under clothing /obj/item/clothing/under icon = 'icons/obj/clothing/uniforms.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) name = "under" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS permeability_coefficient = 0.90 slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) w_class = 3 - var/has_sensor = 1//For the crew computer 2 = unable to change mode + var/has_sensor = 1 //For the crew computer 2 = unable to change mode var/sensor_mode = 0 /* 1 = Report living/dead @@ -406,7 +410,25 @@ BLIND // can't see anything */ var/list/accessories = list() var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi') + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + +/obj/item/clothing/under/New() + if(worn_state) + if(!item_state_slots) + item_state_slots = list() + item_state_slots[slot_w_uniform_str] = worn_state + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if((worn_state + "_d_s") in icon_states('icons/mob/uniform.dmi')) + rolled_down = 0 /obj/item/clothing/under/update_clothing_icon() if (ismob(src.loc)) @@ -464,17 +486,18 @@ BLIND // can't see anything if (!(src.loc == usr)) return - if (!( usr.restrained() ) && !( usr.stat )) - switch(over_object.name) - if("r_hand") - usr.u_equip(src) - usr.put_in_r_hand(src) - if("l_hand") - usr.u_equip(src) - usr.put_in_l_hand(src) - src.add_fingerprint(usr) + if (( usr.restrained() ) || ( usr.stat )) return - return + + if (!usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.put_in_r_hand(src) + if("l_hand") + usr.put_in_l_hand(src) + src.add_fingerprint(usr) /obj/item/clothing/under/examine(mob/user) ..(user) @@ -548,17 +571,18 @@ BLIND // can't see anything if(!istype(usr, /mob/living)) return if(usr.stat) return - if(initial(item_color) + "_d_s" in icon_states('icons/mob/uniform.dmi')) - if (item_color == initial(item_color)) - body_parts_covered &= LOWER_TORSO|LEGS|FEET - item_color = "[initial(item_color)]_d" - else - body_parts_covered = initial(body_parts_covered) - item_color = initial(item_color) - - update_clothing_icon() + if(rolled_down < 0) + usr << "You cannot roll down [src]!" + return + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered &= LOWER_TORSO|LEGS|FEET + item_state_slots[slot_w_uniform_str] = "[worn_state]_d" else - usr << "You cannot roll down the uniform!" + body_parts_covered = initial(body_parts_covered) + item_state_slots[slot_w_uniform_str] = "[worn_state]" + update_clothing_icon() /obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) if(!(A in accessories)) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 317b60af18..97eb175277 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -10,7 +10,9 @@ //var/invisa_view = 0 var/prescription = 0 var/toggleable = 0 + var/off_state = "degoggles" var/active = 1 + var/activation_sound = 'sound/items/goggles_charge.ogg' var/obj/screen/overlay = null body_parts_covered = EYES @@ -18,13 +20,15 @@ if(toggleable) if(active) active = 0 - icon_state = "degoggles" + icon_state = off_state user.update_inv_glasses() usr << "You deactivate the optical matrix on the [src]." else active = 1 icon_state = initial(icon_state) user.update_inv_glasses() + if(activation_sound) + usr << activation_sound usr << "You activate the optical matrix on the [src]." /obj/item/clothing/glasses/meson @@ -51,6 +55,8 @@ desc = "The goggles do nothing!" icon_state = "purple" item_state = "glasses" + toggleable = 1 + icon_action_button = "action_science" /obj/item/clothing/glasses/science/New() ..() @@ -63,6 +69,9 @@ item_state = "glasses" origin_tech = "magnets=2" darkness_view = 7 + toggleable = 1 + icon_action_button = "action_nvg" + off_state = "denight" /obj/item/clothing/glasses/night/New() ..() @@ -208,6 +217,7 @@ item_state = "glasses" origin_tech = "magnets=3" toggleable = 1 + icon_action_button = "action_thermal" vision_flags = SEE_MOBS invisa_view = 2 @@ -218,9 +228,11 @@ if(M.glasses == src) M.eye_blind = 3 M.eye_blurry = 5 - M.disabilities |= NEARSIGHTED - spawn(100) - M.disabilities &= ~NEARSIGHTED + // Don't cure being nearsighted + if(!(M.disabilities & NEARSIGHTED)) + M.disabilities |= NEARSIGHTED + spawn(100) + M.disabilities &= ~NEARSIGHTED ..() /obj/item/clothing/glasses/thermal/New() @@ -231,28 +243,30 @@ name = "Optical Meson Scanner" desc = "Used for seeing walls, floors, and stuff through anything." icon_state = "meson" - icon_action_button = "action_meson" origin_tech = "magnets=3;syndicate=4" -/obj/item/clothing/glasses/thermal/monocle +/obj/item/clothing/glasses/thermal/plain + toggleable = 0 + activation_sound = null + icon_action_button = "" + +/obj/item/clothing/glasses/thermal/plain/monocle name = "Thermoncle" desc = "A monocle thermal." icon_state = "thermoncle" flags = null //doesn't protect eyes because it's a monocle, duh - toggleable = 0 + body_parts_covered = 0 -/obj/item/clothing/glasses/thermal/eyepatch +/obj/item/clothing/glasses/thermal/plain/eyepatch name = "Optical Thermal Eyepatch" desc = "An eyepatch with built-in thermal optics" icon_state = "eyepatch" item_state = "eyepatch" - toggleable = 0 body_parts_covered = 0 -/obj/item/clothing/glasses/thermal/jensen +/obj/item/clothing/glasses/thermal/plain/jensen name = "Optical Thermal Implants" desc = "A set of implantable lenses designed to augment your vision" icon_state = "thermalimplants" item_state = "syringe_kit" - toggleable = 0 diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index 02a34b4192..2ad12aa2bf 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -27,7 +27,3 @@ desc = "These look pretty fancy." icon_state = "latex" item_state = "lgloves" - item_color="mime" - - redcoat - item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way. diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 8e52dbd585..870fcc487f 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -5,7 +5,6 @@ item_state = "ygloves" siemens_coefficient = 0 permeability_coefficient = 0.05 - item_color="yellow" /obj/item/clothing/gloves/fyellow //Cheap Chinese Crap desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly." @@ -15,101 +14,73 @@ siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() permeability_coefficient = 0.05 - item_color="yellow" - New() - siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) + //average of 0.5, somewhat better than regular gloves' 0.75 + siemens_coefficient = pick(0,0.1,0.3,0.5,0.5,0.75,1.35) /obj/item/clothing/gloves/black - desc = "These gloves are fire-resistant." + desc = "These work gloves are thick and fire-resistant." name = "black gloves" icon_state = "black" item_state = "bgloves" - item_color="brown" + siemens_coefficient = 0.50 + permeability_coefficient = 0.05 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE - - hos - item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. - - ce - item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. - /obj/item/clothing/gloves/orange name = "orange gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "orange" item_state = "orangegloves" - item_color="orange" /obj/item/clothing/gloves/red name = "red gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "red" item_state = "redgloves" - item_color = "red" /obj/item/clothing/gloves/rainbow name = "rainbow gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "rainbow" item_state = "rainbowgloves" - item_color = "rainbow" - - clown - item_color = "clown" /obj/item/clothing/gloves/blue name = "blue gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "blue" item_state = "bluegloves" - item_color="blue" /obj/item/clothing/gloves/purple name = "purple gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "purple" item_state = "purplegloves" - item_color="purple" /obj/item/clothing/gloves/green name = "green gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "green" item_state = "greengloves" - item_color="green" /obj/item/clothing/gloves/grey name = "grey gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "gray" item_state = "graygloves" - item_color="grey" - - rd - item_color = "director" //Exists for washing machines. Is not different from gray gloves in any way. - - hop - item_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way. /obj/item/clothing/gloves/light_brown name = "light brown gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "lightbrown" item_state = "lightbrowngloves" - item_color="light brown" /obj/item/clothing/gloves/brown name = "brown gloves" desc = "A pair of gloves, they don't look special in any way." icon_state = "brown" item_state = "browngloves" - item_color="brown" - - cargo - item_color = "cargo" //Exists for washing machines. Is not different from brown gloves in any way. \ No newline at end of file diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index dfb370d38c..f7e7ad4ca7 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -3,11 +3,6 @@ name = "captain's gloves" icon_state = "captain" item_state = "egloves" - item_color = "captain" - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE /obj/item/clothing/gloves/cyborg desc = "beep boop borp" @@ -21,7 +16,7 @@ name = "\improper SWAT Gloves" icon_state = "black" item_state = "swat_gl" - siemens_coefficient = 0.6 + siemens_coefficient = 0.50 permeability_coefficient = 0.05 cold_protection = HANDS @@ -46,17 +41,13 @@ desc = "Sterile latex gloves." icon_state = "latex" item_state = "lgloves" - siemens_coefficient = 0.30 + siemens_coefficient = 1.0 //thin latex gloves, much more conductive than fabric gloves (basically a capacitor for AC) permeability_coefficient = 0.01 - item_color="white" - - cmo - item_color = "medical" //Exists for washing machines. Is not different from latex gloves in any way. /obj/item/clothing/gloves/botanic_leather - desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin." + desc = "These leather work gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin." name = "botanist's leather gloves" icon_state = "leather" item_state = "ggloves" - permeability_coefficient = 0.9 - siemens_coefficient = 0.9 + permeability_coefficient = 0.05 + siemens_coefficient = 0.50 //thick work gloves diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 436f714053..16a6adda67 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -5,7 +5,6 @@ item_state = "hardhat0_yellow" brightness_on = 4 //luminosity when on light_overlay = "hardhat_light" - item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite) armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20) flags_inv = 0 siemens_coefficient = 0.9 @@ -13,12 +12,10 @@ /obj/item/clothing/head/hardhat/orange icon_state = "hardhat0_orange" item_state = "hardhat0_orange" - item_color = "orange" /obj/item/clothing/head/hardhat/red icon_state = "hardhat0_red" item_state = "hardhat0_red" - item_color = "red" name = "firefighter helmet" flags = STOPPRESSUREDAMAGE heat_protection = HEAD @@ -27,7 +24,6 @@ /obj/item/clothing/head/hardhat/white icon_state = "hardhat0_white" item_state = "hardhat0_white" - item_color = "white" flags = STOPPRESSUREDAMAGE heat_protection = HEAD max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE @@ -35,4 +31,3 @@ /obj/item/clothing/head/hardhat/dblue icon_state = "hardhat0_dblue" item_state = "hardhat0_dblue" - item_color = "dblue" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 5eb7e0c65b..47308280bb 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -122,7 +122,6 @@ desc = "A jack o' lantern! Believed to ward off evil spirits." icon_state = "hardhat0_pumpkin"//Could stand to be renamed item_state = "hardhat0_pumpkin" - item_color = "pumpkin" flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = HEAD|EYES diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 1deff69402..d41a4598a4 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -1,16 +1,15 @@ /obj/item/clothing/head/soft name = "cargo cap" - desc = "It's a baseball hat in a tasteless yellow color." + desc = "It's a peaked cap in a tasteless yellow color." icon_state = "cargosoft" flags = HEADCOVERSEYES item_state = "helmet" - item_color = "cargo" var/flipped = 0 siemens_coefficient = 0.9 body_parts_covered = 0 dropped() - src.icon_state = "[item_color]soft" + src.icon_state = initial(icon_state) src.flipped=0 ..() @@ -21,10 +20,10 @@ if(usr.canmove && !usr.stat && !usr.restrained()) src.flipped = !src.flipped if(src.flipped) - icon_state = "[item_color]soft_flipped" + icon_state = "[icon_state]_flipped" usr << "You flip the hat backwards." else - icon_state = "[item_color]soft" + src.icon_state = initial(icon_state) usr << "You flip the hat back in normal position." update_clothing_icon() //so our mob-overlays update @@ -32,64 +31,53 @@ name = "red cap" desc = "It's a baseball hat in a tasteless red color." icon_state = "redsoft" - item_color = "red" /obj/item/clothing/head/soft/blue name = "blue cap" - desc = "It's a baseball hat in a tasteless blue color." + desc = "It's a peaked cap in a tasteless blue color." icon_state = "bluesoft" - item_color = "blue" /obj/item/clothing/head/soft/green name = "green cap" - desc = "It's a baseball hat in a tasteless green color." + desc = "It's a peaked cap in a tasteless green color." icon_state = "greensoft" - item_color = "green" /obj/item/clothing/head/soft/yellow name = "yellow cap" - desc = "It's a baseball hat in a tasteless yellow color." + desc = "It's a peaked cap in a tasteless yellow color." icon_state = "yellowsoft" - item_color = "yellow" /obj/item/clothing/head/soft/grey name = "grey cap" - desc = "It's a baseball hat in a tasteful grey color." + desc = "It's a peaked cap in a tasteful grey color." icon_state = "greysoft" - item_color = "grey" /obj/item/clothing/head/soft/orange name = "orange cap" - desc = "It's a baseball hat in a tasteless orange color." + desc = "It's a peaked cap in a tasteless orange color." icon_state = "orangesoft" - item_color = "orange" /obj/item/clothing/head/soft/mime name = "white cap" - desc = "It's a baseball hat in a tasteless white color." + desc = "It's a peaked cap in a tasteless white color." icon_state = "mimesoft" - item_color = "mime" /obj/item/clothing/head/soft/purple name = "purple cap" - desc = "It's a baseball hat in a tasteless purple color." + desc = "It's a peaked cap in a tasteless purple color." icon_state = "purplesoft" - item_color = "purple" /obj/item/clothing/head/soft/rainbow name = "rainbow cap" - desc = "It's a baseball hat in a bright rainbow of colors." + desc = "It's a peaked cap in a bright rainbow of colors." icon_state = "rainbowsoft" - item_color = "rainbow" /obj/item/clothing/head/soft/sec name = "security cap" - desc = "It's baseball hat in tasteful red color." + desc = "It's a field cap in tasteful red color." icon_state = "secsoft" - item_color = "sec" /obj/item/clothing/head/soft/sec/corp name = "corporate security cap" - desc = "It's baseball hat in corporate colors." + desc = "It's field cap in corporate colors." icon_state = "corpsoft" - item_color = "corp" diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index dfa7e120f7..ee03a328f7 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -5,11 +5,11 @@ item_state = "balaclava" flags = BLOCKHAIR flags_inv = HIDEFACE - body_parts_covered = FACE + body_parts_covered = FACE|HEAD w_class = 2 sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajara" = 'icons/mob/species/tajaran/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', ) /obj/item/clothing/mask/balaclava/tactical @@ -21,8 +21,8 @@ flags_inv = HIDEFACE w_class = 2 sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajara" = 'icons/mob/species/tajaran/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', ) /obj/item/clothing/mask/luchador diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index a2ed54b1d4..4fdaae19f3 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -15,26 +15,34 @@ var/hanging = 0 - verb/toggle() +/obj/item/clothing/mask/breath/proc/adjust_mask(mob/user) + if(user.canmove && !user.stat) + if(!src.hanging) + src.hanging = !src.hanging + gas_transfer_coefficient = 1 //gas is now escaping to the turf and vice versa + flags &= ~(MASKCOVERSMOUTH | AIRTIGHT) + body_parts_covered = 0 + icon_state = "breathdown" + user << "Your mask is now hanging on your neck." + + else + src.hanging = !src.hanging + gas_transfer_coefficient = initial(gas_transfer_coefficient) + flags |= MASKCOVERSMOUTH | AIRTIGHT + body_parts_covered = initial(body_parts_covered) + icon_state = "breath" + user << "You pull the mask up to cover your face." + update_clothing_icon() + +/obj/item/clothing/mask/breath/attack_self(mob/user) + adjust_mask(user) + +/obj/item/clothing/mask/breath/verb/toggle() set category = "Object" set name = "Adjust mask" set src in usr - if(usr.canmove && !usr.stat && !usr.restrained()) - if(!src.hanging) - src.hanging = !src.hanging - gas_transfer_coefficient = 1 //gas is now escaping to the turf and vice versa - flags &= ~(MASKCOVERSMOUTH | AIRTIGHT) - icon_state = "breathdown" - usr << "Your mask is now hanging on your neck." - - else - src.hanging = !src.hanging - gas_transfer_coefficient = 0.10 - flags |= MASKCOVERSMOUTH | AIRTIGHT - icon_state = "breath" - usr << "You pull the mask up to cover your face." - update_clothing_icon() + adjust_mask(usr) /obj/item/clothing/mask/breath/medical desc = "A close-fitting sterile mask that can be connected to an air supply." diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index e20bea4cc7..089f66376f 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -1,7 +1,6 @@ /obj/item/clothing/shoes/black name = "black shoes" icon_state = "black" - item_color = "black" desc = "A pair of black shoes." cold_protection = FEET @@ -9,81 +8,54 @@ heat_protection = FEET max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE - redcoat - item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way. - /obj/item/clothing/shoes/brown name = "brown shoes" desc = "A pair of brown shoes." icon_state = "brown" - item_color = "brown" - - captain - item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way. - hop - item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way. - ce - item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way. - rd - item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way. - cmo - item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way. - cmo - item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way. /obj/item/clothing/shoes/blue name = "blue shoes" icon_state = "blue" - item_color = "blue" /obj/item/clothing/shoes/green name = "green shoes" icon_state = "green" - item_color = "green" /obj/item/clothing/shoes/yellow name = "yellow shoes" icon_state = "yellow" - item_color = "yellow" /obj/item/clothing/shoes/purple name = "purple shoes" icon_state = "purple" - item_color = "purple" /obj/item/clothing/shoes/brown name = "brown shoes" icon_state = "brown" - item_color = "brown" /obj/item/clothing/shoes/red name = "red shoes" desc = "Stylish red shoes." icon_state = "red" - item_color = "red" /obj/item/clothing/shoes/white name = "white shoes" icon_state = "white" permeability_coefficient = 0.01 - item_color = "white" /obj/item/clothing/shoes/leather name = "leather shoes" desc = "A sturdy pair of leather shoes." icon_state = "leather" - item_color = "leather" /obj/item/clothing/shoes/rainbow name = "rainbow shoes" desc = "Very gay shoes." icon_state = "rain_bow" - item_color = "rainbow" /obj/item/clothing/shoes/orange name = "orange shoes" icon_state = "orange" - item_color = "orange" var/obj/item/weapon/handcuffs/chained = null /obj/item/clothing/shoes/orange/proc/attach_cuffs(var/obj/item/weapon/handcuffs/cuffs, mob/user as mob) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 38b252b1ff..616d13e858 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -13,7 +13,6 @@ /obj/item/clothing/shoes/mime name = "mime shoes" icon_state = "mime" - item_color = "mime" /obj/item/clothing/shoes/swat name = "\improper SWAT shoes" @@ -45,6 +44,8 @@ species_restricted = null body_parts_covered = 0 + wizard_garb = 1 + /obj/item/clothing/shoes/sandal/marisa desc = "A pair of magic, black shoes." name = "magic shoes" @@ -66,7 +67,6 @@ icon_state = "clown" item_state = "clown_shoes" slowdown = SHOES_SLOWDOWN+1 - item_color = "clown" force = 0 var/footstep = 1 //used for squeeks whilst walking species_restricted = null @@ -86,7 +86,6 @@ desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." icon_state = "jackboots" item_state = "jackboots" - item_color = "hosred" force = 3 siemens_coefficient = 0.7 @@ -95,7 +94,6 @@ desc = "A pair of boots worn by the followers of Nar-Sie." icon_state = "cult" item_state = "cult" - item_color = "cult" force = 2 siemens_coefficient = 0.7 @@ -105,6 +103,9 @@ max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE species_restricted = null +/obj/item/clothing/shoes/cult/cultify() + return + /obj/item/clothing/shoes/cyborg name = "cyborg boots" desc = "Shoes for a cyborg costume" diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 23ba1d0c55..a50c4bf12f 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -9,12 +9,10 @@ /obj/item/clothing/head/helmet/space/skrell/white icon_state = "skrell_helmet_white" item_state = "skrell_helmet_white" - item_color = "skrell_helmet_white" /obj/item/clothing/head/helmet/space/skrell/black icon_state = "skrell_helmet_black" item_state = "skrell_helmet_black" - item_color = "skrell_helmet_black" /obj/item/clothing/suit/space/skrell name = "Skrellian voidsuit" @@ -28,12 +26,10 @@ /obj/item/clothing/suit/space/skrell/white icon_state = "skrell_suit_white" item_state = "skrell_suit_white" - item_color = "skrell_suit_white" /obj/item/clothing/suit/space/skrell/black icon_state = "skrell_suit_black" item_state = "skrell_suit_black" - item_color = "skrell_suit_black" // Vox space gear (vaccuum suit, low pressure armour) // Can't be equipped by any other species due to bone structure and vox cybernetics. @@ -112,7 +108,6 @@ name = "alien clothing" desc = "This doesn't look very comfortable." icon_state = "vox-casual-1" - item_color = "vox-casual-1" item_state = "vox-casual-1" body_parts_covered = LEGS @@ -120,7 +115,6 @@ name = "alien robes" desc = "Weird and flowing!" icon_state = "vox-casual-2" - item_color = "vox-casual-2" item_state = "vox-casual-2" /obj/item/clothing/gloves/yellow/vox @@ -130,7 +124,6 @@ item_state = "gloves-vox" siemens_coefficient = 0 permeability_coefficient = 0.05 - item_color = "gloves-vox" species_restricted = list("Vox") sprite_sheets = list("Vox" = 'icons/mob/species/vox/gloves.dmi') /obj/item/clothing/shoes/magboots/vox diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index a3bb5a3e35..495f7b9f24 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -155,7 +155,7 @@ var/global/list/breach_burn_descriptors = list( for(var/datum/breach/B in breaches) if(!B.class) src.breaches -= B - del(B) + qdel(B) else damage += B.class if(B.damtype == BRUTE) diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index a9f7f53f8c..d40f74202e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -12,6 +12,7 @@ name = "mounted grenade launcher" desc = "A shoulder-mounted micro-explosive dispenser." selectable = 1 + icon_state = "grenade_launcher" interface_name = "integrated grenade launcher" interface_desc = "Discharges loaded grenades against the wearer's location." @@ -46,7 +47,7 @@ user << "You slot \the [input_device] into the suit module." user.drop_from_inventory(input_device) - del(input_device) + qdel(input_device) accepted_item.charges++ return 1 @@ -86,6 +87,7 @@ selectable = 1 usable = 1 module_cooldown = 0 + icon_state = "lcannon" engage_string = "Configure" @@ -115,6 +117,7 @@ name = "mounted energy gun" desc = "A forearm-mounted energy projector." + icon_state = "egun" interface_name = "mounted energy gun" interface_desc = "A forearm-mounted suit-powered energy gun." @@ -124,7 +127,8 @@ /obj/item/rig_module/mounted/taser name = "mounted taser" - desc = "A shoulder-mounted energy projector." + desc = "A palm-mounted nonlethal energy projector." + icon_state = "taser" usable = 0 @@ -140,6 +144,7 @@ name = "energy blade projector" desc = "A powerful cutting beam projector." + icon_state = "eblade" activate_string = "Project Blade" deactivate_string = "Cancel Blade" @@ -191,7 +196,7 @@ for(var/obj/item/weapon/melee/energy/blade/blade in M.contents) M.drop_from_inventory(blade) - del(blade) + qdel(blade) /obj/item/rig_module/fabricator @@ -200,6 +205,7 @@ selectable = 1 usable = 1 use_power_cost = 15 + icon_state = "enet" engage_string = "Fabricate Star" diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index a6c549b666..a04a0f4c20 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -29,6 +29,7 @@ name = "IIS module" desc = "An integrated intelligence system module suitable for most hardsuits." + icon_state = "IIS" toggleable = 1 usable = 1 disruptive = 0 @@ -45,6 +46,10 @@ var/obj/item/ai_card // Reference to the MMI, posibrain, intellicard or pAI card previously holding the AI. var/obj/item/ai_verbs/verb_holder +/obj/item/rig_module/ai_container/process() + if(integrated_ai && loc) + integrated_ai.SetupStat(loc.get_rig()) + /obj/item/rig_module/ai_container/proc/update_verb_holder() if(!verb_holder) verb_holder = new(src) @@ -104,7 +109,14 @@ // Okay, it wasn't a terminal being touched, check for all the simple insertions. if(input_device.type in list(/obj/item/device/paicard, /obj/item/device/mmi, /obj/item/device/mmi/digital/posibrain)) - integrate_ai(input_device,user) + if(integrated_ai) + integrated_ai.attackby(input_device,user) + // If the transfer was successful, we can clear out our vars. + if(integrated_ai.loc != src) + integrated_ai = null + eject_ai() + else + integrate_ai(input_device,user) return 1 return 0 @@ -145,8 +157,8 @@ user << "You purge the remaining scraps of data from your previous AI, freeing it for use." if(integrated_ai) integrated_ai.ghostize() - del(integrated_ai) - if(ai_card) del(ai_card) + qdel(integrated_ai) + if(ai_card) qdel(ai_card) else if(user) user.put_in_hands(ai_card) else @@ -202,6 +214,7 @@ name = "datajack module" desc = "A simple induction datalink module." + icon_state = "datajack" toggleable = 1 activates_on_touch = 1 usable = 0 @@ -292,6 +305,7 @@ name = "electrowarfare module" desc = "A bewilderingly complex bundle of fiber optics and chips." + icon_state = "ewar" toggleable = 1 usable = 0 @@ -322,6 +336,7 @@ name = "hardsuit power sink" desc = "An heavy-duty power sink." + icon_state = "powersink" toggleable = 1 activates_on_touch = 1 disruptive = 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 17498a31b2..ac9a80b07a 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -52,6 +52,8 @@ var/activate_string = "Activate" var/deactivate_string = "Deactivate" + var/list/stat_rig_module/stat_modules = new() + /obj/item/rig_module/examine() ..() switch(damage) @@ -126,7 +128,11 @@ charges = processed_charges - ..() + stat_modules += new/stat_rig_module/activate(src) + stat_modules += new/stat_rig_module/deactivate(src) + stat_modules += new/stat_rig_module/engage(src) + stat_modules += new/stat_rig_module/select(src) + stat_modules += new/stat_rig_module/charge(src) // Called when the module is installed into a suit. /obj/item/rig_module/proc/installed(var/obj/item/weapon/rig/new_holder) @@ -218,4 +224,111 @@ // Called by holder rigsuit attackby() // Checks if an item is usable with this module and handles it if it is /obj/item/rig_module/proc/accepts_item(var/obj/item/input_device) - return 0 \ No newline at end of file + return 0 + +/mob/living/carbon/human/Stat() + ..() + + if(istype(back,/obj/item/weapon/rig)) + var/obj/item/weapon/rig/R = back + SetupStat(R) + +/mob/proc/SetupStat(var/obj/item/weapon/rig/R) + if(R && !R.canremove && R.installed_modules.len && statpanel("Hardsuit Modules")) + var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR" + statpanel("Hardsuit Modules", "Suit charge", cell_status) + for(var/obj/item/rig_module/module in R.installed_modules) + { + for(var/stat_rig_module/SRM in module.stat_modules) + if(SRM.CanUse()) + statpanel("Hardsuit Modules",SRM.module.interface_name,SRM) + } + +/stat_rig_module + parent_type = /atom/movable + var/module_mode = "" + var/obj/item/rig_module/module + +/stat_rig_module/New(var/obj/item/rig_module/module) + ..() + src.module = module + +/stat_rig_module/proc/AddHref(var/list/href_list) + return + +/stat_rig_module/proc/CanUse() + return 0 + +/stat_rig_module/Click() + ..() + if(CanUse()) + var/list/href_list = list( + "interact_module" = module.holder.installed_modules.Find(module), + "module_mode" = module_mode + ) + AddHref(href_list) + module.holder.Topic(usr, href_list) + +/stat_rig_module/activate/New(var/obj/item/rig_module/module) + ..() + name = module.activate_string + if(module.active_power_cost) + name += " ([module.active_power_cost*10]A)" + module_mode = "activate" + +/stat_rig_module/activate/CanUse() + return module.toggleable && !module.active + +/stat_rig_module/deactivate/New(var/obj/item/rig_module/module) + ..() + name = module.deactivate_string + // Show cost despite being 0, if it means changing from an active cost. + if(module.active_power_cost || module.passive_power_cost) + name += " ([module.passive_power_cost*10]P)" + + module_mode = "deactivate" + +/stat_rig_module/deactivate/CanUse() + return module.toggleable && module.active + +/stat_rig_module/engage/New(var/obj/item/rig_module/module) + ..() + name = module.engage_string + if(module.use_power_cost) + name += " ([module.use_power_cost*10]E)" + module_mode = "engage" + +/stat_rig_module/engage/CanUse() + return module.usable + +/stat_rig_module/select/New() + ..() + name = "Select" + module_mode = "select" + +/stat_rig_module/select/CanUse() + if(module.selectable) + name = module.holder.selected_module == module ? "Selected" : "Select" + return 1 + return 0 + +/stat_rig_module/charge/New() + ..() + name = "Change Charge" + module_mode = "select_charge_type" + +/stat_rig_module/charge/AddHref(var/list/href_list) + var/charge_index = module.charges.Find(module.charge_selected) + if(!charge_index) + charge_index = 0 + else + charge_index = charge_index == module.charges.len ? 1 : charge_index+1 + + href_list["charge_type"] = module.charges[charge_index] + +/stat_rig_module/charge/CanUse() + if(module.charges && module.charges.len) + var/datum/rig_charge/charge = module.charges[module.charge_selected] + name = "[charge.display_name] ([charge.charges]C) - Change" + return 1 + return 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 6d572cdcb3..51ee46d0d2 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -66,6 +66,7 @@ name = "teleportation module" desc = "A complex, sleek-looking, hardsuit-integrated teleportation module." + icon_state = "teleporter" use_power_cost = 40 redundant = 1 usable = 1 @@ -126,6 +127,7 @@ name = "net projector" desc = "Some kind of complex energy projector with a hardsuit mount." + icon_state = "enet" interface_name = "energy net launcher" interface_desc = "An advanced energy-patterning projector used to capture targets." @@ -147,6 +149,7 @@ name = "self-destruct module" desc = "Oh my God, Captain. A bomb." + icon_state = "deadman" usable = 1 active = 1 permanent = 1 @@ -176,12 +179,12 @@ explosion(get_turf(src), 1, 2, 4, 5) if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) - del(holder) - del(src) + qdel(holder) + qdel(src) /obj/item/rig_module/self_destruct/small/engage() explosion(get_turf(src), 0, 0, 3, 4) if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) - del(holder) - del(src) \ No newline at end of file + qdel(holder) + qdel(src) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index b4a622075e..79abda20cc 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -28,6 +28,7 @@ /obj/item/rig_module/device/plasmacutter name = "hardsuit plasma cutter" desc = "A lethal-looking industrial cutter." + icon_state = "plasmacutter" interface_name = "plasma cutter" interface_desc = "A self-sustaining plasma arc capable of cutting through walls." suit_overlay_active = "plasmacutter" @@ -38,6 +39,7 @@ /obj/item/rig_module/device/healthscanner name = "health scanner module" desc = "A hardsuit-mounted health scanner." + icon_state = "scanner" interface_name = "health scanner" interface_desc = "Shows an informative health readout when used on a subject." @@ -46,6 +48,7 @@ /obj/item/rig_module/device/drill name = "hardsuit drill mount" desc = "A very heavy diamond-tipped drill." + icon_state = "drill" interface_name = "mounted drill" interface_desc = "A diamond-tipped industrial drill." suit_overlay_active = "mounted-drill" @@ -56,6 +59,7 @@ /obj/item/rig_module/device/anomaly_scanner name = "hardsuit anomaly scanner" desc = "You think it's called an Elder Sarsparilla or something." + icon_state = "eldersasparilla" interface_name = "Alden-Saraspova counter" interface_desc = "An exotic particle detector commonly used by xenoarchaeologists." engage_string = "Begin Scan" @@ -66,6 +70,7 @@ /obj/item/rig_module/device/orescanner name = "ore scanner module" desc = "A clunky old ore scanner." + icon_state = "scanner" interface_name = "ore detector" interface_desc = "A sonar system for detecting large masses of ore." engage_string = "Begin Scan" @@ -76,6 +81,7 @@ /obj/item/rig_module/device/rcd name = "RCD mount" desc = "A cell-powered rapid construction device for a hardsuit." + icon_state = "rcd" interface_name = "mounted RCD" interface_desc = "A device for building or removing walls. Cell-powered." usable = 1 @@ -105,9 +111,12 @@ device.afterattack(target,holder.wearer,1) return 1 + + /obj/item/rig_module/chem_dispenser name = "mounted chemical dispenser" desc = "A complex web of tubing and needles suitable for hardsuit use." + icon_state = "injector" usable = 1 selectable = 0 toggleable = 0 @@ -223,6 +232,19 @@ /obj/item/rig_module/chem_dispenser/combat + name = "combat chemical injector" + desc = "A complex web of tubing and needles suitable for hardsuit use." + + charges = list( + list("synaptizine", "synaptizine", 0, 30), + list("hyperzine", "hyperzine", 0, 30), + list("oxycodone", "oxycodone", 0, 30), + list("nutrients", "nutriment", 0, 80), + ) + + interface_name = "combat chem dispenser" + interface_desc = "Dispenses loaded chemicals directly into the bloodstream." + /obj/item/rig_module/chem_dispenser/injector @@ -239,6 +261,7 @@ name = "hardsuit voice synthesiser" desc = "A speaker box and sound processor." + icon_state = "megaphone" usable = 1 selectable = 0 toggleable = 0 @@ -280,7 +303,7 @@ voice_holder.active = 0 usr << "You disable the speech synthesiser." if("Set Name") - var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null) + var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) return 0 voice_holder.voice = raw_choice @@ -291,6 +314,7 @@ name = "hardsuit maneuvering jets" desc = "A compact gas thruster system for a hardsuit." + icon_state = "thrusters" usable = 1 toggleable = 1 selectable = 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index ec37b58f05..aa106eda02 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -1,8 +1,12 @@ /* * Contains * /obj/item/rig_module/vision + * /obj/item/rig_module/vision/multi * /obj/item/rig_module/vision/meson * /obj/item/rig_module/vision/thermal + * /obj/item/rig_module/vision/nvg + * /obj/item/rig_module/vision/medhud + * /obj/item/rig_module/vision/sechud */ /datum/rig_vision @@ -24,10 +28,21 @@ /datum/rig_vision/meson/New() glasses = new /obj/item/clothing/glasses/meson +/datum/rig_vision/sechud + mode = "security HUD" +/datum/rig_vision/sechud/New() + glasses = new /obj/item/clothing/glasses/hud/security + +/datum/rig_vision/medhud + mode = "medical HUD" +/datum/rig_vision/medhud/New() + glasses = new /obj/item/clothing/glasses/hud/health + /obj/item/rig_module/vision name = "hardsuit visor" desc = "A layered, translucent visor system for a hardsuit." + icon_state = "optics" interface_name = "optical scanners" interface_desc = "An integrated multi-mode vision system." @@ -49,10 +64,27 @@ var/vision_index +/obj/item/rig_module/vision/multi + + name = "hardsuit optical package" + desc = "A complete visor system of optical scanners and vision modes." + icon_state = "fulloptics" + + + interface_name = "multi optical visor" + interface_desc = "An integrated multi-mode vision system." + + vision_modes = list(/datum/rig_vision/meson, + /datum/rig_vision/nvg, + /datum/rig_vision/thermal, + /datum/rig_vision/sechud, + /datum/rig_vision/medhud) + /obj/item/rig_module/vision/meson name = "hardsuit meson scanner" desc = "A layered, translucent visor system for a hardsuit." + icon_state = "meson" usable = 0 @@ -65,6 +97,7 @@ name = "hardsuit thermal scanner" desc = "A layered, translucent visor system for a hardsuit." + icon_state = "thermal" usable = 0 @@ -73,6 +106,46 @@ vision_modes = list(/datum/rig_vision/thermal) +/obj/item/rig_module/vision/nvg + + name = "hardsuit night vision interface" + desc = "A multi input night vision system for a hardsuit." + icon_state = "night" + + usable = 0 + + interface_name = "night vision interface" + interface_desc = "An integrated night vision system." + + vision_modes = list(/datum/rig_vision/nvg) + +/obj/item/rig_module/vision/sechud + + name = "hardsuit security hud" + desc = "A simple tactical information system for a hardsuit." + icon_state = "securityhud" + + usable = 0 + + interface_name = "security HUD" + interface_desc = "An integrated security heads up display." + + vision_modes = list(/datum/rig_vision/sechud) + +/obj/item/rig_module/vision/medhud + + name = "hardsuit medical hud" + desc = "A simple medical status indicator for a hardsuit." + icon_state = "healthhud" + + usable = 0 + + interface_name = "medical HUD" + interface_desc = "An integrated medical heads up display." + + vision_modes = list(/datum/rig_vision/medhud) + + // There should only ever be one vision module installed in a suit. /obj/item/rig_module/vision/installed() ..() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 4c8da1665a..d422a36cca 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -149,12 +149,12 @@ update_icon(1) -/obj/item/weapon/rig/Del() +/obj/item/weapon/rig/Destroy() for(var/obj/item/piece in list(gloves,boots,helmet,chest)) var/mob/living/M = piece.loc if(istype(M)) M.drop_from_inventory(piece) - del(piece) + qdel(piece) processing_objects -= src ..() @@ -459,7 +459,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, ((src.loc != user) ? ai_interface_path : interface_path), interface_title, 480, 550) + ui = new(user, src, ui_key, ((src.loc != user) ? ai_interface_path : interface_path), interface_title, 480, 550, data["ai"] ? contained_state : inventory_state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -631,8 +631,9 @@ use_obj.loc = src else if (deploy_mode != ONLY_RETRACT) - if(check_slot && check_slot != use_obj) - H << "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way." + if(check_slot) + if(check_slot != use_obj) + H << "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way." return else use_obj.loc = H @@ -658,25 +659,25 @@ var/obj/item/garbage = H.head H.drop_from_inventory(garbage) H.head = null - del(garbage) + qdel(garbage) if(H.gloves) var/obj/item/garbage = H.gloves H.drop_from_inventory(garbage) H.gloves = null - del(garbage) + qdel(garbage) if(H.shoes) var/obj/item/garbage = H.shoes H.drop_from_inventory(garbage) H.shoes = null - del(garbage) + qdel(garbage) if(H.wear_suit) var/obj/item/garbage = H.wear_suit H.drop_from_inventory(garbage) H.wear_suit = null - del(garbage) + qdel(garbage) for(var/piece in list("helmet","gauntlets","chest","boots")) toggle_piece(piece, H, ONLY_DEPLOY) @@ -775,6 +776,14 @@ return 0 wearer.Move(null,dir)*/ +/atom/proc/get_rig() + if(loc) + return loc.get_rig() + return null + +/obj/item/weapon/rig/get_rig() + return src + #undef ONLY_DEPLOY #undef ONLY_RETRACT #undef SEAL_DELAY diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm index 9be2576838..3965d57d4a 100644 --- a/code/modules/clothing/spacesuits/rig/suits/combat.dm +++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm @@ -8,11 +8,16 @@ suit_type = "combat hardsuit" armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) slowdown = 1 + offline_slowdown = 3 offline_vision_restriction = 1 helm_type = /obj/item/clothing/head/helmet/space/rig/combat allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton) + +/obj/item/weapon/rig/combat/equipped + + initial_modules = list( /obj/item/rig_module/mounted, /obj/item/rig_module/vision/thermal, diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index feec1f5810..70c21d5108 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -1,6 +1,6 @@ /obj/item/clothing/head/helmet/space/rig/ert light_overlay = "helmet_light_dual" - camera_networks = list("ERT","SS13") + camera_networks = list("ERT") /obj/item/weapon/rig/ert name = "ERT-C hardsuit control module" @@ -12,11 +12,11 @@ req_access = list(access_cent_specops) - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60) + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \ /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \ - /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, \ - /obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller) + /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller) initial_modules = list( /obj/item/rig_module/ai_container, @@ -29,7 +29,6 @@ desc = "A suit worn by the engineering division of a NanoTrasen Emergency Response Team. Has orange highlights. Armoured and space ready." suit_type = "ERT engineer" icon_state = "ert_engineer_rig" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) glove_type = /obj/item/clothing/gloves/rig/ert_engineer @@ -68,4 +67,23 @@ /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/grenade_launcher, /obj/item/rig_module/mounted/egun, + ) + +/obj/item/weapon/rig/ert/assetprotection + name = "Heavy Asset Protection suit control module" + desc = "A heavy suit worn by the highest level of Nanotrasen Asset Protection, don't mess with the person wearing this. Armoured and space ready." + suit_type = "heavy asset protection" + icon_state = "asset_protection_rig" + armor = list(melee = 60, bullet = 50, laser = 50,energy = 40, bomb = 40, bio = 100, rad = 100) + + initial_modules = list( + /obj/item/rig_module/ai_container, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/vision/multi, + /obj/item/rig_module/mounted/egun, + /obj/item/rig_module/chem_dispenser/injector, + /obj/item/rig_module/device/plasmacutter, + /obj/item/rig_module/device/rcd, + /obj/item/rig_module/datajack ) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm index 8e7b70d5f2..22add92014 100644 --- a/code/modules/clothing/spacesuits/rig/suits/merc.dm +++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm @@ -9,6 +9,7 @@ suit_type = "crimson hardsuit" armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) slowdown = 1 + offline_slowdown = 3 offline_vision_restriction = 1 helm_type = /obj/item/clothing/head/helmet/space/rig/merc diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 2723a57360..5ba33b2fc1 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -1,19 +1,45 @@ +/obj/item/clothing/head/helmet/space/rig/industrial + camera_networks = list("Mine") + +/obj/item/clothing/head/helmet/space/rig/ce + camera_networks = list("Engineering") + +/obj/item/clothing/head/helmet/space/rig/eva + light_overlay = "helmet_light_dual" + camera_networks = list("Engineering") + +/obj/item/clothing/head/helmet/space/rig/hazmat + light_overlay = "hardhat_light" + camera_networks = list("Research") + +/obj/item/clothing/head/helmet/space/rig/medical + camera_networks = list("Medbay") + +/obj/item/clothing/head/helmet/space/rig/hazard + light_overlay = "helmet_light_dual" + camera_networks = list("Security") + /obj/item/weapon/rig/industrial name = "industrial suit control module" suit_type = "industrial hardsuit" desc = "A heavy, powerful rig used by construction crews and mining corporations." icon_state = "engineering_rig" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50) slowdown = 3 offline_slowdown = 10 offline_vision_restriction = 2 emp_protection = -20 + helm_type = /obj/item/clothing/head/helmet/space/rig/industrial + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) req_access = list() req_one_access = list() + +/obj/item/weapon/rig/industrial/equipped + initial_modules = list( /obj/item/rig_module/device/plasmacutter, /obj/item/rig_module/device/drill, @@ -22,6 +48,32 @@ /obj/item/rig_module/vision/meson ) +/obj/item/weapon/rig/eva + name = "EVA suit control module" + suit_type = "EVA hardsuit" + desc = "A light rig for repairs and maintenance to the outside of habitats and vessels." + icon_state = "eva_rig" + armor = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100) + slowdown = 0 + offline_slowdown = 1 + offline_vision_restriction = 1 + + helm_type = /obj/item/clothing/head/helmet/space/rig/eva + + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/toolbox,/obj/item/weapon/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/weapon/rcd) + + req_access = list() + req_one_access = list() + +/obj/item/weapon/rig/eva/equipped + + initial_modules = list( + /obj/item/rig_module/device/plasmacutter, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/device/rcd, + /obj/item/rig_module/vision/meson + ) + //Chief Engineer's rig. This is sort of a halfway point between the old hardsuits (voidsuits) and the rig class. /obj/item/weapon/rig/ce @@ -29,13 +81,24 @@ suit_type = "advanced voidsuit" desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish." icon_state = "ce_rig" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 40, bullet = 10, laser = 30,energy = 25, bomb = 40, bio = 100, rad = 100) slowdown = 0 offline_slowdown = 0 offline_vision_restriction = 0 + helm_type = /obj/item/clothing/head/helmet/space/rig/ce + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) + + req_access = list() + req_one_access = list() + + boot_type = null + glove_type = null + +/obj/item/weapon/rig/ce/equipped + req_access = list(access_ce) initial_modules = list( @@ -55,14 +118,21 @@ suit_type = "hazmat hardsuit" desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it." icon_state = "science_rig" - armor = list(melee = 15, bullet = 15, laser = 80, energy = 80, bomb = 60, bio = 100, rad = 100) + armor = list(melee = 45, bullet = 5, laser = 45, energy = 80, bomb = 60, bio = 100, rad = 100) slowdown = 1 offline_vision_restriction = 1 + helm_type = /obj/item/clothing/head/helmet/space/rig/hazmat + helm_type = /obj/item/clothing/head/helmet/space/rig/ert allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils) + req_access = list() + req_one_access = list() + +/obj/item/weapon/rig/hazmat/equipped + req_access = list(access_rd) initial_modules = list( @@ -81,30 +151,45 @@ slowdown = 1 offline_vision_restriction = 1 + helm_type = /obj/item/clothing/head/helmet/space/rig/medical + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller ) req_access = list() req_one_access = list() +/obj/item/weapon/rig/medical/equipped + initial_modules = list( /obj/item/rig_module/chem_dispenser/injector, /obj/item/rig_module/maneuvering_jets, - /obj/item/rig_module/device/healthscanner + /obj/item/rig_module/device/healthscanner, + /obj/item/rig_module/vision/medhud ) /obj/item/weapon/rig/hazard name = "hazard hardsuit control module" suit_type = "hazard hardsuit" - desc = "A Nanotrasen security hardsuit designed for prolonged EVA in dangerous environments. The name HARPER is printed on the control unit." + desc = "A Nanotrasen security hardsuit designed for prolonged EVA in dangerous environments." icon_state = "hazard_rig" - armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) + armor = list(melee = 60, bullet = 40, laser = 30, energy = 15, bomb = 60, bio = 100, rad = 30) slowdown = 1 + offline_slowdown = 3 offline_vision_restriction = 1 - helm_type = /obj/item/clothing/head/helmet/space/rig/ert + helm_type = /obj/item/clothing/head/helmet/space/rig/hazard allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton) req_access = list() req_one_access = list() + +/obj/item/weapon/rig/hazard/equipped + + initial_modules = list( + /obj/item/rig_module/vision/sechud, + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/mounted/taser + ) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 8f65da83b6..5cb1d8446e 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -21,130 +21,130 @@ //Green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/green - name = "Green Space Helmet" + name = "green space helmet" icon_state = "syndicate-helm-green" item_state = "syndicate-helm-green" /obj/item/clothing/suit/space/syndicate/green - name = "Green Space Suit" + name = "green space suit" icon_state = "syndicate-green" item_state = "syndicate-green" //Dark green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/green/dark - name = "Dark Green Space Helmet" + name = "dark green space helmet" icon_state = "syndicate-helm-green-dark" item_state = "syndicate-helm-green-dark" /obj/item/clothing/suit/space/syndicate/green/dark - name = "Dark Green Space Suit" + name = "dark green space suit" icon_state = "syndicate-green-dark" item_state = "syndicate-green-dark" //Orange syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/orange - name = "Orange Space Helmet" + name = "orange space helmet" icon_state = "syndicate-helm-orange" item_state = "syndicate-helm-orange" /obj/item/clothing/suit/space/syndicate/orange - name = "Orange Space Suit" + name = "orange space suit" icon_state = "syndicate-orange" item_state = "syndicate-orange" //Blue syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/blue - name = "Blue Space Helmet" + name = "blue space helmet" icon_state = "syndicate-helm-blue" item_state = "syndicate-helm-blue" /obj/item/clothing/suit/space/syndicate/blue - name = "Blue Space Suit" + name = "blue space suit" icon_state = "syndicate-blue" item_state = "syndicate-blue" //Black syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black - name = "Black Space Helmet" + name = "black space helmet" icon_state = "syndicate-helm-black" item_state = "syndicate-helm-black" /obj/item/clothing/suit/space/syndicate/black - name = "Black Space Suit" + name = "black space suit" icon_state = "syndicate-black" item_state = "syndicate-black" //Black-green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/green - name = "Black Space Helmet" + name = "black and green space helmet" icon_state = "syndicate-helm-black-green" item_state = "syndicate-helm-black-green" /obj/item/clothing/suit/space/syndicate/black/green - name = "Black and Green Space Suit" + name = "black and green space suit" icon_state = "syndicate-black-green" item_state = "syndicate-black-green" //Black-blue syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/blue - name = "Black Space Helmet" + name = "black and blue space helmet" icon_state = "syndicate-helm-black-blue" item_state = "syndicate-helm-black-blue" /obj/item/clothing/suit/space/syndicate/black/blue - name = "Black and Blue Space Suit" + name = "black and blue space suit" icon_state = "syndicate-black-blue" item_state = "syndicate-black-blue" //Black medical syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/med - name = "Black Space Helmet" + name = "black medical space helmet" icon_state = "syndicate-helm-black-med" item_state = "syndicate-helm-black" /obj/item/clothing/suit/space/syndicate/black/med - name = "Green Space Suit" + name = "black medical space suit" icon_state = "syndicate-black-med" item_state = "syndicate-black" //Black-orange syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/orange - name = "Black Space Helmet" + name = "black and orange space helmet" icon_state = "syndicate-helm-black-orange" item_state = "syndicate-helm-black" /obj/item/clothing/suit/space/syndicate/black/orange - name = "Black and Orange Space Suit" + name = "black and orange space suit" icon_state = "syndicate-black-orange" item_state = "syndicate-black" //Black-red syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/red - name = "Black Space Helmet" + name = "black and red space helmet" icon_state = "syndicate-helm-black-red" item_state = "syndicate-helm-black-red" /obj/item/clothing/suit/space/syndicate/black/red - name = "Black and Red Space Suit" + name = "black and red space suit" icon_state = "syndicate-black-red" item_state = "syndicate-black-red" //Black with yellow/red engineering syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/engie - name = "Black Space Helmet" + name = "black engineering space helmet" icon_state = "syndicate-helm-black-engie" item_state = "syndicate-helm-black" /obj/item/clothing/suit/space/syndicate/black/engie - name = "Black Engineering Space Suit" + name = "black engineering space suit" icon_state = "syndicate-black-engie" item_state = "syndicate-black" \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/merc.dm b/code/modules/clothing/spacesuits/void/merc.dm index 907ad044fd..0d2ea51ad2 100644 --- a/code/modules/clothing/spacesuits/void/merc.dm +++ b/code/modules/clothing/spacesuits/void/merc.dm @@ -4,7 +4,6 @@ desc = "An advanced helmet designed for work in special operations. Property of Gorlex Marauders." icon_state = "rig0-syndie" item_state = "syndie_helm" - item_color = "syndie" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.6 species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox", "Xenomorph", "Xenomorph Drone", "Xenomorph Hunter", "Xenomorph Sentinel", "Xenomorph Queen") diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index f4ef7cb8f8..b7477e2f0e 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -22,7 +22,6 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating." icon_state = "rig0-mining" item_state = "mining_helm" - item_color = "mining" armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20) light_overlay = "helmet_light_dual" @@ -39,7 +38,6 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding." icon_state = "rig0-medical" item_state = "medical_helm" - item_color = "medical" armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50) /obj/item/clothing/suit/space/void/medical @@ -56,7 +54,6 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." icon_state = "rig0-sec" item_state = "sec_helm" - item_color = "sec" armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) siemens_coefficient = 0.7 light_overlay = "helmet_light_dual" @@ -76,7 +73,6 @@ name = "atmospherics voidsuit helmet" icon_state = "rig0-atmos" item_state = "atmos_helm" - item_color = "atmos" armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50) max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE light_overlay = "helmet_light_dual" diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 68a619ba28..6854513138 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -55,6 +55,21 @@ //Inbuilt devices. var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any. var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any. + var/obj/item/weapon/tank/tank = null // Deployable tank, if any. + +/obj/item/clothing/suit/space/void/examine(user) + ..(user) + if(boots || helmet || tank) + var/D = "Installed equipment: " + var/first = 1 + for(var/obj/item/I in list(helmet,boots,tank)) + if (I) + D += "[first?"":", "]\the [I]\icon[I]" + first = 0 + D += "." + user << D + if(tank && in_range(src,user)) + user << "The wrist-mounted pressure gauge reads [max(round(tank.air_contents.return_pressure()),0)] kPa remaining in \the [tank]." /obj/item/clothing/suit/space/void/refit_for_species(var/target_species) ..() @@ -87,6 +102,13 @@ M << "Your suit's boots deploy with a hiss." boots.canremove = 0 + if(tank) + if(H.s_store) //In case someone finds a way. + M << "Alarmingly, the valve on your suit's installed tank fails to engage." + else if (H.equip_to_slot_if_possible(tank, slot_s_store)) + M << "The valve on your suit's installed tank safely engages." + tank.canremove = 0 + /obj/item/clothing/suit/space/void/dropped() ..() @@ -108,6 +130,10 @@ H.drop_from_inventory(boots) boots.loc = src + if(tank) + tank.canremove = 1 + tank.loc = src + /obj/item/clothing/suit/space/void/verb/toggle_helmet() set name = "Toggle Helmet" @@ -127,7 +153,7 @@ if(H.wear_suit != src) return if(H.head == helmet) - H << "\blue You retract your suit helmet." + H << "You retract your suit helmet." helmet.canremove = 1 H.drop_from_inventory(helmet) helmet.loc = src @@ -138,9 +164,32 @@ if(H.equip_to_slot_if_possible(helmet, slot_head)) helmet.pickup(H) helmet.canremove = 0 - H << "You deploy your suit helmet, sealing you off from the world." + H << "You deploy your suit helmet, sealing you off from the world." helmet.update_light(H) +/obj/item/clothing/suit/space/void/verb/eject_tank() + + set name = "Eject Tank" + set category = "Object" + set src in usr + + if(!istype(src.loc,/mob/living)) return + + if(!tank) + usr << "There is no tank inserted." + return + + var/mob/living/carbon/human/H = usr + + if(!istype(H)) return + if(H.stat) return + if(H.wear_suit != src) return + + H << "You press the emergency release, ejecting \the [tank] from your suit." + tank.canremove = 1 + H.drop_from_inventory(tank) + src.tank = null + /obj/item/clothing/suit/space/void/attackby(obj/item/W as obj, mob/user as mob) if(!istype(user,/mob/living)) return @@ -150,7 +199,11 @@ return if(istype(W,/obj/item/weapon/screwdriver)) - if(helmet) + if(tank) + user << "You pop \the [tank] out of \the [src]'s storage compartment." + tank.loc = get_turf(src) + src.tank = null + else if(helmet) user << "You detatch \the [helmet] from \the [src]'s helmet mount." helmet.loc = get_turf(src) src.helmet = null @@ -179,5 +232,16 @@ W.loc = src boots = W return + else if(istype(W,/obj/item/weapon/tank)) + if(tank) + user << "\The [src] already has an airtank installed." + else if(istype(W,/obj/item/weapon/tank/phoron)) + user << "\The [W] cannot be inserted into \the [src]'s storage compartment." + else + user << "You insert \the [W] into \the [src]'s storage compartment." + user.drop_item() + W.loc = src + tank = W + return ..() \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm index bddf9f7f2e..2fc0c76dbd 100644 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ b/code/modules/clothing/spacesuits/void/wizard.dm @@ -4,12 +4,12 @@ desc = "A bizarre gem-encrusted helmet that radiates magical energies." icon_state = "rig0-wiz" item_state = "wiz_helm" - item_color = "wiz" unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles! armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 sprite_sheets_refit = null sprite_sheets_obj = null + wizard_garb = 1 /obj/item/clothing/suit/space/void/wizard icon_state = "rig-wiz" @@ -22,4 +22,5 @@ armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 sprite_sheets_refit = null - sprite_sheets_obj = null \ No newline at end of file + sprite_sheets_obj = null + wizard_garb = 1 diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bcca81141c..fb9d27f7a5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -237,21 +237,18 @@ name = "pink swimsuit" desc = "A rather skimpy pink swimsuit." icon_state = "stripper_p_under" - item_color = "stripper_p" siemens_coefficient = 1 /obj/item/clothing/under/stripper/stripper_green name = "green swimsuit" desc = "A rather skimpy green swimsuit." icon_state = "stripper_g_under" - item_color = "stripper_g" siemens_coefficient = 1 /obj/item/clothing/suit/stripper/stripper_pink name = "pink skimpy dress" desc = "A rather skimpy pink dress." icon_state = "stripper_p_over" - item_state = "stripper_p" siemens_coefficient = 1 /obj/item/clothing/suit/stripper/stripper_green @@ -265,7 +262,6 @@ name = "the mankini" desc = "No honest man would wear this abomination" icon_state = "mankini" - item_color = "mankini" siemens_coefficient = 1 /obj/item/clothing/suit/xenos @@ -285,35 +281,30 @@ name = "black swimsuit" desc = "An oldfashioned black swimsuit." icon_state = "swim_black" - item_color = "swim_black" siemens_coefficient = 1 /obj/item/clothing/under/swimsuit/blue name = "blue swimsuit" desc = "An oldfashioned blue swimsuit." icon_state = "swim_blue" - item_color = "swim_blue" siemens_coefficient = 1 /obj/item/clothing/under/swimsuit/purple name = "purple swimsuit" desc = "An oldfashioned purple swimsuit." icon_state = "swim_purp" - item_color = "swim_purp" siemens_coefficient = 1 /obj/item/clothing/under/swimsuit/green name = "green swimsuit" desc = "An oldfashioned green swimsuit." icon_state = "swim_green" - item_color = "swim_green" siemens_coefficient = 1 /obj/item/clothing/under/swimsuit/red name = "red swimsuit" desc = "An oldfashioned red swimsuit." icon_state = "swim_red" - item_color = "swim_red" siemens_coefficient = 1 /obj/item/clothing/suit/poncho diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 692e2987f5..221a8dbd29 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -8,6 +8,11 @@ pockets.max_w_class = 2 //fit only pocket sized items pockets.max_storage_space = 4 +/obj/item/clothing/suit/storage/Destroy() + qdel(pockets) + pockets = null + ..() + /obj/item/clothing/suit/storage/attack_hand(mob/user as mob) if (pockets.handle_attack_hand(user)) ..(user) @@ -59,7 +64,6 @@ pockets.max_w_class = 2 pockets.max_storage_space = 8 - /obj/item/clothing/suit/storage/vest var/icon_badge var/icon_nobadge diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 03240b2f3c..69e51093f9 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -5,6 +5,7 @@ //Not given any special protective value since the magic robes are full-body protection --NEO siemens_coefficient = 0.8 body_parts_covered = 0 + wizard_garb = 1 /obj/item/clothing/head/wizard/red name = "red wizard hat" @@ -55,6 +56,7 @@ allowed = list(/obj/item/weapon/teleportation_scroll) flags_inv = HIDEJUMPSUIT siemens_coefficient = 0.8 + wizard_garb = 1 /obj/item/clothing/suit/wizrobe/red name = "red wizard robe" diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index f606c84670..8ce02ec8e5 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -4,16 +4,16 @@ icon = 'icons/obj/clothing/ties.dmi' icon_state = "bluetie" item_state = "" //no inhands - item_color = "bluetie" slot_flags = SLOT_TIE w_class = 2.0 var/slot = "decor" var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. + var/overlay_state = null /obj/item/clothing/accessory/New() ..() - inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[item_color? "[item_color]" : "[icon_state]"]") + inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[overlay_state? "[overlay_state]" : "[icon_state]"]") //when user attached an accessory to S /obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob) @@ -47,24 +47,20 @@ /obj/item/clothing/accessory/blue name = "blue tie" icon_state = "bluetie" - item_color = "bluetie" /obj/item/clothing/accessory/red name = "red tie" icon_state = "redtie" - item_color = "redtie" /obj/item/clothing/accessory/horrible name = "horrible tie" desc = "A neosilk clip-on tie. This one is disgusting." icon_state = "horribletie" - item_color = "horribletie" /obj/item/clothing/accessory/stethoscope name = "stethoscope" desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." icon_state = "stethoscope" - item_color = "stethoscope" /obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user) if(ishuman(M) && isliving(user)) @@ -105,7 +101,6 @@ name = "bronze medal" desc = "A bronze medal." icon_state = "bronze" - item_color = "bronze" /obj/item/clothing/accessory/medal/conduct name = "distinguished conduct medal" @@ -124,7 +119,6 @@ name = "silver medal" desc = "A silver medal." icon_state = "silver" - item_color = "silver" /obj/item/clothing/accessory/medal/silver/valor name = "medal of valor" @@ -138,7 +132,6 @@ name = "gold medal" desc = "A prestigious golden medal." icon_state = "gold" - item_color = "gold" /obj/item/clothing/accessory/medal/gold/captain name = "medal of captaincy" @@ -158,7 +151,6 @@ name = "holobadge" desc = "This glowing blue badge marks the holder as THE LAW." icon_state = "holobadge" - item_color = "holobadge" slot_flags = SLOT_BELT | SLOT_TIE var/emagged = 0 //Emagging removes Sec check. @@ -166,7 +158,6 @@ /obj/item/clothing/accessory/holobadge/cord icon_state = "holobadge-cord" - item_color = "holobadge-cord" slot_flags = SLOT_MASK | SLOT_TIE /obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob) diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm index 67d0208b6d..9aa2ec2b70 100644 --- a/code/modules/clothing/under/accessories/armband.dm +++ b/code/modules/clothing/under/accessories/armband.dm @@ -2,41 +2,34 @@ name = "red armband" desc = "A fancy red armband!" icon_state = "red" - item_color = "red" slot = "armband" /obj/item/clothing/accessory/armband/cargo name = "cargo armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown." icon_state = "cargo" - item_color = "cargo" /obj/item/clothing/accessory/armband/engine name = "engineering armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is orange with a reflective strip!" icon_state = "engie" - item_color = "engie" /obj/item/clothing/accessory/armband/science name = "science armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is purple." icon_state = "rnd" - item_color = "rnd" /obj/item/clothing/accessory/armband/hydro name = "hydroponics armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is green and blue." icon_state = "hydro" - item_color = "hydro" /obj/item/clothing/accessory/armband/med name = "medical armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is white." icon_state = "med" - item_color = "med" /obj/item/clothing/accessory/armband/medgreen name = "EMT armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green." icon_state = "medgreen" - item_color = "medgreen" diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index f02ae38a5a..51ce02a7ed 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -2,7 +2,6 @@ name = "shoulder holster" desc = "A handgun holster." icon_state = "holster" - item_color = "holster" slot = "utility" var/obj/item/holstered = null @@ -108,16 +107,14 @@ name = "armpit holster" desc = "A worn-out handgun holster. Perfect for concealed carry" icon_state = "holster" - item_color = "holster" /obj/item/clothing/accessory/holster/waist name = "waist holster" desc = "A handgun holster. Made of expensive leather." icon_state = "holster" - item_color = "holster_low" + overlay_state = "holster_low" /obj/item/clothing/accessory/holster/hip name = "hip holster" desc = "A handgun holster slung low on the hip, draw pardner!" icon_state = "holster_hip" - item_color = "holster_hip" \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 6c6c683b27..7f13449d16 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -2,7 +2,6 @@ name = "load bearing equipment" desc = "Used to hold things when you don't have enough hands." icon_state = "webbing" - item_color = "webbing" slot = "utility" var/slots = 3 var/obj/item/weapon/storage/internal/hold @@ -51,27 +50,23 @@ name = "webbing" desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden." icon_state = "webbing" - item_color = "webbing" /obj/item/clothing/accessory/storage/black_vest name = "black webbing vest" desc = "Robust black synthcotton vest with lots of pockets to hold whatever you need, but cannot hold in hands." icon_state = "vest_black" - item_color = "vest_black" slots = 5 /obj/item/clothing/accessory/storage/brown_vest name = "brown webbing vest" desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands." icon_state = "vest_brown" - item_color = "vest_brown" slots = 5 /obj/item/clothing/accessory/storage/knifeharness name = "decorated harness" desc = "A heavily decorated harness of sinew and leather with two knife-loops." icon_state = "unathiharness2" - item_color = "unathiharness2" slots = 2 /obj/item/clothing/accessory/storage/knifeharness/New() diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index 01bea29b2e..4de31fb6e3 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -7,7 +7,7 @@ name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" - item_color = "black" + worn_state = "black" desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." origin_tech = "syndicate=3" var/list/clothing_choices = list() @@ -24,7 +24,7 @@ name = "psychedelic" desc = "Groovy!" icon_state = "psyche" - item_color = "psyche" + item_state_slots[slot_w_uniform_str] = "psyche" update_icon() update_clothing_icon() @@ -37,7 +37,7 @@ if(!picked || !clothing_choices[picked]) return var/newtype = clothing_choices[picked] - var/obj/item/clothing/A = new newtype + var/obj/item/clothing/under/A = new newtype desc = null permeability_coefficient = 0.90 @@ -46,7 +46,8 @@ name = A.name icon_state = A.icon_state item_state = A.item_state - item_color = A.item_color + item_state_slots = A.item_state_slots + worn_state = A.worn_state body_parts_covered = A.body_parts_covered update_clothing_icon() //so our overlays update. @@ -58,7 +59,6 @@ name = "grey cap" icon_state = "greysoft" item_state = "greysoft" - item_color = "grey" desc = "It looks like a plain hat, but upon closer inspection, there's an advanced holographic array installed inside. It seems to have a small dial inside." origin_tech = "syndicate=3" body_parts_covered = 0 @@ -76,7 +76,6 @@ name = "grey cap" desc = "It's a baseball hat in a tasteful grey colour." icon_state = "greysoft" - item_color = "grey" update_icon() update_clothing_icon() @@ -98,7 +97,6 @@ name = A.name icon_state = A.icon_state item_state = A.item_state - item_color = A.item_color flags_inv = A.flags_inv body_parts_covered = A.body_parts_covered update_clothing_icon() //so our overlays update. @@ -128,7 +126,6 @@ name = "armor" desc = "An armored vest that protects against some damage." icon_state = "armor" - item_color = "armor" update_icon() update_clothing_icon() @@ -150,7 +147,6 @@ name = A.name icon_state = A.icon_state item_state = A.item_state - item_color = A.item_color flags_inv = A.flags_inv body_parts_covered = A.body_parts_covered update_clothing_icon() //so our overlays update. @@ -162,7 +158,6 @@ name = "black shoes" icon_state = "black" item_state = "black" - item_color = "black" desc = "They're comfy black shoes, with clever cloaking technology built in. It seems to have a small dial on the back of each shoe." origin_tech = "syndicate=3" var/list/clothing_choices = list() @@ -180,7 +175,6 @@ desc = "A pair of black shoes." icon_state = "black" item_state = "black" - item_color = "black" update_icon() update_clothing_icon() @@ -202,7 +196,6 @@ name = A.name icon_state = A.icon_state item_state = A.item_state - item_color = A.item_color update_clothing_icon() //so our overlays update. //********************** @@ -252,7 +245,6 @@ name = A.name icon_state = A.icon_state item_state = A.item_state - item_color = A.item_color //so our overlays update. if (ismob(src.loc)) @@ -267,7 +259,6 @@ name = "black gloves" icon_state = "black" item_state = "bgloves" - item_color = "brown" desc = "It looks like a pair of gloves, but it seems to have a small dial inside." origin_tech = "syndicate=3" var/list/clothing_choices = list() @@ -284,7 +275,6 @@ name = "black gloves" desc = "It looks like a pair of gloves, but it seems to have a small dial inside." icon_state = "black" - item_color = "brown" update_icon() update_clothing_icon() @@ -306,7 +296,6 @@ name = A.name icon_state = A.icon_state item_state = A.item_state - item_color = A.item_color flags_inv = A.flags_inv update_clothing_icon() //so our overlays update. diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 483974f7a2..725f51b1ef 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -2,39 +2,39 @@ name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" - item_color = "black" + worn_state = "black" /obj/item/clothing/under/color/blackf name = "feminine black jumpsuit" desc = "It's very smart and in a ladies-size!" icon_state = "black" item_state = "bl_suit" - item_color = "blackf" + worn_state = "blackf" /obj/item/clothing/under/color/blue name = "blue jumpsuit" icon_state = "blue" item_state = "b_suit" - item_color = "blue" + worn_state = "blue" /obj/item/clothing/under/color/green name = "green jumpsuit" icon_state = "green" item_state = "g_suit" - item_color = "green" + worn_state = "green" /obj/item/clothing/under/color/grey name = "grey jumpsuit" icon_state = "grey" item_state = "gy_suit" - item_color = "grey" + worn_state = "grey" /obj/item/clothing/under/color/orange name = "orange jumpsuit" desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." icon_state = "orange" item_state = "o_suit" - item_color = "orange" + worn_state = "orange" has_sensor = 2 sensor_mode = 3 @@ -42,101 +42,106 @@ name = "pink jumpsuit" icon_state = "pink" item_state = "p_suit" - item_color = "pink" + worn_state = "pink" /obj/item/clothing/under/color/red name = "red jumpsuit" icon_state = "red" item_state = "r_suit" - item_color = "red" + worn_state = "red" /obj/item/clothing/under/color/white name = "white jumpsuit" icon_state = "white" item_state = "w_suit" - item_color = "white" + worn_state = "white" /obj/item/clothing/under/color/yellow name = "yellow jumpsuit" icon_state = "yellow" item_state = "y_suit" - item_color = "yellow" + worn_state = "yellow" /obj/item/clothing/under/psyche name = "psychedelic jumpsuit" desc = "Groovy!" icon_state = "psyche" - item_color = "psyche" + item_state = "psyche" + worn_state = "psyche" /obj/item/clothing/under/lightblue name = "lightblue jumpsuit" desc = "lightblue" icon_state = "lightblue" - item_color = "lightblue" + item_state = "b_suit" + worn_state = "lightblue" /obj/item/clothing/under/aqua name = "aqua jumpsuit" desc = "aqua" icon_state = "aqua" - item_color = "aqua" + item_state = "b_suit" + worn_state = "aqua" /obj/item/clothing/under/purple name = "purple jumpsuit" desc = "purple" icon_state = "purple" item_state = "p_suit" - item_color = "purple" + worn_state = "purple" /obj/item/clothing/under/lightpurple name = "lightpurple jumpsuit" desc = "lightpurple" icon_state = "lightpurple" - item_color = "lightpurple" + item_state = "p_suit" + worn_state = "lightpurple" /obj/item/clothing/under/lightgreen name = "lightgreen jumpsuit" desc = "lightgreen" icon_state = "lightgreen" - item_color = "lightgreen" - -/obj/item/clothing/under/lightblue - name = "lightblue jumpsuit" - desc = "lightblue" - icon_state = "lightblue" - item_color = "lightblue" + item_state = "g_suit" + worn_state = "lightgreen" /obj/item/clothing/under/lightbrown name = "lightbrown jumpsuit" desc = "lightbrown" icon_state = "lightbrown" - item_color = "lightbrown" + item_state = "lb_suit" + worn_state = "lightbrown" /obj/item/clothing/under/brown name = "brown jumpsuit" desc = "brown" icon_state = "brown" - item_color = "brown" + item_state = "lb_suit" + worn_state = "brown" /obj/item/clothing/under/yellowgreen name = "yellowgreen jumpsuit" desc = "yellowgreen" icon_state = "yellowgreen" - item_color = "yellowgreen" + item_state = "y_suit" + worn_state = "yellowgreen" /obj/item/clothing/under/darkblue name = "darkblue jumpsuit" desc = "darkblue" icon_state = "darkblue" - item_color = "darkblue" + item_state = "b_suit" + worn_state = "darkblue" /obj/item/clothing/under/lightred name = "lightred jumpsuit" desc = "lightred" icon_state = "lightred" - item_color = "lightred" + item_state = "r_suit" + worn_state = "lightred" /obj/item/clothing/under/darkred name = "darkred jumpsuit" desc = "darkred" icon_state = "darkred" - item_color = "darkred" + item_state = "r_suit" + worn_state = "darkred" diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 9ac511b4f7..37f7a74c96 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -5,15 +5,15 @@ name = "bartender's uniform" icon_state = "ba_suit" item_state = "ba_suit" - item_color = "ba_suit" + worn_state = "ba_suit" /obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"." name = "captain's jumpsuit" icon_state = "captain" - item_state = "caparmor" - item_color = "captain" + item_state = "b_suit" + worn_state = "captain" /obj/item/clothing/under/rank/cargo @@ -21,7 +21,7 @@ desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qm" item_state = "lb_suit" - item_color = "qm" + worn_state = "qm" /obj/item/clothing/under/rank/cargotech @@ -29,7 +29,7 @@ desc = "Shooooorts! They're comfy and easy to wear!" icon_state = "cargotech" item_state = "lb_suit" - item_color = "cargo" + worn_state = "cargo" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -38,14 +38,15 @@ name = "chaplain's jumpsuit" icon_state = "chaplain" item_state = "bl_suit" - item_color = "chapblack" + worn_state = "chapblack" /obj/item/clothing/under/rank/chef desc = "It's an apron which is given only to the most hardcore chefs in space." name = "chef's uniform" icon_state = "chef" - item_color = "chef" + item_state = "w_suit" + worn_state = "chef" /obj/item/clothing/under/rank/clown @@ -53,7 +54,7 @@ desc = "'HONK!'" icon_state = "clown" item_state = "clown" - item_color = "clown" + worn_state = "clown" /obj/item/clothing/under/rank/head_of_personnel @@ -61,14 +62,14 @@ name = "head of personnel's jumpsuit" icon_state = "hop" item_state = "b_suit" - item_color = "hop" + worn_state = "hop" /obj/item/clothing/under/rank/head_of_personnel_whimsy desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does." name = "head of personnel's suit" icon_state = "hopwhimsy" - item_state = "hopwhimsy" - item_color = "hopwhimsy" + item_state = "b_suit" + worn_state = "hopwhimsy" /obj/item/clothing/under/rank/hydroponics @@ -76,7 +77,7 @@ name = "botanist's jumpsuit" icon_state = "hydroponics" item_state = "g_suit" - item_color = "hydroponics" + worn_state = "hydroponics" permeability_coefficient = 0.50 @@ -84,15 +85,16 @@ desc = "The plain, professional attire of an Internal Affairs Agent. The collar is immaculately starched." name = "Internal Affairs uniform" icon_state = "internalaffairs" - item_state = "internalaffairs" - item_color = "internalaffairs" + item_state = "ba_suit" + worn_state = "internalaffairs" /obj/item/clothing/under/rank/janitor desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." name = "janitor's jumpsuit" icon_state = "janitor" - item_color = "janitor" + worn_state = "janitor" + item_state = "janitor" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -105,69 +107,69 @@ name = "black Lawyer suit" icon_state = "lawyer_black" item_state = "lawyer_black" - item_color = "lawyer_black" + worn_state = "lawyer_black" /obj/item/clothing/under/lawyer/female name = "black Lawyer suit" icon_state = "black_suit_fem" - item_state = "black_suit_fem" - item_color = "black_suit_fem" + item_state = "lawyer_black" + worn_state = "black_suit_fem" /obj/item/clothing/under/lawyer/red name = "red Lawyer suit" icon_state = "lawyer_red" item_state = "lawyer_red" - item_color = "lawyer_red" + worn_state = "lawyer_red" /obj/item/clothing/under/lawyer/blue name = "blue Lawyer suit" icon_state = "lawyer_blue" item_state = "lawyer_blue" - item_color = "lawyer_blue" + worn_state = "lawyer_blue" /obj/item/clothing/under/lawyer/bluesuit name = "Blue Suit" desc = "A classy suit and tie" icon_state = "bluesuit" - item_state = "bluesuit" - item_color = "bluesuit" + item_state = "ba_suit" + worn_state = "bluesuit" /obj/item/clothing/under/lawyer/purpsuit name = "Purple Suit" icon_state = "lawyer_purp" - item_state = "lawyer_purp" - item_color = "lawyer_purp" + item_state = "ba_suit" + worn_state = "lawyer_purp" /obj/item/clothing/under/lawyer/oldman name = "Old Man's Suit" desc = "A classic suit for the older gentleman with built in back support." icon_state = "oldman" - item_state = "oldman" - item_color = "oldman" + item_state = "johnny" + worn_state = "oldman" /obj/item/clothing/under/librarian name = "sensible suit" desc = "It's very... sensible." icon_state = "red_suit" - item_state = "red_suit" - item_color = "red_suit" + item_state = "lawyer_red" + worn_state = "red_suit" /obj/item/clothing/under/mime name = "mime's outfit" desc = "It's not very colourful." icon_state = "mime" - item_state = "mime" - item_color = "mime" + item_state = "ba_suit" + worn_state = "mime" /obj/item/clothing/under/rank/miner desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." name = "shaft miner's jumpsuit" icon_state = "miner" - item_state = "miner" - item_color = "miner" + item_state = "lb_suit" + worn_state = "miner" diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 0b8cebe57a..8be9807e1f 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -4,7 +4,7 @@ name = "chief engineer's jumpsuit" icon_state = "chiefengineer" item_state = "g_suit" - item_color = "chief" + worn_state = "chief" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) /obj/item/clothing/under/rank/atmospheric_technician @@ -12,19 +12,19 @@ name = "atmospheric technician's jumpsuit" icon_state = "atmos" item_state = "atmos_suit" - item_color = "atmos" + worn_state = "atmos" /obj/item/clothing/under/rank/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." name = "engineer's jumpsuit" icon_state = "engine" item_state = "engi_suit" - item_color = "engine" + worn_state = "engine" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) /obj/item/clothing/under/rank/roboticist desc = "It's a slimming black with reinforced seams; great for industrial work." name = "roboticist's jumpsuit" icon_state = "robotics" - item_state = "robotics" - item_color = "robotics" \ No newline at end of file + item_state = "bl_suit" + worn_state = "robotics" \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index b1554dd02a..10e6b05518 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -5,23 +5,24 @@ desc = "It's a jumpsuit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." name = "research director's jumpsuit" icon_state = "director" - item_state = "g_suit" - item_color = "director" + item_state = "lb_suit" + worn_state = "director" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) /obj/item/clothing/under/rank/research_director/rdalt desc = "A dress suit and slacks stained with hard work and dedication to science. Perhaps other things as well, but mostly hard work and dedication." name = "head researcher uniform" icon_state = "rdalt" - item_state = "rdalt" - item_color = "rdalt" + item_state = "lb_suit" + worn_state = "rdalt" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) /obj/item/clothing/under/rank/research_director/dress_rd name = "research director dress uniform" desc = "Feminine fashion for the style concious RD. Its fabric provides minor protection from biological contaminants." icon_state = "dress_rd" - item_color = "dress_rd" + item_state = "lb_suit" + worn_state = "dress_rd" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -30,7 +31,7 @@ name = "scientist's jumpsuit" icon_state = "science" item_state = "w_suit" - item_color = "sciencewhite" + worn_state = "sciencewhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) @@ -40,7 +41,7 @@ name = "chemist's jumpsuit" icon_state = "chemistry" item_state = "w_suit" - item_color = "chemistrywhite" + worn_state = "chemistrywhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -52,7 +53,7 @@ name = "chief medical officer's jumpsuit" icon_state = "cmo" item_state = "w_suit" - item_color = "cmo" + worn_state = "cmo" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -61,7 +62,7 @@ name = "geneticist's jumpsuit" icon_state = "genetics" item_state = "w_suit" - item_color = "geneticswhite" + worn_state = "geneticswhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -70,7 +71,7 @@ name = "virologist's jumpsuit" icon_state = "virology" item_state = "w_suit" - item_color = "virologywhite" + worn_state = "virologywhite" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -79,7 +80,7 @@ name = "nurse's suit" icon_state = "nursesuit" item_state = "nursesuit" - item_color = "nursesuit" + worn_state = "nursesuit" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) body_parts_covered = UPPER_TORSO|LOWER_TORSO @@ -88,18 +89,18 @@ desc = "A dress commonly worn by the nursing staff in the medical department." name = "nurse's dress" icon_state = "nurse" - item_state = "nurse" - item_color = "nurse" + item_state = "nursesuit" + worn_state = "nurse" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/rank/orderly - desc = "A white suit to be worn by orderly people who love orderly things." + desc = "A white suit to be worn by medical attendants." name = "orderly's uniform" icon_state = "orderly" - item_state = "orderly" - item_color = "orderly" + item_state = "nursesuit" + worn_state = "orderly" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -108,7 +109,7 @@ name = "medical doctor's jumpsuit" icon_state = "medical" item_state = "w_suit" - item_color = "medical" + worn_state = "medical" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -116,39 +117,43 @@ name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." icon_state = "scrubsblue" - item_color = "scrubsblue" + item_state = "b_suit" + worn_state = "scrubsblue" /obj/item/clothing/under/rank/medical/green name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." icon_state = "scrubsgreen" - item_color = "scrubsgreen" + item_state = "g_suit" + worn_state = "scrubsgreen" /obj/item/clothing/under/rank/medical/purple name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." icon_state = "scrubspurple" - item_color = "scrubspurple" + item_state = "p_suit" + worn_state = "scrubspurple" /obj/item/clothing/under/rank/medical/black name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in black." icon_state = "scrubsblack" - item_color = "scrubsblack" + item_state = "bl_suit" + worn_state = "scrubsblack" /obj/item/clothing/under/rank/psych desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist." name = "psychiatrist's jumpsuit" icon_state = "psych" item_state = "w_suit" - item_color = "psych" + worn_state = "psych" /obj/item/clothing/under/rank/psych/turtleneck desc = "A turqouise turtleneck and a pair of dark blue slacks, belonging to a psychologist." name = "psychologist's turtleneck" icon_state = "psychturtle" item_state = "b_suit" - item_color = "psychturtle" + worn_state = "psychturtle" /* @@ -159,7 +164,7 @@ name = "geneticist's jumpsuit" icon_state = "genetics_new" item_state = "w_suit" - item_color = "genetics_new" + worn_state = "genetics_new" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -168,7 +173,7 @@ name = "chemist's jumpsuit" icon_state = "chemist_new" item_state = "w_suit" - item_color = "chemist_new" + worn_state = "chemist_new" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) @@ -177,7 +182,7 @@ name = "scientist's jumpsuit" icon_state = "scientist_new" item_state = "w_suit" - item_color = "scientist_new" + worn_state = "scientist_new" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) @@ -186,6 +191,6 @@ name = "virologist's jumpsuit" icon_state = "virologist_new" item_state = "w_suit" - item_color = "virologist_new" + worn_state = "virologist_new" permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 51464410a8..003e8ba048 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -13,7 +13,7 @@ name = "warden's jumpsuit" icon_state = "warden" item_state = "r_suit" - item_color = "warden" + worn_state = "warden" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 @@ -22,7 +22,7 @@ desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." icon_state = "security" item_state = "r_suit" - item_color = "secred" + worn_state = "secred" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 @@ -30,8 +30,8 @@ name = "dispatcher's uniform" desc = "A dress shirt and khakis with a security patch sewn on." icon_state = "dispatch" - item_state = "dispatch" - item_color = "dispatch" + //item_state = "dispatch" + worn_state = "dispatch" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS siemens_coefficient = 0.9 @@ -41,26 +41,26 @@ desc = "It's made of a slightly sturdier material, to allow for robust protection." icon_state = "redshirt2" item_state = "r_suit" - item_color = "redshirt2" + worn_state = "redshirt2" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 /obj/item/clothing/under/rank/security/corp icon_state = "sec_corporate" - item_state = "sec_corporate" - item_color = "sec_corporate" + //item_state = "sec_corporate" + worn_state = "sec_corporate" /obj/item/clothing/under/rank/warden/corp icon_state = "warden_corporate" - item_state = "warden_corporate" - item_color = "warden_corporate" + //item_state = "warden_corporate" + worn_state = "warden_corporate" /obj/item/clothing/under/tactical name = "tactical jumpsuit" desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." icon_state = "swatunder" - item_state = "swatunder" - item_color = "swatunder" + //item_state = "swatunder" + worn_state = "swatunder" armor = list(melee = 10, bullet = 5, laser = 5,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 @@ -72,23 +72,24 @@ desc = "Someone who wears this means business." icon_state = "detective" item_state = "det" - item_color = "detective" + worn_state = "detective" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 /obj/item/clothing/under/det/black icon_state = "detective2" - item_color = "detective2" + worn_state = "detective2" + item_state = "sl_suit" /obj/item/clothing/under/det/slob icon_state = "polsuit" - item_color = "polsuit" + worn_state = "polsuit" /obj/item/clothing/under/det/slob/verb/rollup() set name = "Roll suit sleeves" set category = "Object" set src in usr - item_color = item_color == "polsuit" ? "polsuit_rolled" : "polsuit" + worn_state = worn_state == "polsuit" ? "polsuit_rolled" : "polsuit" if (ishuman(loc)) var/mob/living/carbon/human/H = loc H.update_inv_w_uniform(1) @@ -114,14 +115,14 @@ name = "head of security's jumpsuit" icon_state = "hos" item_state = "r_suit" - item_color = "hosred" + worn_state = "hosred" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.8 /obj/item/clothing/under/rank/head_of_security/corp icon_state = "hos_corporate" - item_state = "hos_corporate" - item_color = "hos_corporate" + //item_state = "hos_corporate" + worn_state = "hos_corporate" /obj/item/clothing/head/helmet/HoS name = "Head of Security Hat" @@ -157,7 +158,7 @@ name = "head of security's jumpsuit" icon_state = "jensen" item_state = "jensen" - item_color = "jensen" + worn_state = "jensen" siemens_coefficient = 0.6 /obj/item/clothing/suit/armor/hos/jensen @@ -177,19 +178,19 @@ name = "security officer's uniform" desc = "The latest in fashionable security outfits." icon_state = "officerblueclothes" - item_state = "officerblueclothes" - item_color = "officerblueclothes" + item_state = "ba_suit" + worn_state = "officerblueclothes" /obj/item/clothing/under/rank/head_of_security/navyblue desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security." name = "head of security's uniform" icon_state = "hosblueclothes" - item_state = "hosblueclothes" - item_color = "hosblueclothes" + item_state = "ba_suit" + worn_state = "hosblueclothes" /obj/item/clothing/under/rank/warden/navyblue desc = "The insignia on this uniform tells you that this uniform belongs to the Warden." name = "warden's uniform" icon_state = "wardenblueclothes" - item_state = "wardenblueclothes" - item_color = "wardenblueclothes" + item_state = "ba_suit" + worn_state = "wardenblueclothes" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 09a187018c..351f95664c 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -2,56 +2,57 @@ name = "red pj's" desc = "Sleepwear." icon_state = "red_pyjamas" - item_color = "red_pyjamas" + worn_state = "red_pyjamas" item_state = "w_suit" /obj/item/clothing/under/pj/blue name = "blue pj's" desc = "Sleepwear." icon_state = "blue_pyjamas" - item_color = "blue_pyjamas" + worn_state = "blue_pyjamas" item_state = "w_suit" /obj/item/clothing/under/captain_fly name = "rogue's uniform" desc = "For the man who doesn't care because he's still free." icon_state = "captain_fly" - item_state = "captain_fly" - item_color = "captain_fly" + item_state = "r_suit" + worn_state = "captain_fly" /obj/item/clothing/under/scratch name = "white suit" desc = "A white suit, suitable for an excellent host" icon_state = "scratch" item_state = "scratch" - item_color = "scratch" + worn_state = "scratch" /obj/item/clothing/under/sl_suit desc = "It's a very amish looking suit." name = "amish suit" icon_state = "sl_suit" - item_color = "sl_suit" + worn_state = "sl_suit" + item_state = "sl_suit" /obj/item/clothing/under/waiter name = "waiter's outfit" desc = "It's a very smart uniform with a special pocket for tip." icon_state = "waiter" item_state = "waiter" - item_color = "waiter" + worn_state = "waiter" /obj/item/clothing/under/rank/mailman name = "mailman's jumpsuit" desc = "'Special delivery!'" icon_state = "mailman" item_state = "b_suit" - item_color = "mailman" + worn_state = "mailman" /obj/item/clothing/under/sexyclown name = "sexy-clown suit" desc = "It makes you look HONKable!" icon_state = "sexyclown" - item_state = "sexyclown" - item_color = "sexyclown" + item_state = "clown" + worn_state = "sexyclown" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/rank/vice @@ -59,31 +60,31 @@ desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision." icon_state = "vice" item_state = "gy_suit" - item_color = "vice" - + worn_state = "vice" +//This set of uniforms looks fairly fancy and is generally used for high-ranking NT personnel from what I've seen, so lets give them appropriate ranks. /obj/item/clothing/under/rank/centcom - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign.\"" - name = "\improper NanoTrasen Navy Uniform" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain.\"" + name = "\improper NanoTrasen Officer's Dress Uniform" icon_state = "officer" - item_state = "g_suit" - item_color = "officer" + item_state = "lawyer_black" + worn_state = "officer" displays_id = 0 /obj/item/clothing/under/rank/centcom_officer - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant Commander.\"" - name = "\improper NanoTrasen Officers Uniform" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral.\"" + name = "\improper NanoTrasen Officer's Dress Uniform" icon_state = "officer" - item_state = "g_suit" - item_color = "officer" + item_state = "lawyer_black" + worn_state = "officer" displays_id = 0 /obj/item/clothing/under/rank/centcom_captain - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain.\"" - name = "\improper NanoTrasen Captains Uniform" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral-Executive.\"" + name = "\improper NanoTrasen Officer's Dress Uniform" icon_state = "centcom" - item_state = "dg_suit" - item_color = "centcom" + item_state = "lawyer_black" + worn_state = "centcom" displays_id = 0 /obj/item/clothing/under/ert @@ -91,14 +92,14 @@ desc = "A short-sleeved black uniform, paired with grey digital-camo cargo pants. It looks very tactical." icon_state = "ert_uniform" item_state = "bl_suit" - item_color = "ert_uniform" + worn_state = "ert_uniform" /obj/item/clothing/under/space name = "\improper NASA jumpsuit" desc = "It has a NASA logo on it and is made of space-proofed materials." icon_state = "black" item_state = "bl_suit" - item_color = "black" + worn_state = "black" w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 @@ -110,7 +111,7 @@ name = "administrative cybernetic jumpsuit" icon_state = "syndicate" item_state = "bl_suit" - item_color = "syndicate" + worn_state = "syndicate" desc = "it's a cybernetically enhanced jumpsuit used for administrative duties." gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 @@ -124,97 +125,100 @@ name = "owl uniform" desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!" icon_state = "owl" - item_color = "owl" + worn_state = "owl" + item_state = "owl" /obj/item/clothing/under/johnny name = "johnny~~ jumpsuit" desc = "Johnny~~" icon_state = "johnny" - item_color = "johnny" + worn_state = "johnny" + item_state = "johnny" /obj/item/clothing/under/rainbow name = "rainbow" desc = "rainbow" icon_state = "rainbow" item_state = "rainbow" - item_color = "rainbow" + worn_state = "rainbow" /obj/item/clothing/under/cloud name = "cloud" desc = "cloud" icon_state = "cloud" - item_color = "cloud" + worn_state = "cloud" /obj/item/clothing/under/psysuit name = "dark undersuit" desc = "A thick, layered grey undersuit lined with power cables. Feels a little like wearing an electrical storm." icon_state = "psysuit" - item_state = "psysuit" - item_color = "psysuit" + item_state = "bl_suit" + worn_state = "psysuit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS /obj/item/clothing/under/gentlesuit name = "gentlemans suit" desc = "A silk black shirt with a white tie and a matching gray vest and slacks. Feels proper." icon_state = "gentlesuit" - item_state = "gentlesuit" - item_color = "gentlesuit" + item_state = "gy_suit" + worn_state = "gentlesuit" /obj/item/clothing/under/gimmick/rank/captain/suit name = "captain's suit" desc = "A green suit and yellow necktie. Exemplifies authority." icon_state = "green_suit" item_state = "dg_suit" - item_color = "green_suit" + worn_state = "green_suit" /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit name = "head of personnel's suit" desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." icon_state = "teal_suit" item_state = "g_suit" - item_color = "teal_suit" + worn_state = "teal_suit" /obj/item/clothing/under/suit_jacket name = "black suit" desc = "A black suit and red tie. Very formal." icon_state = "black_suit" item_state = "bl_suit" - item_color = "black_suit" + worn_state = "black_suit" /obj/item/clothing/under/suit_jacket/really_black name = "executive suit" desc = "A formal black suit and red tie, intended for the station's finest." icon_state = "really_black_suit" - item_state = "bl_suit" - item_color = "black_suit" + item_state = "jensensuit" + worn_state = "black_suit" /obj/item/clothing/under/suit_jacket/female name = "executive suit" desc = "A formal trouser suit for women, intended for the station's finest." icon_state = "black_suit_fem" - item_state = "black_suit_fem" - item_color = "black_suit_fem" + item_state = "lawyer_black" + worn_state = "black_suit_fem" /obj/item/clothing/under/suit_jacket/red name = "red suit" desc = "A red suit and blue tie. Somewhat formal." icon_state = "red_suit" item_state = "r_suit" - item_color = "red_suit" + worn_state = "red_suit" /obj/item/clothing/under/blackskirt name = "black skirt" desc = "A black skirt, very fancy!" icon_state = "blackskirt" - item_color = "blackskirt" + item_state = "bl_suit" + worn_state = "blackskirt" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/under/schoolgirl name = "schoolgirl uniform" desc = "It's just like one of my Japanese animes!" icon_state = "schoolgirl" - item_state = "schoolgirl" - item_color = "schoolgirl" + item_state = "b_suit" + worn_state = "schoolgirl" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/overalls @@ -222,133 +226,144 @@ desc = "A set of durable overalls for getting the job done." icon_state = "overalls" item_state = "lb_suit" - item_color = "overalls" + worn_state = "overalls" /obj/item/clothing/under/pirate name = "pirate outfit" desc = "Yarr." icon_state = "pirate" - item_state = "pirate" - item_color = "pirate" + item_state = "sl_suit" + worn_state = "pirate" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS /obj/item/clothing/under/soviet name = "soviet uniform" desc = "For the Motherland!" icon_state = "soviet" - item_state = "soviet" - item_color = "soviet" + item_state = "gy_suit" + worn_state = "soviet" /obj/item/clothing/under/redcoat name = "redcoat uniform" desc = "Looks old." icon_state = "redcoat" - item_state = "redcoat" - item_color = "redcoat" + item_state = "r_suit" + worn_state = "redcoat" /obj/item/clothing/under/kilt name = "kilt" desc = "Includes shoes and plaid" icon_state = "kilt" item_state = "kilt" - item_color = "kilt" + worn_state = "kilt" body_parts_covered = UPPER_TORSO|LOWER_TORSO|FEET /obj/item/clothing/under/sexymime name = "sexy mime outfit" desc = "The only time when you DON'T enjoy looking at someone's rack." icon_state = "sexymime" - item_state = "sexymime" - item_color = "sexymime" + item_state = "w_suit" + worn_state = "sexymime" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/gladiator name = "gladiator uniform" desc = "Are you not entertained? Is that not why you are here?" icon_state = "gladiator" - item_state = "gladiator" - item_color = "gladiator" + item_state = "o_suit" + worn_state = "gladiator" body_parts_covered = LOWER_TORSO //dress -/obj/item/clothing/under/dress/ +/obj/item/clothing/under/dress body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/dress/dress_fire name = "flame dress" desc = "A small black dress with blue flames print on it." icon_state = "dress_fire" - item_color = "dress_fire" + item_state = "bl_suit" + worn_state = "dress_fire" /obj/item/clothing/under/dress/dress_green name = "green dress" desc = "A simple, tight fitting green dress." icon_state = "dress_green" - item_color = "dress_green" + item_state = "g_suit" + worn_state = "dress_green" /obj/item/clothing/under/dress/dress_orange name = "orange dress" desc = "A fancy orange gown for those who like to show leg." icon_state = "dress_orange" - item_color = "dress_orange" + item_state = "y_suit" + worn_state = "dress_orange" /obj/item/clothing/under/dress/dress_pink name = "pink dress" desc = "A simple, tight fitting pink dress." icon_state = "dress_pink" - item_color = "dress_pink" + item_state = "p_suit" + worn_state = "dress_pink" /obj/item/clothing/under/dress/dress_yellow name = "yellow dress" desc = "A flirty, little yellow dress." icon_state = "dress_yellow" - item_color = "dress_yellow" + item_state = "y_suit" + worn_state = "dress_yellow" /obj/item/clothing/under/dress/dress_saloon name = "saloon girl dress" desc = "A old western inspired gown for the girl who likes to drink." icon_state = "dress_saloon" - item_color = "dress_saloon" + item_state = "p_suit" + worn_state = "dress_saloon" /obj/item/clothing/under/dress/dress_cap name = "captain's dress uniform" desc = "Feminine fashion for the style concious captain." icon_state = "dress_cap" - item_color = "dress_cap" + item_state = "b_suit" + worn_state = "dress_cap" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/under/dress/dress_hop name = "head of personnel dress uniform" desc = "Feminine fashion for the style concious HoP." icon_state = "dress_hop" - item_color = "dress_hop" + item_state = "b_suit" + worn_state = "dress_hop" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/under/dress/dress_hr name = "human resources director uniform" desc = "Superior class for the nosy H.R. Director." icon_state = "huresource" - item_color = "huresource" + item_state = "y_suit" + worn_state = "huresource" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/under/dress/plaid_blue name = "blue plaid skirt" desc = "A preppy blue skirt with a white blouse." icon_state = "plaid_blue" - item_color = "plaid_blue" + worn_state = "plaid_blue" /obj/item/clothing/under/dress/plaid_red name = "red plaid skirt" desc = "A preppy red skirt with a white blouse." icon_state = "plaid_red" - item_color = "plaid_red" + item_state = "kilt" + worn_state = "plaid_red" /obj/item/clothing/under/dress/plaid_purple name = "blue purple skirt" desc = "A preppy purple skirt with a white blouse." icon_state = "plaid_purple" - item_color = "plaid_purple" + item_state = "kilt" + worn_state = "plaid_purple" //wedding stuff /obj/item/clothing/under/wedding/ @@ -358,35 +373,40 @@ name = "orange wedding dress" desc = "A big and puffy orange dress." icon_state = "bride_orange" - item_color = "bride_orange" + item_state = "y_suit" + worn_state = "bride_orange" flags_inv = HIDESHOES /obj/item/clothing/under/wedding/bride_purple name = "purple wedding dress" desc = "A big and puffy purple dress." icon_state = "bride_purple" - item_color = "bride_purple" + item_state = "p_suit" + worn_state = "bride_purple" flags_inv = HIDESHOES /obj/item/clothing/under/wedding/bride_blue name = "blue wedding dress" desc = "A big and puffy blue dress." icon_state = "bride_blue" - item_color = "bride_blue" + item_state = "b_suit" + worn_state = "bride_blue" flags_inv = HIDESHOES /obj/item/clothing/under/wedding/bride_red name = "red wedding dress" desc = "A big and puffy red dress." icon_state = "bride_red" - item_color = "bride_red" + item_state = "r_suit" + worn_state = "bride_red" flags_inv = HIDESHOES /obj/item/clothing/under/wedding/bride_white name = "silky wedding dress" desc = "A white wedding gown made from the finest silk." icon_state = "bride_white" - item_color = "bride_white" + item_state = "nursesuit" + worn_state = "bride_white" flags_inv = HIDESHOES body_parts_covered = UPPER_TORSO|LOWER_TORSO @@ -394,8 +414,8 @@ name = "sundress" desc = "Makes you want to frolic in a field of daisies." icon_state = "sundress" - item_state = "sundress" - item_color = "sundress" + item_state = "bl_suit" + worn_state = "sundress" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/sundress_white @@ -403,92 +423,92 @@ desc = "A white sundress decorated with purple lilies." icon_state = "sundress_white" item_state = "sundress_white" - item_color = "sundress_white" + worn_state = "sundress_white" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/blackjumpskirt name = "black jumpskirt" desc = "A black jumpskirt, Sol size 0." icon_state = "blackjumpskirt" - item_state = "blackjumpskirt" - item_color = "blackjumpskirt" + item_state = "bl_suit" + worn_state = "blackjumpskirt" /obj/item/clothing/under/captainformal name = "captain's formal uniform" desc = "A captain's formal-wear, for special occasions." icon_state = "captain_formal" - item_state = "by_suit" - item_color = "captain_formal" + item_state = "b_suit" + worn_state = "captain_formal" /obj/item/clothing/under/hosformalmale name = "head of security's formal uniform" desc = "A male head of security's formal-wear, for special occasions." icon_state = "hos_formal_male" item_state = "r_suit" - item_color = "hos_formal_male" + worn_state = "hos_formal_male" /obj/item/clothing/under/hosformalfem name = "head of security's formal uniform" desc = "A female head of security's formal-wear, for special occasions." icon_state = "hos_formal_fem" item_state = "r_suit" - item_color = "hos_formal_fem" + worn_state = "hos_formal_fem" /obj/item/clothing/under/assistantformal name = "assistant's formal uniform" desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown." icon_state = "assistant_formal" item_state = "gy_suit" - item_color = "assistant_formal" + worn_state = "assistant_formal" /obj/item/clothing/under/suit_jacket/charcoal name = "charcoal suit" desc = "A charcoal suit and red tie. Very professional." icon_state = "charcoal_suit" - item_state = "charcoal_suit" - item_color = "charcoal_suit" + item_state = "bl_suit" + worn_state = "charcoal_suit" /obj/item/clothing/under/suit_jacket/navy name = "navy suit" desc = "A navy suit and red tie, intended for the station's finest." icon_state = "navy_suit" - item_state = "navy_suit" - item_color = "navy_suit" + item_state = "bl_suit" + worn_state = "navy_suit" /obj/item/clothing/under/suit_jacket/burgundy name = "burgundy suit" desc = "A burgundy suit and black tie. Somewhat formal." icon_state = "burgundy_suit" - item_state = "burgundy_suit" - item_color = "burgundy_suit" + item_state = "r_suit" + worn_state = "burgundy_suit" /obj/item/clothing/under/suit_jacket/checkered name = "checkered suit" desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" icon_state = "checkered_suit" - item_state = "checkered_suit" - item_color = "checkered_suit" + item_state = "gy_suit" + worn_state = "checkered_suit" /obj/item/clothing/under/suit_jacket/tan name = "tan suit" desc = "A tan suit with a yellow tie. Smart, but casual." icon_state = "tan_suit" - item_state = "tan_suit" - item_color = "tan_suit" + item_state = "lb_suit" + worn_state = "tan_suit" /obj/item/clothing/under/serviceoveralls name = "workman outfit" desc = "The very image of a working man. Not that you're probably doing work." icon_state = "mechanic" - item_state = "mechanic" - item_color = "mechanic" + item_state = "lb_suit" + worn_state = "mechanic" /obj/item/clothing/under/cheongsam name = "white cheongsam" desc = "It is a white cheongsam dress." icon_state = "mai_yang" item_state = "mai_yang" - item_color = "mai_yang" + worn_state = "mai_yang" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS /obj/item/clothing/under/blazer @@ -496,4 +516,4 @@ desc = "A bold but yet conservative outfit, red corduroys, navy blazer and a tie." icon_state = "blue_blazer" item_state = "blue_blazer" - item_color = "blue_blazer" + worn_state = "blue_blazer" diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 494cb5e72a..aa90f073dc 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -7,24 +7,24 @@ /obj/item/clothing/under/shorts/red name = "red athletic shorts" icon_state = "redshorts" - item_color = "redshorts" + worn_state = "redshorts" /obj/item/clothing/under/shorts/green name = "green athletic shorts" icon_state = "greenshorts" - item_color = "greenshorts" + worn_state = "greenshorts" /obj/item/clothing/under/shorts/blue name = "blue athletic shorts" icon_state = "blueshorts" - item_color = "blueshorts" + worn_state = "blueshorts" /obj/item/clothing/under/shorts/black name = "black athletic shorts" icon_state = "blackshorts" - item_color = "blackshorts" + worn_state = "blackshorts" /obj/item/clothing/under/shorts/grey name = "grey athletic shorts" icon_state = "greyshorts" - item_color = "greyshorts" + worn_state = "greyshorts" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 80f09004f0..f4111e1bbb 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -3,7 +3,7 @@ desc = "It's some non-descript, slightly suspicious looking, civilian clothing." icon_state = "syndicate" item_state = "bl_suit" - item_color = "syndicate" + worn_state = "syndicate" has_sensor = 0 armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 @@ -16,7 +16,7 @@ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool" item_state = "bl_suit" - item_color = "tactifool" + worn_state = "tactifool" siemens_coefficient = 1 diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 13d1a59d5e..f1237cb721 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -119,7 +119,6 @@ desc = "A medical apparatus intended to ease in listening to the sounds of the human body. This one looks cleaner and sparklier than the rest. There is a small silver plaque attached to the tubing, with the words 'Lucy Kemmerer' engraved on it." icon_state = "lucystethos" item_state = "lucystethos" - item_color ="lucystethos" icon = 'icons/obj/custom_items.dmi' /obj/item/weapon/pen/fluff/multi //spaceman96: Trenna Seber @@ -167,7 +166,6 @@ desc = "A faded badge, backed with leather, that reads 'NT Security Force' across the front. It bears the emblem of the Forensic division." icon_state = "ana_badge" item_state = "ana_badge" - item_color = "ana_badge" /obj/item/fluff/ana_issek_2/attack_self(mob/user as mob) if(isliving(user)) @@ -530,7 +528,7 @@ var/new_suit_desc // Sets suit desc. var/helmet_icon // Sets helmet icon_state and item_state. var/suit_icon // Sets suit icon_state and item_state. - var/helmet_color // Sets item_color. + var/helmet_color // Sets worn_state. var/uses = 2 // Uses before the kit deletes itself. var/new_light_overlay @@ -544,7 +542,6 @@ desc = kit.new_helmet_desc icon_state = kit.helmet_icon item_state = kit.helmet_icon - item_color = kit.helmet_color if(kit.new_light_overlay) light_overlay = kit.new_light_overlay @@ -555,7 +552,7 @@ kit.uses-- if(kit.uses<1) user.drop_item() - del(O) + qdel(O) /obj/item/clothing/suit/space/void/attackby(var/obj/item/O as obj, mob/user as mob) ..() @@ -574,7 +571,7 @@ kit.uses-- if(kit.uses<1) user.drop_item() - del(O) + qdel(O) ///////// Salvage crew hardsuit - Cybele Petit - solaruin /////////////// /obj/item/device/kit/suit/fluff/salvage @@ -652,9 +649,8 @@ desc = "Reinforced sterile gloves custom tailored to comfortably accommodate Tajaran claws." icon_state = "latex" item_state = "lgloves" - siemens_coefficient = 0.30 + siemens_coefficient = 1.00 permeability_coefficient = 0.01 - item_color="white" species_restricted = list("exclude","Unathi") /obj/item/clothing/gloves/fluff/walter_brooks_1 //botanistpower: Walter Brooks @@ -663,7 +659,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "walter_brooks_1" item_state = "bluegloves" - item_color="blue" /obj/item/clothing/gloves/fluff/chal_appara_1 //furlucis: Chal Appara name = "Left Black Glove" @@ -886,7 +881,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "leatherjack" item_state = "leatherjack" - item_color = "leatherjack" /obj/item/clothing/suit/armor/vest/fluff/deus_blueshield //deusdactyl name = "blue shield security armor" @@ -947,33 +941,40 @@ desc = "A uniform jacket, its buttons polished to a shine, coupled with a dark pair of trousers. 'Hachert' is embroidered upon the jacket�s shoulder bar." icon = 'icons/obj/custom_items.dmi' icon_state = "milohachert" - item_state = "milohachert" - item_color = "milohachert" + item_state = "gy_suit" + worn_state = "milohachert" +/obj/item/clothing/under/fluff/john_saaland //GA Jumpsuit-John Saaland-Foxeye + name = "GA jumpsuit" + desc = "A tan jumpsuit, robustly constructed, with various velcro strips for name and ranking patches distributed over the torso and shoulders. Only one of these strips is in use, holding a patch with 'J. SAALAND' written on it in block lettering over the right breast pocket." + icon = 'icons/obj/custom_items.dmi' + icon_state = "saaland" + item_state = "saaland_suit" + worn_state = "saaland" /obj/item/clothing/under/fluff/kaine_kalim_2 name = "Formal Medical Uniform" desc = "An unusually sterile and pressed uniform. It seems to have a string of vials crossing the chest." icon = 'icons/obj/custom_items.dmi' icon_state = "kaineuniform" - item_state = "kaineuniform" - item_color = "kaineuniform" + item_state = "w_suit" + worn_state = "kaineuniform" /obj/item/clothing/under/fluff/jumpsuitdown //searif: Yuki Matsuda name = "rolled down jumpsuit" desc = "A rolled down jumpsuit. Great for mechanics." icon = 'icons/obj/custom_items.dmi' icon_state = "jumpsuitdown" - item_state = "jumpsuitdown" - item_color = "jumpsuitdown" + item_state = "gy_suit" + worn_state = "jumpsuitdown" /obj/item/clothing/under/fluff/lilith_vinous_1 //slyhidden: Lilith Vinous name = "casual security uniform" desc = "A less formal version of the traditional dark red Security uniform. It has the top button undone, rolled up sleeves and different belt." icon = 'icons/obj/custom_items.dmi' icon_state = "lilith_uniform" - item_state = "lilith_uniform" - item_color = "lilith_uniform" + item_state = "r_suit" + worn_state = "lilith_uniform" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS /obj/item/clothing/under/fluff/ana_issek_1 //suethecake: Ana Issek @@ -981,8 +982,8 @@ desc = "A silken blouse paired with dark-colored slacks. It has the words 'Chief Investigator' embroidered into the shoulder bar." icon = 'icons/obj/custom_items.dmi' icon_state = "ana_uniform" - item_state = "ana_uniform" - item_color = "ana_uniform" + item_state = "r_suit" + worn_state = "ana_uniform" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS /obj/item/clothing/under/fluff/olddressuniform //desiderium: Momiji Inubashiri @@ -990,15 +991,16 @@ desc = "A retired Station Head of Staff uniform, phased out twenty years ago for the newer jumpsuit design, but still acceptable dress. Lovingly maintained." icon = 'icons/obj/custom_items.dmi' icon_state = "olddressuniform" - item_state = "olddressuniform" - item_color = "olddressuniform" + item_state = "b_suit" + worn_state = "olddressuniform" /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1 //whitewolf41: Jeremy Wolf name = "worn officer's uniform" desc = "An old red security jumpsuit. Seems to have some slight modifications." icon = 'icons/obj/custom_items.dmi' icon_state = "jeremy_wolf_1" - item_color = "jeremy_wolf_1" + item_state = "r_suit" + worn_state = "jeremy_wolf_1" //////////////////// PRC Uniform - Ronan Harper - Raptor1628 /////////////////// @@ -1008,7 +1010,7 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "harper_uniform" item_state = "jensensuit" - item_color = "harper_uniform" + worn_state = "harper_uniform" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS //////////////////// Corporate Cap - Robert Mason - Masterrbc //////////////////// @@ -1022,8 +1024,8 @@ desc = "A nicely tailored purple dress made for the taller woman." icon = 'icons/obj/custom_items.dmi' icon_state = "tian_dress" - item_state = "tian_dress" - item_color = "tian_dress" + item_state = "r_suit" + worn_state = "tian_dress" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/rank/bartender/fluff/classy //searif: Ara Al-Jazari @@ -1031,32 +1033,32 @@ desc = "A prim and proper uniform that looks very similar to a bartender's, the only differences being a red tie, waistcoat and a rag hanging out of the back pocket." icon = 'icons/obj/custom_items.dmi' icon_state = "ara_bar_uniform" - item_state = "ara_bar_uniform" - item_color = "ara_bar_uniform" + item_state = "ba_suit" + worn_state = "ara_bar_uniform" /obj/item/clothing/under/fluff/callum_suit //roaper: Callum Leamus name = "knockoff suit" desc = "A knockoff of a suit commonly worn by the upper class." icon = 'icons/obj/custom_items.dmi' icon_state = "callum_suit" - item_state = "callum_suit" - item_color = "callum_suit" + item_state = "ba_suit" + worn_state = "callum_suit" /obj/item/clothing/under/fluff/solara_light_1 //bluefishie: Solara Born-In-Light name = "Elaborate Purple Dress" desc = "An expertly tailored dress, made out of fine fabrics. The interwoven necklace appears to be made out of gold, with three complicated symbols engraved in the front." icon = 'icons/obj/custom_items.dmi' icon_state = "solara_dress" - item_state = "solara_dress" - item_color = "solara_dress" + item_state = "p_suit" + worn_state = "solara_dress" /obj/item/clothing/under/rank/nursesuit/fluff/sasha name = "RN Uniform" desc = "A nurse's uniform that is dark blue and gold. It looks like it's been tailored for a short person." icon = 'icons/obj/custom_items.dmi' icon_state = "sasha" - item_state = "sasha" - item_color = "sasha" + item_state = "b_suit" + worn_state = "sasha" /////// NT-SID Suit //Zuhayr: Jane Doe @@ -1066,8 +1068,8 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "jane_sid_suit" - item_state = "jane_sid_suit" - item_color = "jane_sid_suit" + item_state = "o_suit" + worn_state = "jane_sid_suit" has_sensor = 2 sensor_mode = 3 @@ -1081,14 +1083,13 @@ return 0 if(src.icon_state == "jane_sid_suit_down") - src.item_color = "jane_sid_suit" + src.icon_state = "jane_sid_suit" usr << "You zip up the [src]." else - src.item_color = "jane_sid_suit_down" + src.icon_state = "jane_sid_suit_down" usr << "You unzip and roll down the [src]." - src.icon_state = "[item_color]" - src.item_state = "[item_color]" + src.item_state_slots[slot_w_uniform_str] = "[src.icon_state]" update_clothing_icon() ////// Wyatt's Ex-Commander Jumpsuit - RawrTaicho @@ -1098,8 +1099,8 @@ desc = "A standard Central Command Engineering Commander jumpsuit tailored to fight the wearer tightly. It has a Medal of Service pinned onto the left side of it." icon = 'icons/obj/custom_items.dmi' icon_state = "wyatt_uniform" - item_state = "wyatt_uniform" - item_color = "wyatt_uniform" + //item_state = "wyatt_uniform" + worn_state = "wyatt_uniform" ////// Black Dress - Lillian Amsel - PapaDrow /obj/item/clothing/under/fluff/lillian_amsel_1 @@ -1107,8 +1108,8 @@ desc = "A knee-length, dark gray and black dress made of a soft, velvety material." icon = 'icons/obj/custom_items.dmi' icon_state = "lillian_dress" - item_state = "lillian_dress" - item_color = "lillian_dress" + //item_state = "lillian_dress" + worn_state = "lillian_dress" body_parts_covered = UPPER_TORSO|LOWER_TORSO ////// Tailored Security Uniform - Parker Eliza - MrSnapwalk @@ -1118,8 +1119,8 @@ desc = "A red uniform shirt (tailored for easy access to the shoulder joint) and black cargo pants, paired with a set of somewhat bulky white casings for robotic limbs. The arms have a small label on the inner elbow, which reads \"Bishop Corporation Cybernetic Solutions\"." icon = 'icons/obj/custom_items.dmi' icon_state = "parker_eliza" - item_state = "parker_eliza" - item_color = "parker_eliza" + //item_state = "parker_eliza" + worn_state = "parker_eliza" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS ////// Bishop "GOLEM" V2200 Industrial Limb Augments - Parker Eliza - MrSnapwalk @@ -1130,8 +1131,8 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "parker_eliza_arms" item_state = "parker_eliza_arms" - item_color = "parker_eliza_arms" - + body_parts_covered = 0 //technicially it's underneath everything, being part of the body + canremove = 0 ////////////// Accessories ///// @@ -1143,7 +1144,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "radi_pendant" item_state = "radi_pendant" - item_color = "radi_pendant" w_class = 2.0 //////////// Masks //////////// @@ -1183,7 +1183,7 @@ name = "painted mask" desc = "A ghoulish mask with a stylized painting of a flame over the left eye, and a painted tear stream coming from the right eye." icon = 'icons/obj/custom_items.dmi' - item_state = "cicero" + //item_state = "cicero" icon_state = "cicero" body_parts_covered = FACE|EYES @@ -1195,7 +1195,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "altair_locket" item_state = "altair_locket" - item_color = "altair_locket" slot_flags = 0 w_class = 2 slot_flags = SLOT_MASK | SLOT_TIE @@ -1208,7 +1207,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "konaahirano" item_state = "konaahirano" - item_color = "konaahirano" slot_flags = 0 w_class = 2 slot_flags = SLOT_MASK | SLOT_TIE @@ -1309,7 +1307,7 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "medical_short" item_state = "medical_short" - item_color = "medical_short" + worn_state = "medical_short" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS /obj/item/clothing/suit/storage/labcoat/fluff/red @@ -1326,7 +1324,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "retpolcoat" item_state = "retpolcoat" - item_color = "retpolcoat" /obj/item/clothing/head/det_hat/fluff/retpolcap name = "retired colony patrolman's cap" @@ -1339,7 +1336,7 @@ desc = "A meticulously clean police uniform belonging to Precinct 31, Outer Light Colony. The word \"RETIRED\" is engraved tastefully and professionally in the badge below the number, 501." icon = 'icons/obj/custom_items.dmi' icon_state = "retpoluniform" - item_color = "retpoluniform" + worn_state = "retpoluniform" //////////// Weapons //////////// @@ -1385,7 +1382,7 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "sakura_hokkaido_kimono" item_state = "sakura_hokkaido_kimono" - item_color = "sakura_hokkaido_kimono" + worn_state = "sakura_hokkaido_kimono" ///////////////////////////// Astronovus - Harold's Cane //////////////////////////// @@ -1453,3 +1450,23 @@ friend = M break ..() + +///////////////////////////// Sabess - Maria's Heart-Shaped Locket /////////////////////////////////// + +/obj/item/weapon/fluff/mariafontaine + name = "Heart-Shaped Locket" + desc = " A silver, heart-shaped locket. It flips open to reveal two pictures, one of a young red-headed woman and one of a brunette of similar age. Small writing is etched onto the back, reading 'M+L'. Some may regard it as cheesy." + icon = 'icons/obj/custom_items.dmi' + icon_state = "mariaclosed" + item_state = "mariaclosed" + +obj/item/weapon/fluff/mariafontaine/attack_self(mob/user as mob) + if(src.icon_state == "mariaclosed") + src.icon_state = "mariaopen" + src.item_state = "mariaopen" + user << "You flip the locket open." + + else + src.icon_state = "mariaclosed" + src.item_state = "mariaclosed" + user << "You flip the locket closed." diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index 8d575538a4..beb8e6b2a7 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -35,7 +35,7 @@ if(M.ckey == "nerezza" && M.real_name == "Asher Spock" && M.mind.role_alt_title && M.mind.role_alt_title != "Emergency Physician") //only spawn ID if asher is joining as an emergency physician ok = 1 - del(Item) + qdel(Item) goto skip var/obj/item/weapon/card/id/I = Item for(var/obj/item/weapon/card/id/C in M) @@ -59,18 +59,18 @@ I.name = "[M.real_name]'s Technician ID ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])" //replace old ID - del(C) + qdel(C) ok = M.equip_to_slot_if_possible(I, slot_wear_id, 0) //if 1, last argument deletes on fail break else if(istype(Item,/obj/item/weapon/storage/belt)) if(M.ckey == "jakksergal" && M.real_name == "Nashi Ra'hal" && M.mind.role_alt_title && M.mind.role_alt_title != "Nurse" && M.mind.role_alt_title != "Chemist") ok = 1 - del(Item) + qdel(Item) goto skip var/obj/item/weapon/storage/belt/medical/fluff/nashi_belt/I = Item if(istype(M.belt,/obj/item/weapon/storage/belt)) for(var/obj/item/weapon/storage/belt/B in M) - del(B) + qdel(B) M.belt=null ok = M.equip_to_slot_if_possible(I, slot_belt, 0) break diff --git a/code/modules/detectivework/scanning_console.dm b/code/modules/detectivework/scanning_console.dm index 2dac51082d..b5e8af7634 100644 --- a/code/modules/detectivework/scanning_console.dm +++ b/code/modules/detectivework/scanning_console.dm @@ -277,7 +277,7 @@ if(istype(I, /obj/item/weapon/f_card)) if(process_card(I)) M.drop_item() - del(I) + qdel(I) else usr << "Invalid fingerprint card, rejected." if("print") diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 1274abff64..aac37d104a 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -109,7 +109,7 @@ log transactions user << "You insert [I] into [src]." src.attack_hand(user) - del I + qdel(I) else ..() diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index c2561423f4..eed1e40ab2 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -1,5 +1,5 @@ /obj/item/device/eftpos - name = "EFTPOS scanner" + name = "\improper EFTPOS scanner" desc = "Swipe your ID card to make purchases electronically." icon = 'icons/obj/device.dmi' icon_state = "eftpos" @@ -110,11 +110,13 @@ else user << browse(null,"window=eftpos") -/obj/item/device/eftpos/attackby(O as obj, user as mob) - if(istype(O, /obj/item/weapon/card)) +/obj/item/device/eftpos/attackby(obj/item/O as obj, user as mob) + + var/obj/item/weapon/card/id/I = O.GetID() + + if(I) if(linked_account) - var/obj/item/weapon/card/I = O - scan_card(I) + scan_card(I, O) else usr << "\icon[src]Unable to connect to linked account." else if (istype(O, /obj/item/weapon/spacecash/ewallet)) @@ -124,7 +126,7 @@ if(transaction_locked && !transaction_paid) if(transaction_amount <= E.worth) playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] The [src] chimes.") + src.visible_message("\icon[src] \The [src] chimes.") transaction_paid = 1 //transfer the money @@ -141,7 +143,7 @@ T.time = worldtime2text() linked_account.transaction_log.Add(T) else - usr << "\icon[src]The charge card doesn't have that much money!" + usr << "\icon[src]\The [O] doesn't have that much money!" else usr << "\icon[src]Connected account has been suspended." else @@ -167,7 +169,7 @@ if("change_id") var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code")) if(attempt_code == access_code) - eftpos_name = sanitize(input("Enter a new terminal ID for this device", "Enter new EFTPOS ID")) + " EFTPOS scanner" + eftpos_name = sanitize(input("Enter a new terminal ID for this device", "Enter new EFTPOS ID"), MAX_NAME_LEN) + " EFTPOS scanner" print_reference() else usr << "\icon[src]Incorrect code entered." @@ -225,10 +227,13 @@ src.attack_self(usr) -/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I) +/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I, var/obj/item/ID_container) if (istype(I, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/C = I - visible_message("[usr] swipes a card through [src].") + if(I==ID_container || ID_container == null) + usr.visible_message("\The [usr] swipes a card through \the [src].") + else + usr.visible_message("\The [usr] swipes \the [ID_container] through \the [src].") if(transaction_locked && !transaction_paid) if(linked_account) if(!linked_account.suspended) @@ -242,7 +247,7 @@ if(!D.suspended) if(transaction_amount <= D.money) playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] The [src] chimes.") + src.visible_message("\icon[src] \The [src] chimes.") transaction_paid = 1 //transfer the money @@ -283,13 +288,13 @@ else if (istype(I, /obj/item/weapon/card/emag)) if(transaction_locked) if(transaction_paid) - usr << "\icon[src]You stealthily swipe [I] through [src]." + usr << "\icon[src]You stealthily swipe \the [I] through \the [src]." transaction_locked = 0 transaction_paid = 0 else - visible_message("[usr] swipes a card through [src].") + usr.visible_message("\The [usr] swipes a card through \the [src].") playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] The [src] chimes.") + src.visible_message("\icon[src] \The [src] chimes.") transaction_paid = 1 else ..() diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index 3872b326bc..6934dc7a33 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -26,7 +26,7 @@ user.drop_from_inventory(cash) bundle = new (src.loc) bundle.worth += cash.worth - del(cash) + qdel(cash) else //is bundle bundle = W bundle.worth += src.worth @@ -37,7 +37,7 @@ h_user.drop_from_inventory(bundle) h_user.put_in_hands(bundle) user << "You add [src.worth] Thalers worth of money to the bundles.
        It holds [bundle.worth] Thalers now.
        " - del(src) + qdel(src) /obj/item/weapon/spacecash/bundle name = "pile of thalers" @@ -87,7 +87,7 @@ bundle.update_icon() usr.put_in_hands(bundle) if(!worth) - del(src) + qdel(src) /obj/item/weapon/spacecash/c1 name = "1 Thaler" diff --git a/code/modules/events/apc_damage.dm b/code/modules/events/apc_damage.dm new file mode 100644 index 0000000000..7eecfa6aef --- /dev/null +++ b/code/modules/events/apc_damage.dm @@ -0,0 +1,54 @@ +/datum/event/apc_damage + var/apcSelectionRange = 25 + +/datum/event/apc_damage/start() + var/obj/machinery/power/apc/A = acquire_random_apc() + + var/severity_range = 0 + switch(severity) + if(EVENT_LEVEL_MUNDANE) + severity_range = 0 + if(EVENT_LEVEL_MODERATE) + severity_range = 7 + if(EVENT_LEVEL_MAJOR) + severity_range = 15 + + for(var/obj/machinery/power/apc/apc in range(severity_range,A)) + if(is_valid_apc(apc)) + apc.emagged = 1 + apc.update_icon() + +/datum/event/apc_damage/proc/acquire_random_apc() + var/list/possibleEpicentres = list() + var/list/apcs = list() + + for(var/obj/effect/landmark/newEpicentre in landmarks_list) + if(newEpicentre.name == "lightsout") + possibleEpicentres += newEpicentre + + if(!possibleEpicentres.len) + return + + var/epicentre = pick(possibleEpicentres) + for(var/obj/machinery/power/apc/apc in range(epicentre,apcSelectionRange)) + if(is_valid_apc(apc)) + apcs += apc + // Greatly increase the chance for APCs in maintenance areas to be selected + var/area/A = get_area(apc) + if(istype(A,/area/maintenance)) + apcs += apc + apcs += apc + + if(!apcs.len) + return + + return pick(apcs) + +/datum/event/apc_damage/proc/is_valid_apc(var/obj/machinery/power/apc/apc) + // Type must be exactly a basic APC. + // This generally prevents affecting APCs in critical areas (AI core, engine room, etc.) as they often use higher capacity subtypes. + if(apc.type != /obj/machinery/power/apc) + return 0 + + var/turf/T = get_turf(apc) + return !apc.emagged && T && (T.z in config.player_levels) diff --git a/code/modules/events/camera_damage.dm b/code/modules/events/camera_damage.dm new file mode 100644 index 0000000000..3143b9585b --- /dev/null +++ b/code/modules/events/camera_damage.dm @@ -0,0 +1,38 @@ +/datum/event/camera_damage/start() + var/obj/machinery/camera/C = acquire_random_camera() + if(!C) + return + + var/severity_range = 0 + switch(severity) + if(EVENT_LEVEL_MUNDANE) + severity_range = 0 + if(EVENT_LEVEL_MODERATE) + severity_range = 7 + if(EVENT_LEVEL_MAJOR) + severity_range = 15 + + for(var/obj/machinery/camera/cam in range(severity_range,C)) + if(is_valid_camera(cam)) + if(prob(2*severity)) + cam.destroy() + else + cam.wires.UpdateCut(CAMERA_WIRE_POWER, 0) + if(prob(5*severity)) + cam.wires.UpdateCut(CAMERA_WIRE_ALARM, 0) + +/datum/event/camera_damage/proc/acquire_random_camera(var/remaining_attempts = 5) + if(!cameranet.cameras.len) + return + if(!remaining_attempts) + return + + var/obj/machinery/camera/C = pick(cameranet.cameras) + if(is_valid_camera(C)) + return C + return acquire_random_camera(remaining_attempts--) + +/datum/event/camera_damage/proc/is_valid_camera(var/obj/machinery/camera/C) + // Only return a functional camera, not installed in a silicon, and that exists somewhere players have access + var/turf/T = get_turf(C) + return T && C.can_use() && !istype(C.loc, /mob/living/silicon) && (T.z in config.player_levels) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 16d623d3da..5416ab2666 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -45,4 +45,4 @@ if(!C.stat) var/turf/T = get_turf(C) if(istype(T, /turf/space)) - del(C) + qdel(C) diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index fabfdd3336..68f6030425 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -12,9 +12,9 @@ A << "
        " if(prob(30)) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts. - command_announcement.Announce(alert, new_sound = sound('sound/misc/interference.ogg', volume=50)) + command_announcement.Announce(alert, new_sound = sound('sound/misc/interference.ogg', volume=25)) /datum/event/communications_blackout/start() for(var/obj/machinery/telecomms/T in telecomms_list) - T.emp_act(1) \ No newline at end of file + T.emp_act(1) diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 4a53cc696d..be40542687 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -25,4 +25,4 @@ for(var/obj/effect/landmark/epicentre in epicentreList) for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange)) - apc.overload_lighting() \ No newline at end of file + apc.overload_lighting() diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 900d6f76ec..5cb256e500 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -127,11 +127,13 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT available_events = list( // Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 10)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 10)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 30, list(ASSIGNMENT_ENGINEER = 5), 0, 0, 50), diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm index f6a7a3ab71..a50a98982a 100644 --- a/code/modules/events/rogue_drones.dm +++ b/code/modules/events/rogue_drones.dm @@ -40,7 +40,7 @@ D.z = config.admin_levels[1] D.has_loot = 0 - del(D) + qdel(D) num_recovered++ if(num_recovered > drones_list.len * 0.75) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index d96e4fb54c..52c3fdf048 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -1,14 +1,13 @@ /var/global/sent_spiders_to_station = 0 /datum/event/spider_infestation - announceWhen = 400 - + announceWhen = 90 var/spawncount = 1 /datum/event/spider_infestation/setup() - announceWhen = rand(announceWhen, announceWhen + 50) - spawncount = rand(8, 12) //spiderlings only have a 50% chance to grow big and strong + announceWhen = rand(announceWhen, announceWhen + 60) + spawncount = rand(4 * severity, 6 * severity) //spiderlings only have a 50% chance to grow big and strong sent_spiders_to_station = 0 /datum/event/spider_infestation/announce() @@ -26,4 +25,4 @@ var/obj/vent = pick(vents) new /obj/effect/spider/spiderling(vent.loc) vents -= vent - spawncount-- \ No newline at end of file + spawncount-- diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm index 55dbe2b823..639cea4d5e 100644 --- a/code/modules/events/viral_infection.dm +++ b/code/modules/events/viral_infection.dm @@ -4,12 +4,12 @@ datum/event/viral_infection datum/event/viral_infection/setup() announceWhen = rand(0, 3000) endWhen = announceWhen + 1 - + //generate 1-3 viruses. This way there's an upper limit on how many individual diseases need to be cured if many people are initially infected var/num_diseases = rand(1,3) for (var/i=0, i < num_diseases, i++) var/datum/disease2/disease/D = new /datum/disease2/disease - + var/strength = 1 //whether the disease is of the greater or lesser variety if (severity >= EVENT_LEVEL_MAJOR && prob(75)) strength = 2 @@ -24,7 +24,7 @@ datum/event/viral_infection/announce() level = pick("one", "two", "three", "four") else level = "five" - + if (severity == EVENT_LEVEL_MAJOR || prob(60)) command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') @@ -33,8 +33,10 @@ datum/event/viral_infection/start() var/list/candidates = list() //list of candidate keys for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD) - candidates += G + if(G.stat != DEAD && G.is_client_active(5)) + var/turf/T = get_turf(G) + if(T.z in config.station_levels) + candidates += G if(!candidates.len) return candidates = shuffle(candidates)//Incorporating Donkie's list shuffle diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e35b100269..803fbc67ae 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -264,26 +264,26 @@ proc/check_panel(mob/M) spawn(300) if(my_target) my_target.hallucinations -= src - del(src) + qdel(src) step_away(src,my_target,2) spawn attack_loop() proc/updateimage() - // del src.currentimage + // qdel(src.currentimage) if(src.dir == NORTH) - del src.currentimage + qdel(src.currentimage) src.currentimage = new /image(up,src) else if(src.dir == SOUTH) - del src.currentimage + qdel(src.currentimage) src.currentimage = new /image(down,src) else if(src.dir == EAST) - del src.currentimage + qdel(src.currentimage) src.currentimage = new /image(right,src) else if(src.dir == WEST) - del src.currentimage + qdel(src.currentimage) src.currentimage = new /image(left,src) my_target << currentimage @@ -329,7 +329,7 @@ proc/check_panel(mob/M) var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1) target << I spawn(300) - del(O) + qdel(O) return var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_magazine/a357,\ diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 50be2e9848..6ff5f22f20 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -47,7 +47,7 @@ var/obj/item/weapon/hand/H = O for(var/datum/playingcard/P in H.cards) cards += P - del(O) + qdel(O) user << "You place your cards on the bottom of the deck." return ..() @@ -131,7 +131,7 @@ for(var/datum/playingcard/P in H.cards) cards += P src.concealed = H.concealed - del(O) + qdel(O) user.put_in_hands(src) update_icon() return @@ -183,7 +183,7 @@ if(!discarding || !to_discard[discarding] || !usr || !src) return var/datum/playingcard/card = to_discard[discarding] - del(to_discard) + qdel(to_discard) var/obj/item/weapon/hand/H = new(src.loc) H.cards += card @@ -195,7 +195,7 @@ H.loc = get_step(usr,usr.dir) if(!cards.len) - del(src) + qdel(src) /obj/item/weapon/hand/attack_self(var/mob/user as mob) concealed = !concealed @@ -212,7 +212,7 @@ /obj/item/weapon/hand/update_icon(var/direction = 0) if(!cards.len) - del(src) + qdel(src) return else if(cards.len > 1) name = "hand of cards" diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index f19a8cd4ce..45eaf758f9 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -1,21 +1,3 @@ -var/global/list/holodeck_programs = list( - "emptycourt" = /area/holodeck/source_emptycourt, \ - "boxingcourt" = /area/holodeck/source_boxingcourt, \ - "basketball" = /area/holodeck/source_basketball, \ - "thunderdomecourt" = /area/holodeck/source_thunderdomecourt, \ - "beach" = /area/holodeck/source_beach, \ - "desert" = /area/holodeck/source_desert, \ - "space" = /area/holodeck/source_space, \ - "picnicarea" = /area/holodeck/source_picnicarea, \ - "snowfield" = /area/holodeck/source_snowfield, \ - "theatre" = /area/holodeck/source_theatre, \ - "meetinghall" = /area/holodeck/source_meetinghall, \ - "courtroom" = /area/holodeck/source_courtroom, \ - "burntest" = /area/holodeck/source_burntest, \ - "wildlifecarp" = /area/holodeck/source_wildlife, \ - "turnoff" = /area/holodeck/source_plating \ - ) - /obj/machinery/computer/HolodeckControl name = "holodeck control console" desc = "A computer used to control a nearby holodeck." @@ -113,9 +95,7 @@ var/global/list/holodeck_programs = list( if(href_list["program"]) var/prog = href_list["program"] if(prog in holodeck_programs) - target = locate(holodeck_programs[prog]) - if(target) - loadProgram(target) + loadProgram(holodeck_programs[prog]) else if(href_list["AIoverride"]) if(!issilicon(usr)) @@ -172,13 +152,9 @@ var/global/list/holodeck_programs = list( /obj/machinery/computer/HolodeckControl/New() ..() linkedholodeck = locate(/area/holodeck/alphadeck) - //if(linkedholodeck) - // target = locate(/area/holodeck/source_emptycourt) - // if(target) - // loadProgram(target) //This could all be done better, but it works for now. -/obj/machinery/computer/HolodeckControl/Del() +/obj/machinery/computer/HolodeckControl/Destroy() emergencyShutdown() ..() @@ -225,9 +201,7 @@ var/global/list/holodeck_programs = list( if(!checkInteg(linkedholodeck)) damaged = 1 - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) + loadProgram(holodeck_programs["turnoff"], 0) active = 0 use_power = 1 for(var/mob/M in range(10,src)) @@ -257,7 +231,7 @@ var/global/list/holodeck_programs = list( if(!silent) var/obj/oldobj = obj visible_message("The [oldobj.name] fades away!") - del(obj) + qdel(obj) /obj/machinery/computer/HolodeckControl/proc/checkInteg(var/area/A) for(var/turf/T in A) @@ -268,46 +242,33 @@ var/global/list/holodeck_programs = list( //Why is it called toggle if it doesn't toggle? /obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0) - if(toggleOn) - var/area/targetsource = locate(/area/holodeck/source_emptycourt) - holographic_objs = targetsource.copy_contents_to(linkedholodeck) - - spawn(30) - for(var/obj/effect/landmark/L in linkedholodeck) - if(L.name=="Atmospheric Test Start") - spawn(20) - var/turf/T = get_turf(L) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, T) - s.start() - if(T) - T.temperature = 5000 - T.hotspot_expose(50000,50000,1) - - active = 1 - use_power = 2 + loadProgram(holodeck_programs["emptycourt"], 0) else - for(var/item in holographic_objs) - derez(item) + loadProgram(holodeck_programs["turnoff"], 0) + if(!linkedholodeck.has_gravity) linkedholodeck.gravitychange(1,linkedholodeck) - var/area/targetsource = locate(/area/holodeck/source_plating) - targetsource.copy_contents_to(linkedholodeck , 1) active = 0 use_power = 1 -/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/area/A) +/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/datum/holodeck_program/HP, var/check_delay = 1) + if(!HP) + return + var/area/A = locate(HP.target) + if(!A) + return - if(world.time < (last_change + 25)) - if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve - return - for(var/mob/M in range(3,src)) - M.show_message("\b ERROR. Recalibrating projection apparatus.") - last_change = world.time - return + if(check_delay) + if(world.time < (last_change + 25)) + if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve + return + for(var/mob/M in range(3,src)) + M.show_message("\b ERROR. Recalibrating projection apparatus.") + last_change = world.time + return last_change = world.time active = 1 @@ -321,12 +282,21 @@ var/global/list/holodeck_programs = list( C.derez() for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck) - del(B) + qdel(B) holographic_objs = A.copy_contents_to(linkedholodeck , 1) for(var/obj/holo_obj in holographic_objs) holo_obj.alpha *= 0.8 //give holodeck objs a slight transparency + if(HP.ambience) + linkedholodeck.forced_ambience = HP.ambience + else + linkedholodeck.forced_ambience = initial(linkedholodeck.ambience) + + for(var/mob/living/M in mobs_in_area(linkedholodeck)) + if(M.mind) + linkedholodeck.play_ambience(M) + spawn(30) for(var/obj/effect/landmark/L in linkedholodeck) if(L.name=="Atmospheric Test Start") @@ -367,21 +337,11 @@ var/global/list/holodeck_programs = list( A.gravitychange(1,A) /obj/machinery/computer/HolodeckControl/proc/emergencyShutdown() - //Get rid of any items - for(var/item in holographic_objs) - derez(item) - for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs) - holographic_mobs -= C - C.derez() //Turn it back to the regular non-holographic room - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) + loadProgram(holodeck_programs["turnoff"], 0) if(!linkedholodeck.has_gravity) linkedholodeck.gravitychange(1,linkedholodeck) - var/area/targetsource = locate(/area/holodeck/source_plating) - targetsource.copy_contents_to(linkedholodeck , 1) active = 0 use_power = 1 diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 7200711b60..cae036d937 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -85,7 +85,7 @@ icon_state = "boxing" item_state = "boxing" -/obj/structure/window/reinforced/holowindow/Del() +/obj/structure/window/reinforced/holowindow/Destroy() ..() /obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob) @@ -95,7 +95,7 @@ if(istype(G.affecting,/mob/living)) var/mob/living/M = G.affecting var/state = G.state - del(W) //gotta delete it here because if window breaks, it won't get deleted + qdel(W) //gotta delete it here because if window breaks, it won't get deleted switch (state) if(1) M.visible_message("[user] slams [M] against \the [src]!") @@ -138,13 +138,13 @@ playsound(src, "shatter", 70, 1) if(display_message) visible_message("[src] fades away as it shatters!") - del(src) + qdel(src) return -/obj/structure/window/reinforced/holowindow/disappearing/Del() +/obj/structure/window/reinforced/holowindow/disappearing/Destroy() ..() -/obj/machinery/door/window/holowindoor/Del() +/obj/machinery/door/window/holowindoor/Destroy() ..() /obj/machinery/door/window/holowindoor/attackby(obj/item/weapon/I as obj, mob/user as mob) @@ -180,9 +180,9 @@ playsound(src, "shatter", 70, 1) if(display_message) visible_message("[src] fades away as it shatters!") - del(src) + qdel(src) -/obj/structure/bed/chair/holochair/Del() +/obj/structure/bed/chair/holochair/Destroy() ..() /obj/structure/bed/chair/holochair/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -203,6 +203,7 @@ w_class = 2.0 flags = NOSHIELD | NOBLOODY var/active = 0 + var/item_color /obj/item/weapon/holo/esword/green New() @@ -274,7 +275,7 @@ G.affecting.loc = src.loc G.affecting.Weaken(5) visible_message("[G.assailant] dunks [G.affecting] into the [src]!", 3) - del(W) + qdel(W) return else if (istype(W, /obj/item) && get_dist(src,user)<2) user.drop_item(src.loc) @@ -333,7 +334,7 @@ currentarea = get_area(src.loc) if(!currentarea) - del(src) + qdel(src) if(eventstarted) usr << "The event has already begun!" @@ -364,7 +365,7 @@ eventstarted = 1 for(var/obj/structure/window/reinforced/holowindow/disappearing/W in currentarea) - del(W) + qdel(W) for(var/mob/M in currentarea) M << "FIGHT!" @@ -424,4 +425,4 @@ /mob/living/simple_animal/hostile/carp/holodeck/proc/derez() visible_message("\The [src] fades away!") - del(src) + qdel(src) diff --git a/code/modules/holodeck/HolodeckPrograms.dm b/code/modules/holodeck/HolodeckPrograms.dm new file mode 100644 index 0000000000..9cb77f2a4b --- /dev/null +++ b/code/modules/holodeck/HolodeckPrograms.dm @@ -0,0 +1,50 @@ +var/global/list/holodeck_programs = list( + "emptycourt" = new/datum/holodeck_program(/area/holodeck/source_emptycourt, list('sound/music/THUNDERDOME.ogg')), + "boxingcourt" = new/datum/holodeck_program(/area/holodeck/source_boxingcourt, list('sound/music/THUNDERDOME.ogg')), + "basketball" = new/datum/holodeck_program(/area/holodeck/source_basketball, list('sound/music/THUNDERDOME.ogg')), + "thunderdomecourt" = new/datum/holodeck_program(/area/holodeck/source_thunderdomecourt, list('sound/music/THUNDERDOME.ogg')), + "beach" = new/datum/holodeck_program(/area/holodeck/source_beach), + "desert" = new/datum/holodeck_program(/area/holodeck/source_desert, + list( + 'sound/effects/wind/wind_2_1.ogg', + 'sound/effects/wind/wind_2_2.ogg', + 'sound/effects/wind/wind_3_1.ogg', + 'sound/effects/wind/wind_4_1.ogg', + 'sound/effects/wind/wind_4_2.ogg', + 'sound/effects/wind/wind_5_1.ogg' + ) + ), + "snowfield" = new/datum/holodeck_program(/area/holodeck/source_snowfield, + list( + 'sound/effects/wind/wind_2_1.ogg', + 'sound/effects/wind/wind_2_2.ogg', + 'sound/effects/wind/wind_3_1.ogg', + 'sound/effects/wind/wind_4_1.ogg', + 'sound/effects/wind/wind_4_2.ogg', + 'sound/effects/wind/wind_5_1.ogg' + ) + ), + "space" = new/datum/holodeck_program(/area/holodeck/source_space, + list( + 'sound/ambience/ambispace.ogg', + 'sound/music/main.ogg', + 'sound/music/space.ogg', + 'sound/music/traitor.ogg', + ) + ), + "picnicarea" = new/datum/holodeck_program(/area/holodeck/source_picnicarea, list('sound/music/title2.ogg')), + "theatre" = new/datum/holodeck_program(/area/holodeck/source_theatre), + "meetinghall" = new/datum/holodeck_program(/area/holodeck/source_meetinghall), + "courtroom" = new/datum/holodeck_program(/area/holodeck/source_courtroom, list('sound/music/traitor.ogg')), + "burntest" = new/datum/holodeck_program(/area/holodeck/source_burntest, list()), + "wildlifecarp" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list()), + "turnoff" = new/datum/holodeck_program(/area/holodeck/source_plating, list()) + ) + +/datum/holodeck_program + var/target + var/list/ambience = null + +/datum/holodeck_program/New(var/target, var/list/ambience = null) + src.target = target + src.ambience = ambience diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 9ca784070d..1d21c04932 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -13,7 +13,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc,planttype) ..() - + if(!dried_type) + dried_type = type src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) @@ -28,7 +29,7 @@ sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) world << "Plant controller does not exist and [src] requires it. Aborting." - del(src) + qdel(src) return seed = plant_controller.seeds[plantname] @@ -64,7 +65,7 @@ sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) world << "Plant controller does not exist and [src] requires it. Aborting." - del(src) + qdel(src) return if(plant_controller.product_descs["[seed.uid]"]) @@ -162,7 +163,7 @@ M.Weaken(5) seed.thrown_at(src,M) sleep(-1) - if(src) del(src) + if(src) qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/grown/throw_impact(atom/hit_atom) @@ -182,13 +183,13 @@ user.put_in_hands(pocell) pocell.maxcharge = src.potency * 10 pocell.charge = pocell.maxcharge - del(src) + qdel(src) return else if(W.sharp) if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful. user.show_message("You carve a face into [src]!", 1) new /obj/item/clothing/head/pumpkinhead (user.loc) - del(src) + qdel(src) return else if(seed.chems) if(istype(W,/obj/item/weapon/hatchet) && !isnull(seed.chems["woodpulp"])) @@ -203,22 +204,22 @@ continue G.attackby(NG, user) user << "You add the newly-formed wood to the stack. It now contains [NG.amount] planks." - del(src) + qdel(src) return else if(!isnull(seed.chems["potato"])) user << "You slice \the [src] into sticks." new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src)) - del(src) + qdel(src) return else if(!isnull(seed.chems["carrotjuice"])) user << "You slice \the [src] into sticks." new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src)) - del(src) + qdel(src) return else if(!isnull(seed.chems["soymilk"])) user << "You roughly chop up \the [src]." new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src)) - del(src) + qdel(src) return ..() @@ -275,7 +276,7 @@ if(user) user << "\The [src] has fallen to bits." user.drop_from_inventory(src) - del(src) + qdel(src) add_fingerprint(user) return 1 @@ -295,7 +296,7 @@ user.visible_message("\The [user] squashes \the [src]!") seed.thrown_at(src,user) sleep(-1) - if(src) del(src) + if(src) qdel(src) return if(seed.kitchen_tag == "grass") @@ -310,13 +311,13 @@ continue NG.attackby(G, user) user << "You add the newly-formed grass to the stack. It now contains [G.amount] tiles." - del(src) + qdel(src) return if(seed.get_trait(TRAIT_SPREAD) > 0) user << "You plant the [src.name]." new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed) - del(src) + qdel(src) return /* @@ -326,13 +327,13 @@ var/obj/item/stack/medical/bruise_pack/tajaran/poultice = new /obj/item/stack/medical/bruise_pack/tajaran(user.loc) poultice.heal_brute = potency user << "You mash the leaves into a poultice." - del(src) + qdel(src) return if("mtear") var/obj/item/stack/medical/ointment/tajaran/poultice = new /obj/item/stack/medical/ointment/tajaran(user.loc) poultice.heal_burn = potency user << "You mash the petals into a poultice." - del(src) + qdel(src) return */ @@ -354,9 +355,8 @@ seed.do_sting(H,src,pick("r_hand","l_hand")) /obj/item/weapon/reagent_containers/food/snacks/grown/dropped(mob/user) - if(!..() || !seed) - return - if(seed.get_trait(TRAIT_BIOLUM)) + ..() + if(seed && seed.get_trait(TRAIT_BIOLUM)) user.SetLuminosity(user.luminosity - seed.get_trait(TRAIT_BIOLUM)) SetLuminosity(seed.get_trait(TRAIT_BIOLUM)) diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index da9c00120d..680a7a5ec8 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -48,7 +48,7 @@ if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/kitchenknife/ritual)) user << "You use [W] to fashion a pipe out of the corn cob!" new /obj/item/clothing/mask/smokable/pipe/cobpipe (user.loc) - del(src) + qdel(src) return /obj/item/weapon/bananapeel diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 6734510a5b..a92e237eeb 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -102,10 +102,10 @@ if(!istype(target)) if(istype(target, /mob/living/simple_animal/mouse)) new /obj/effect/decal/remains/mouse(get_turf(target)) - del(target) + qdel(target) else if(istype(target, /mob/living/simple_animal/lizard)) new /obj/effect/decal/remains/lizard(get_turf(target)) - del(target) + qdel(target) return @@ -229,7 +229,7 @@ apply_special_effect(M) splatter(T,thrown) origin_turf.visible_message("The [thrown.name] explodes!") - del(thrown) + qdel(thrown) return if(istype(target,/mob/living)) @@ -242,7 +242,7 @@ if(get_trait(TRAIT_JUICY) && splatted) splatter(origin_turf,thrown) origin_turf.visible_message("The [thrown.name] splatters against [target]!") - del(thrown) + qdel(thrown) /datum/seed/proc/handle_environment(var/turf/current_turf, var/datum/gas_mixture/environment, var/light_supplied, var/check_only) diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index 9b346b961c..89cb299f5f 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -37,7 +37,7 @@ var/global/datum/controller/plants/plant_controller // Set in New(). /datum/controller/plants/New() if(plant_controller && plant_controller != src) log_debug("Rebuilding plant controller.") - del(plant_controller) + qdel(plant_controller) plant_controller = src setup() process() diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 13c73fbab1..cfbf024eda 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -38,7 +38,7 @@ seed_name = "berry" display_name = "berry bush" mutants = list("glowberries","poisonberries") - chems = list("nutriment" = list(1,10), "berryjuice" = list(1,10)) + chems = list("nutriment" = list(1,10), "berryjuice" = list(10,10)) kitchen_tag = "berries" /datum/seed/berry/New() @@ -76,7 +76,7 @@ seed_name = "poison berry" display_name = "poison berry bush" mutants = list("deathberries") - chems = list("nutriment" = list(1), "toxin" = list(3,5), "poisonberryjuice" = list(3,5)) + chems = list("nutriment" = list(1), "toxin" = list(3,5), "poisonberryjuice" = list(10,5)) /datum/seed/berry/poison/New() ..() @@ -138,7 +138,7 @@ seed_name = "tomato" display_name = "tomato plant" mutants = list("bluetomato","bloodtomato") - chems = list("nutriment" = list(1,10), "tomatojuice" = list(1,10)) + chems = list("nutriment" = list(1,10), "tomatojuice" = list(10,10)) kitchen_tag = "tomato" /datum/seed/tomato/New() @@ -196,7 +196,7 @@ seed_name = "bluespace tomato" display_name = "bluespace tomato plant" mutants = null - chems = list("nutriment" = list(1,20), "singulo" = list(1,5)) + chems = list("nutriment" = list(1,20), "singulo" = list(10,5)) /datum/seed/tomato/blue/teleport/New() ..() @@ -544,7 +544,7 @@ seed_name = "grape" display_name = "grapevines" mutants = list("greengrapes") - chems = list("nutriment" = list(1,10), "sugar" = list(1,5), "grapejuice" = list(1,10)) + chems = list("nutriment" = list(1,10), "sugar" = list(1,5), "grapejuice" = list(10,10)) /datum/seed/grapes/New() ..() @@ -563,7 +563,7 @@ seed_name = "green grape" display_name = "green grapevines" mutants = null - chems = list("nutriment" = list(1,10), "kelotane" = list(3,5), "grapejuice" = list(1,10)) + chems = list("nutriment" = list(1,10), "kelotane" = list(3,5), "grapejuice" = list(10,10)) /datum/seed/grapes/green/New() ..() @@ -610,7 +610,7 @@ name = "banana" seed_name = "banana" display_name = "banana tree" - chems = list("banana" = list(1,10)) + chems = list("banana" = list(10,10)) trash_type = /obj/item/weapon/bananapeel kitchen_tag = "banana" @@ -648,7 +648,7 @@ name = "potato" seed_name = "potato" display_name = "potatoes" - chems = list("nutriment" = list(1,10), "potato" = list(1,10)) + chems = list("nutriment" = list(1,10), "potato" = list(10,10)) kitchen_tag = "potato" /datum/seed/potato/New() @@ -666,7 +666,7 @@ name = "soybean" seed_name = "soybean" display_name = "soybeans" - chems = list("nutriment" = list(1,20), "soymilk" = list(1,20)) + chems = list("nutriment" = list(1,20), "soymilk" = list(10,20)) kitchen_tag = "soybeans" /datum/seed/soybean/New() @@ -720,7 +720,7 @@ name = "carrot" seed_name = "carrot" display_name = "carrots" - chems = list("nutriment" = list(1,20), "imidazoline" = list(3,5), "carrotjuice" = list(1,20)) + chems = list("nutriment" = list(1,20), "imidazoline" = list(3,5), "carrotjuice" = list(10,20)) kitchen_tag = "carrot" /datum/seed/carrots/New() @@ -790,7 +790,7 @@ name = "watermelon" seed_name = "watermelon" display_name = "watermelon vine" - chems = list("nutriment" = list(1,6), "watermelonjuice" = list(1,6)) + chems = list("nutriment" = list(1,6), "watermelonjuice" = list(10,6)) /datum/seed/watermelon/New() ..() @@ -828,7 +828,7 @@ name = "lime" seed_name = "lime" display_name = "lime trees" - chems = list("nutriment" = list(1,20), "limejuice" = list(1,20)) + chems = list("nutriment" = list(1,20), "limejuice" = list(10,20)) kitchen_tag = "lime" /datum/seed/citrus/New() @@ -847,7 +847,7 @@ name = "lemon" seed_name = "lemon" display_name = "lemon trees" - chems = list("nutriment" = list(1,20), "lemonjuice" = list(1,20)) + chems = list("nutriment" = list(1,20), "lemonjuice" = list(10,20)) kitchen_tag = "lemon" /datum/seed/citrus/lemon/New() @@ -860,7 +860,7 @@ seed_name = "orange" display_name = "orange trees" kitchen_tag = "orange" - chems = list("nutriment" = list(1,20), "orangejuice" = list(1,20)) + chems = list("nutriment" = list(1,20), "orangejuice" = list(10,20)) /datum/seed/citrus/orange/New() ..() @@ -906,7 +906,7 @@ seed_name = "cherry" seed_noun = "pits" display_name = "cherry tree" - chems = list("nutriment" = list(1,15), "sugar" = list(1,15), "cherryjelly" = list(1,15)) + chems = list("nutriment" = list(1,15), "sugar" = list(1,15), "cherryjelly" = list(10,15)) kitchen_tag = "cherries" /datum/seed/cherries/New() diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 1160235c9e..864b56cc28 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -224,7 +224,7 @@ genetics = seed.seed degradation = 0 - del(seed) + qdel(seed) seed = null if(href_list["get_gene"]) diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index d31f184380..3e0e8994c2 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -73,8 +73,7 @@ host << "You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." host << "Too much darkness will send you into shock and starve you, but light will help you heal." - var/newname = input(host,"Enter a name, or leave blank for the default name.", "Name change","") as text - newname = sanitize(newname) + var/newname = sanitizeSafe(input(host,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) if (newname != "") host.real_name = newname host.name = host.real_name \ No newline at end of file diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 0ee7c6175e..a4f91ce94c 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -188,16 +188,16 @@ N.seeds -= O if (N.amount <= 0 || N.seeds.len <= 0) piles -= N - del(N) + qdel(N) O.loc = src.loc else piles -= N - del(N) + qdel(N) else if (task == "purge") for (var/obj/O in N.seeds) - del(O) + qdel(O) piles -= N - del(N) + qdel(N) break updateUsrDialog() @@ -231,12 +231,15 @@ S.remove_from_storage(O, src) O.loc = src + var/newID = 0 for (var/datum/seed_pile/N in piles) if (N.matches(O)) ++N.amount N.seeds += (O) return + else if(N.ID >= newID) + newID = N.ID + 1 - piles += new /datum/seed_pile(O, piles.len) + piles += new /datum/seed_pile(O, newID) return diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 4f52b82cee..7edcca6303 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -26,13 +26,13 @@ color = DEAD_PLANT_COLOUR /obj/effect/dead_plant/attack_hand() - del(src) + qdel(src) /obj/effect/dead_plant/attackby() ..() for(var/obj/effect/plant/neighbor in range(1)) neighbor.update_neighbors() - del(src) + qdel(src) /obj/effect/plant name = "plant" @@ -60,7 +60,7 @@ var/last_tick = 0 var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/plant -/obj/effect/plant/Del() +/obj/effect/plant/Destroy() if(plant_controller) plant_controller.remove_plant(src) for(var/obj/effect/plant/neighbor in range(1,src)) @@ -81,14 +81,14 @@ sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) world << "Plant controller does not exist and [src] requires it. Aborting." - del(src) + qdel(src) return if(!istype(newseed)) newseed = plant_controller.seeds[DEFAULT_SEED] seed = newseed if(!seed) - del(src) + qdel(src) return name = seed.display_name diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 7b1eae4f21..2346956d1f 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -99,6 +99,6 @@ for(var/obj/effect/plant/neighbor in check_turf.contents) neighbor.neighbors |= check_turf plant_controller.add_plant(neighbor) - spawn(1) if(src) del(src) + spawn(1) if(src) qdel(src) #undef NEIGHBOR_REFRESH_TIME \ No newline at end of file diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index f88234155a..f8b7a82be4 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -457,7 +457,7 @@ if(!S.seed) user << "The packet seems to be empty. You throw it away." - del(O) + qdel(O) return user << "You plant the [S.seed.seed_name] [S.seed.seed_noun]." @@ -468,7 +468,7 @@ health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) lastcycle = world.time - del(O) + qdel(O) check_health() @@ -503,7 +503,7 @@ weedlevel -= spray.weed_kill_str user << "You spray [src] with [O]." playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) - del(O) + qdel(O) check_health() else if(mechanical && istype(O, /obj/item/weapon/wrench)) @@ -522,13 +522,13 @@ user << "[src] is already occupied!" else user.drop_item() - del(O) + qdel(O) var/obj/machinery/apiary/A = new(src.loc) A.icon = src.icon A.icon_state = src.icon_state A.hydrotray_type = src.type - del(src) + qdel(src) else if(O.force && seed) user.visible_message("\The [seed.display_name] has been attacked by [user] with \the [O]!") if(!dead) diff --git a/code/modules/hydroponics/trays/tray_apiary.dm b/code/modules/hydroponics/trays/tray_apiary.dm index f2098e7481..4ac67613a6 100644 --- a/code/modules/hydroponics/trays/tray_apiary.dm +++ b/code/modules/hydroponics/trays/tray_apiary.dm @@ -51,7 +51,7 @@ health = 10 nutrilevel += 10 user.drop_item() - del(O) + qdel(O) user << "\blue You carefully insert the queen into [src], she gets busy making a hive." bees_in_hive = 0 else if(istype(O, /obj/item/beezeez)) @@ -62,7 +62,7 @@ user << "\blue You insert [O] into [src]. A relaxed humming appears to pick up." else user << "\blue You insert [O] into [src]. Now it just needs some bees." - del(O) + qdel(O) else if(istype(O, /obj/item/weapon/minihoe)) if(health > 0) user << "\red You begin to dislodge the apiary from the tray, the bees don't like that." @@ -73,7 +73,7 @@ new hydrotray_type(src.loc) new /obj/item/apiary(src.loc) user << "\red You dislodge the apiary from the tray." - del(src) + qdel(src) else if(istype(O, /obj/item/weapon/bee_net)) var/obj/item/weapon/bee_net/N = O if(N.caught_bees > 0) @@ -115,11 +115,11 @@ if(swarming <= 0) for(var/mob/living/simple_animal/bee/B in src.loc) bees_in_hive += B.strength - del(B) + qdel(B) else if(bees_in_hive < 10) for(var/mob/living/simple_animal/bee/B in src.loc) bees_in_hive += B.strength - del(B) + qdel(B) if(world.time > (lastcycle + cycledelay)) lastcycle = world.time @@ -199,7 +199,7 @@ B.target_turf = get_turf(src) B.strength -= 1 if(B.strength <= 0) - del(B) + qdel(B) else if(B.strength <= 5) B.icon_state = "bees[B.strength]" bees_in_hive = 0 diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index ff8e3e23df..54c2380bcf 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -41,25 +41,25 @@ /obj/machinery/portable_atmospherics/hydroponics/soil/invisible/remove_dead() ..() - del(src) + qdel(src) /obj/machinery/portable_atmospherics/hydroponics/soil/invisible/harvest() ..() if(!seed) // Repeat harvests are a thing. - del(src) + qdel(src) /obj/machinery/portable_atmospherics/hydroponics/soil/invisible/die() - del(src) + qdel(src) /obj/machinery/portable_atmospherics/hydroponics/soil/invisible/process() if(!seed) - del(src) + qdel(src) return else if(name=="plant") name = seed.display_name ..() -/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/Del() +/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/Destroy() // Check if we're masking a decal that needs to be visible again. for(var/obj/effect/plant/plant in get_turf(src)) if(plant.invisibility == INVISIBILITY_MAXIMUM) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 10f5961da7..3b42ee3854 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -277,4 +277,4 @@ for(var/obj/effect/plant/B in orange(A,1)) if(prob(80)) B.die_off(1) - del A \ No newline at end of file + qdel(A) \ No newline at end of file diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 279be15775..354d674215 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -31,7 +31,7 @@ O.loc = src update_icon() else if(istype(O, /obj/item/weapon/pen)) - var/newname = sanitizeSafe(input("What would you like to title this bookshelf?"), MAX_MESSAGE_LEN) + var/newname = sanitizeSafe(input("What would you like to title this bookshelf?"), MAX_NAME_LEN) if(!newname) return else @@ -56,20 +56,20 @@ switch(severity) if(1.0) for(var/obj/item/weapon/book/b in contents) - del(b) - del(src) + qdel(b) + qdel(src) return if(2.0) for(var/obj/item/weapon/book/b in contents) if (prob(50)) b.loc = (get_turf(src)) - else del(b) - del(src) + else qdel(b) + qdel(src) return if(3.0) if (prob(50)) for(var/obj/item/weapon/book/b in contents) b.loc = (get_turf(src)) - del(src) + qdel(src) return else return diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 5d390948a3..f83bcb317f 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -463,6 +463,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f b.dat = O:info b.name = "Print Job #" + "[rand(100, 999)]" b.icon_state = "book[rand(1,7)]" - del(O) + qdel(O) else ..() diff --git a/code/modules/liquid/splash_simulation.dm b/code/modules/liquid/splash_simulation.dm index d7352ff712..983f46603d 100644 --- a/code/modules/liquid/splash_simulation.dm +++ b/code/modules/liquid/splash_simulation.dm @@ -16,16 +16,16 @@ datum/puddle/proc/process() L.apply_calculated_effect() if(liquid_objects.len == 0) - del(src) + qdel(src) datum/puddle/New() ..() puddles += src -datum/puddle/Del() +datum/puddle/Destroy() puddles -= src for(var/obj/O in liquid_objects) - del(O) + qdel(O) ..() client/proc/splash() @@ -63,11 +63,11 @@ obj/effect/liquid obj/effect/liquid/New() ..() if( !isturf(loc) ) - del(src) + qdel(src) for( var/obj/effect/liquid/L in loc ) if(L != src) - del(L) + qdel(L) obj/effect/liquid/proc/spread() @@ -124,14 +124,14 @@ obj/effect/liquid/proc/apply_calculated_effect() volume += new_volume if(volume < LIQUID_TRANSFER_THRESHOLD) - del(src) + qdel(src) new_volume = 0 update_icon2() obj/effect/liquid/Move() return 0 -obj/effect/liquid/Del() +obj/effect/liquid/Destroy() src.controller.liquid_objects.Remove(src) ..() @@ -140,7 +140,7 @@ obj/effect/liquid/proc/update_icon2() switch(volume) if(0 to 0.1) - del(src) + qdel(src) if(0.1 to 5) icon_state = "1" if(5 to 10) diff --git a/code/modules/maps/swapmaps.dm b/code/modules/maps/swapmaps.dm index cee890ca21..127af2e7a1 100644 --- a/code/modules/maps/swapmaps.dm +++ b/code/modules/maps/swapmaps.dm @@ -1,678 +1,678 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/* - SwapMaps library by Lummox JR - developed for digitalBYOND - http://www.digitalbyond.org - - Version 2.1 - - The purpose of this library is to make it easy for authors to swap maps - in and out of their game using savefiles. Swapped-out maps can be - transferred between worlds for an MMORPG, sent to the client, etc. - This is facilitated by the use of a special datum and a global list. - - Uses of swapmaps: - - - Temporary battle arenas - - House interiors - - Individual custom player houses - - Virtually unlimited terrain - - Sharing maps between servers running different instances of the same - game - - Loading and saving pieces of maps for reusable room templates - */ - -/* - User Interface: - - VARS: - - swapmaps_iconcache - An associative list of icon files with names, like - 'player.dmi' = "player" - swapmaps_mode - This must be set at runtime, like in world/New(). - - SWAPMAPS_SAV 0 (default) - Uses .sav files for raw /savefile output. - SWAPMAPS_TEXT 1 - Uses .txt files via ExportText() and ImportText(). These maps - are easily editable and appear to take up less space in the - current version of BYOND. - - PROCS: - - SwapMaps_Find(id) - Find a map by its id - SwapMaps_Load(id) - Load a map by its id - SwapMaps_Save(id) - Save a map by its id (calls swapmap.Save()) - SwapMaps_Unload(id) - Save and unload a map by its id (calls swapmap.Unload()) - SwapMaps_Save_All() - Save all maps - SwapMaps_DeleteFile(id) - Delete a map file - SwapMaps_CreateFromTemplate(id) - Create a new map by loading another map to use as a template. - This map has id==src and will not be saved. To make it savable, - change id with swapmap.SetID(newid). - SwapMaps_LoadChunk(id,turf/locorner) - Load a swapmap as a "chunk", at a specific place. A new datum is - created but it's not added to the list of maps to save or unload. - The new datum can be safely deleted without affecting the turfs - it loaded. The purpose of this is to load a map file onto part of - another swapmap or an existing part of the world. - locorner is the corner turf with the lowest x,y,z values. - SwapMaps_SaveChunk(id,turf/corner1,turf/corner2) - Save a piece of the world as a "chunk". A new datum is created - for the chunk, but it can be deleted without destroying any turfs. - The chunk file can be reloaded as a swapmap all its own, or loaded - via SwapMaps_LoadChunk() to become part of another map. - SwapMaps_GetSize(id) - Return a list corresponding to the x,y,z sizes of a map file, - without loading the map. - Returns null if the map is not found. - SwapMaps_AddIconToCache(name,icon) - Cache an icon file by name for space-saving storage - - swapmap.New(id,x,y,z) - Create a new map; specify id, width (x), height (y), and - depth (z) - Default size is world.maxx,world.maxy,1 - swapmap.New(id,turf1,turf2) - Create a new map; specify id and 2 corners - This becomes a /swapmap for one of the compiled-in maps, for - easy saving. - swapmap.New() - Create a new map datum, but does not allocate space or assign an - ID (used for loading). - swapmap.Del() - Deletes a map but does not save - swapmap.Save() - Saves to map_[id].sav - Maps with id==src are not saved. - swapmap.Unload() - Saves the map and then deletes it - Maps with id==src are not saved. - swapmap.SetID(id) - Change the map's id and make changes to the lookup list - swapmap.AllTurfs(z) - Returns a block of turfs encompassing the entire map, or on just - one z-level - z is in world coordinates; it is optional - swapmap.Contains(turf/T) - Returns nonzero if T is inside the map's boundaries. - Also works for objs and mobs, but the proc is not area-safe. - swapmap.InUse() - Returns nonzero if a mob with a key is within the map's - boundaries. - swapmap.LoCorner(z=z1) - Returns locate(x1,y1,z), where z=z1 if none is specified. - swapmap.HiCorner(z=z2) - Returns locate(x2,y2,z), where z=z2 if none is specified. - swapmap.BuildFilledRectangle(turf/corner1,turf/corner2,item) - Builds a filled rectangle of item from one corner turf to the - other, on multiple z-levels if necessary. The corners may be - specified in any order. - item is a type path like /turf/wall or /obj/barrel{full=1}. - swapmap.BuildRectangle(turf/corner1,turf/corner2,item) - Builds an unfilled rectangle of item from one corner turf to - the other, on multiple z-levels if necessary. - swapmap.BuildInTurfs(list/turfs,item) - Builds item on all of the turfs listed. The list need not - contain only turfs, or even only atoms. - */ - -swapmap - var/id // a string identifying this map uniquely - var/x1 // minimum x,y,z coords - var/y1 - var/z1 - var/x2 // maximum x,y,z coords (also used as width,height,depth until positioned) - var/y2 - var/z2 - var/tmp/locked // don't move anyone to this map; it's saving or loading - var/tmp/mode // save as text-mode - var/ischunk // tells the load routine to load to the specified location - - New(_id,x,y,z) - if(isnull(_id)) return - id=_id - mode=swapmaps_mode - if(isturf(x) && isturf(y)) - /* - Special format: Defines a map as an existing set of turfs; - this is useful for saving a compiled map in swapmap format. - Because this is a compiled-in map, its turfs are not deleted - when the datum is deleted. - */ - x1=min(x:x,y:x);x2=max(x:x,y:x) - y1=min(x:y,y:y);y2=max(x:y,y:y) - z1=min(x:z,y:z);z2=max(x:z,y:z) - InitializeSwapMaps() - if(z2>swapmaps_compiled_maxz ||\ - y2>swapmaps_compiled_maxy ||\ - x2>swapmaps_compiled_maxx) - del(src) - return - x2=x?(x):world.maxx - y2=y?(y):world.maxy - z2=z?(z):1 - AllocateSwapMap() - - Del() - // a temporary datum for a chunk can be deleted outright - // for others, some cleanup is necessary - if(!ischunk) - swapmaps_loaded-=src - swapmaps_byname-=id - if(z2>swapmaps_compiled_maxz ||\ - y2>swapmaps_compiled_maxy ||\ - x2>swapmaps_compiled_maxx) - var/list/areas=new - for(var/atom/A in block(locate(x1,y1,z1),locate(x2,y2,z2))) - for(var/obj/O in A) del(O) - for(var/mob/M in A) - if(!M.key) del(M) - else M.loc=null - areas[A.loc]=null - del(A) - // delete areas that belong only to this map - for(var/area/a in areas) - if(a && !a.contents.len) del(a) - if(x2>=world.maxx || y2>=world.maxy || z2>=world.maxz) CutXYZ() - del(areas) - ..() - - /* - Savefile format: - map - id - x // size, not coords - y - z - areas // list of areas, not including default - [each z; 1 to depth] - [each y; 1 to height] - [each x; 1 to width] - type // of turf - AREA // if non-default; saved as a number (index into areas list) - vars // all other changed vars - */ - Write(savefile/S) - var/x - var/y - var/z - var/n - var/list/areas - var/area/defarea=locate(world.area) - if(!defarea) defarea=new world.area - areas=list() - for(var/turf/T in block(locate(x1,y1,z1),locate(x2,y2,z2))) - areas[T.loc]=null - for(n in areas) // quickly eliminate associations for smaller storage - areas-=n - areas+=n - areas-=defarea - InitializeSwapMaps() - locked=1 - S["id"] << id - S["z"] << z2-z1+1 - S["y"] << y2-y1+1 - S["x"] << x2-x1+1 - S["areas"] << areas - for(n in 1 to areas.len) areas[areas[n]]=n - var/oldcd=S.cd - for(z=z1,z<=z2,++z) - S.cd="[z-z1+1]" - for(y=y1,y<=y2,++y) - S.cd="[y-y1+1]" - for(x=x1,x<=x2,++x) - S.cd="[x-x1+1]" - var/turf/T=locate(x,y,z) - S["type"] << T.type - if(T.loc!=defarea) S["AREA"] << areas[T.loc] - T.Write(S) - S.cd=".." - S.cd=".." - sleep() - S.cd=oldcd - locked=0 - del(areas) - - Read(savefile/S,_id,turf/locorner) - var/x - var/y - var/z - var/n - var/list/areas - var/area/defarea=locate(world.area) - id=_id - if(locorner) - ischunk=1 - x1=locorner.x - y1=locorner.y - z1=locorner.z - if(!defarea) defarea=new world.area - if(!_id) - S["id"] >> id - else - var/dummy - S["id"] >> dummy - S["z"] >> z2 // these are depth, - S["y"] >> y2 // height, - S["x"] >> x2 // width - S["areas"] >> areas - locked=1 - AllocateSwapMap() // adjust x1,y1,z1 - x2,y2,z2 coords - var/oldcd=S.cd - for(z=z1,z<=z2,++z) - S.cd="[z-z1+1]" - for(y=y1,y<=y2,++y) - S.cd="[y-y1+1]" - for(x=x1,x<=x2,++x) - S.cd="[x-x1+1]" - var/tp - S["type"]>>tp - var/turf/T=locate(x,y,z) - T.loc.contents-=T - T=new tp(locate(x,y,z)) - if("AREA" in S.dir) - S["AREA"]>>n - var/area/A=areas[n] - A.contents+=T - else defarea.contents+=T - // clear the turf - for(var/obj/O in T) del(O) - for(var/mob/M in T) - if(!M.key) del(M) - else M.loc=null - // finish the read - T.Read(S) - S.cd=".." - S.cd=".." - sleep() - S.cd=oldcd - locked=0 - del(areas) - - /* - Find an empty block on the world map in which to load this map. - If no space is found, increase world.maxz as necessary. (If the - map is greater in x,y size than the current world, expand - world.maxx and world.maxy too.) - - Ignore certain operations if loading a map as a chunk. Use the - x1,y1,z1 position for it, and *don't* count it as a loaded map. - */ - proc/AllocateSwapMap() - InitializeSwapMaps() - world.maxx=max(x2,world.maxx) // stretch x/y if necessary - world.maxy=max(y2,world.maxy) - if(!ischunk) - if(world.maxz<=swapmaps_compiled_maxz) - z1=swapmaps_compiled_maxz+1 - x1=1;y1=1 - else - var/list/l=ConsiderRegion(1,1,world.maxx,world.maxy,swapmaps_compiled_maxz+1) - x1=l[1] - y1=l[2] - z1=l[3] - del(l) - x2+=x1-1 - y2+=y1-1 - z2+=z1-1 - world.maxz=max(z2,world.maxz) // stretch z if necessary - if(!ischunk) - swapmaps_loaded[src]=null - swapmaps_byname[id]=src - - proc/ConsiderRegion(X1,Y1,X2,Y2,Z1,Z2) - while(1) - var/nextz=0 - var/swapmap/M - for(M in swapmaps_loaded) - if(M.z2Z2) || M.z1>=Z1+z2 ||\ - M.x1>X2 || M.x2=X1+x2 ||\ - M.y1>Y2 || M.y2=Y1+y2) continue - // look for sub-regions with a defined ceiling - var/nz2=Z2?(Z2):Z1+z2-1+M.z2-M.z1 - if(M.x1>=X1+x2) - .=ConsiderRegion(X1,Y1,M.x1-1,Y2,Z1,nz2) - if(.) return - else if(M.x2<=X2-x2) - .=ConsiderRegion(M.x2+1,Y1,X2,Y2,Z1,nz2) - if(.) return - if(M.y1>=Y1+y2) - .=ConsiderRegion(X1,Y1,X2,M.y1-1,Z1,nz2) - if(.) return - else if(M.y2<=Y2-y2) - .=ConsiderRegion(X1,M.y2+1,X2,Y2,Z1,nz2) - if(.) return - nextz=nextz?min(nextz,M.z2+1):(M.z2+1) - if(!M) - /* If nextz is not 0, then at some point there was an overlap that - could not be resolved by using an area to the side */ - if(nextz) Z1=nextz - if(!nextz || (Z2 && Z2-Z1+1=z2)?list(X1,Y1,Z1):null - X1=1;X2=world.maxx - Y1=1;Y2=world.maxy - - proc/CutXYZ() - var/mx=swapmaps_compiled_maxx - var/my=swapmaps_compiled_maxy - var/mz=swapmaps_compiled_maxz - for(var/swapmap/M in swapmaps_loaded) // may not include src - mx=max(mx,M.x2) - my=max(my,M.y2) - mz=max(mz,M.z2) - world.maxx=mx - world.maxy=my - world.maxz=mz - - // save and delete - proc/Unload() - Save() - del(src) - - proc/Save() - if(id==src) return 0 - var/savefile/S=mode?(new):new("map_[id].sav") - S << src - while(locked) sleep(1) - if(mode) - fdel("map_[id].txt") - S.ExportText("/","map_[id].txt") - return 1 - - // this will not delete existing savefiles for this map - proc/SetID(newid) - swapmaps_byname-=id - id=newid - swapmaps_byname[id]=src - - proc/AllTurfs(z) - if(isnum(z) && (zz2)) return null - return block(LoCorner(z),HiCorner(z)) - - // this could be safely called for an obj or mob as well, but - // probably not an area - proc/Contains(turf/T) - return (T && T.x>=x1 && T.x<=x2\ - && T.y>=y1 && T.y<=y2\ - && T.z>=z1 && T.z<=z2) - - proc/InUse() - for(var/turf/T in AllTurfs()) - for(var/mob/M in T) if(M.key) return 1 - - proc/LoCorner(z=z1) - return locate(x1,y1,z) - proc/HiCorner(z=z2) - return locate(x2,y2,z) - - /* - Build procs: Take 2 turfs as corners, plus an item type. - An item may be like: - - /turf/wall - /obj/fence{icon_state="iron"} - */ - proc/BuildFilledRectangle(turf/T1,turf/T2,item) - if(!Contains(T1) || !Contains(T2)) return - var/turf/T=T1 - // pick new corners in a block()-friendly form - T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) - T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) - for(T in block(T1,T2)) new item(T) - - proc/BuildRectangle(turf/T1,turf/T2,item) - if(!Contains(T1) || !Contains(T2)) return - var/turf/T=T1 - // pick new corners in a block()-friendly form - T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) - T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) - if(T2.x-T1.x<2 || T2.y-T1.y<2) BuildFilledRectangle(T1,T2,item) - else - //for(T in block(T1,T2)-block(locate(T1.x+1,T1.y+1,T1.z),locate(T2.x-1,T2.y-1,T2.z))) - for(T in block(T1,locate(T2.x,T1.y,T2.z))) new item(T) - for(T in block(locate(T1.x,T2.y,T1.z),T2)) new item(T) - for(T in block(locate(T1.x,T1.y+1,T1.z),locate(T1.x,T2.y-1,T2.z))) new item(T) - for(T in block(locate(T2.x,T1.y+1,T1.z),locate(T2.x,T2.y-1,T2.z))) new item(T) - - /* - Supplementary build proc: Takes a list of turfs, plus an item - type. Actually the list doesn't have to be just turfs. - */ - proc/BuildInTurfs(list/turfs,item) - for(var/T in turfs) new item(T) - -atom - Write(savefile/S) - for(var/V in vars-"x"-"y"-"z"-"contents"-"icon"-"overlays"-"underlays") - if(issaved(vars[V])) - if(vars[V]!=initial(vars[V])) S[V]<>ic - if(istext(ic)) icon=swapmaps_iconcache[ic] - if(l && contents!=l) - contents+=l - del(l) - - -// set this up (at runtime) as follows: -// list(\ -// 'player.dmi'="player",\ -// 'monster.dmi'="monster",\ -// ... -// 'item.dmi'="item") -var/list/swapmaps_iconcache - -// preferred mode; sav or text -var/const/SWAPMAPS_SAV=0 -var/const/SWAPMAPS_TEXT=1 -var/swapmaps_mode=SWAPMAPS_SAV - -var/swapmaps_compiled_maxx -var/swapmaps_compiled_maxy -var/swapmaps_compiled_maxz -var/swapmaps_initialized -var/swapmaps_loaded -var/swapmaps_byname - -proc/InitializeSwapMaps() - if(swapmaps_initialized) return - swapmaps_initialized=1 - swapmaps_compiled_maxx=world.maxx - swapmaps_compiled_maxy=world.maxy - swapmaps_compiled_maxz=world.maxz - swapmaps_loaded=list() - swapmaps_byname=list() - if(swapmaps_iconcache) - for(var/V in swapmaps_iconcache) - // reverse-associate everything - // so you can look up an icon file by name or vice-versa - swapmaps_iconcache[swapmaps_iconcache[V]]=V - -proc/SwapMaps_AddIconToCache(name,icon) - if(!swapmaps_iconcache) swapmaps_iconcache=list() - swapmaps_iconcache[name]=icon - swapmaps_iconcache[icon]=name - -proc/SwapMaps_Find(id) - InitializeSwapMaps() - return swapmaps_byname[id] - -proc/SwapMaps_Load(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(!M) - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else if(fexists("map_[id].sav")) - S=new("map_[id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else return // no file found - if(text) - S=new - S.ImportText("/",file("map_[id].txt")) - S >> M - while(M.locked) sleep(1) - M.mode=text - return M - -proc/SwapMaps_Save(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(M) M.Save() - return M - -proc/SwapMaps_Save_All() - InitializeSwapMaps() - for(var/swapmap/M in swapmaps_loaded) - if(M) M.Save() - -proc/SwapMaps_Unload(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(!M) return // return silently from an error - M.Unload() - return 1 - -proc/SwapMaps_DeleteFile(id) - fdel("map_[id].sav") - fdel("map_[id].txt") - -proc/SwapMaps_CreateFromTemplate(template_id) - var/swapmap/M=new - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[template_id].txt")) - text=1 - else if(fexists("map_[template_id].sav")) - S=new("map_[template_id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt")) - text=1 - else - world.log << "SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found." - return - if(text) - S=new - S.ImportText("/",file("map_[template_id].txt")) - /* - This hacky workaround is needed because S >> M will create a brand new - M to fill with data. There's no way to control the Read() process - properly otherwise. The //.0 path should always match the map, however. - */ - S.cd="//.0" - M.Read(S,M) - M.mode=text - while(M.locked) sleep(1) - return M - -proc/SwapMaps_LoadChunk(chunk_id,turf/locorner) - var/swapmap/M=new - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) - text=1 - else if(fexists("map_[chunk_id].sav")) - S=new("map_[chunk_id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) - text=1 - else - world.log << "SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found." - return - if(text) - S=new - S.ImportText("/",file("map_[chunk_id].txt")) - /* - This hacky workaround is needed because S >> M will create a brand new - M to fill with data. There's no way to control the Read() process - properly otherwise. The //.0 path should always match the map, however. - */ - S.cd="//.0" - M.Read(S,M,locorner) - while(M.locked) sleep(1) - del(M) - return 1 - -proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2) - if(!corner1 || !corner2) - world.log << "SwapMaps error in SwapMaps_SaveChunk():" - if(!corner1) world.log << " corner1 turf is null" - if(!corner2) world.log << " corner2 turf is null" - return - var/swapmap/M=new - M.id=chunk_id - M.ischunk=1 // this is a chunk - M.x1=min(corner1.x,corner2.x) - M.y1=min(corner1.y,corner2.y) - M.z1=min(corner1.z,corner2.z) - M.x2=max(corner1.x,corner2.x) - M.y2=max(corner1.y,corner2.y) - M.z2=max(corner1.z,corner2.z) - M.mode=swapmaps_mode - M.Save() - while(M.locked) sleep(1) - del(M) - return 1 - -proc/SwapMaps_GetSize(id) - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else if(fexists("map_[id].sav")) - S=new("map_[id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else - world.log << "SwapMaps error in SwapMaps_GetSize(): map_[id] file not found." - return - if(text) - S=new - S.ImportText("/",file("map_[id].txt")) - /* - The //.0 path should always be the map. There's no other way to - read this data. - */ - S.cd="//.0" - var/x - var/y - var/z - S["x"] >> x - S["y"] >> y - S["z"] >> z - return list(x,y,z) +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + +/* + SwapMaps library by Lummox JR + developed for digitalBYOND + http://www.digitalbyond.org + + Version 2.1 + + The purpose of this library is to make it easy for authors to swap maps + in and out of their game using savefiles. Swapped-out maps can be + transferred between worlds for an MMORPG, sent to the client, etc. + This is facilitated by the use of a special datum and a global list. + + Uses of swapmaps: + + - Temporary battle arenas + - House interiors + - Individual custom player houses + - Virtually unlimited terrain + - Sharing maps between servers running different instances of the same + game + - Loading and saving pieces of maps for reusable room templates + */ + +/* + User Interface: + + VARS: + + swapmaps_iconcache + An associative list of icon files with names, like + 'player.dmi' = "player" + swapmaps_mode + This must be set at runtime, like in world/New(). + + SWAPMAPS_SAV 0 (default) + Uses .sav files for raw /savefile output. + SWAPMAPS_TEXT 1 + Uses .txt files via ExportText() and ImportText(). These maps + are easily editable and appear to take up less space in the + current version of BYOND. + + PROCS: + + SwapMaps_Find(id) + Find a map by its id + SwapMaps_Load(id) + Load a map by its id + SwapMaps_Save(id) + Save a map by its id (calls swapmap.Save()) + SwapMaps_Unload(id) + Save and unload a map by its id (calls swapmap.Unload()) + SwapMaps_Save_All() + Save all maps + SwapMaps_DeleteFile(id) + Delete a map file + SwapMaps_CreateFromTemplate(id) + Create a new map by loading another map to use as a template. + This map has id==src and will not be saved. To make it savable, + change id with swapmap.SetID(newid). + SwapMaps_LoadChunk(id,turf/locorner) + Load a swapmap as a "chunk", at a specific place. A new datum is + created but it's not added to the list of maps to save or unload. + The new datum can be safely deleted without affecting the turfs + it loaded. The purpose of this is to load a map file onto part of + another swapmap or an existing part of the world. + locorner is the corner turf with the lowest x,y,z values. + SwapMaps_SaveChunk(id,turf/corner1,turf/corner2) + Save a piece of the world as a "chunk". A new datum is created + for the chunk, but it can be deleted without destroying any turfs. + The chunk file can be reloaded as a swapmap all its own, or loaded + via SwapMaps_LoadChunk() to become part of another map. + SwapMaps_GetSize(id) + Return a list corresponding to the x,y,z sizes of a map file, + without loading the map. + Returns null if the map is not found. + SwapMaps_AddIconToCache(name,icon) + Cache an icon file by name for space-saving storage + + swapmap.New(id,x,y,z) + Create a new map; specify id, width (x), height (y), and + depth (z) + Default size is world.maxx,world.maxy,1 + swapmap.New(id,turf1,turf2) + Create a new map; specify id and 2 corners + This becomes a /swapmap for one of the compiled-in maps, for + easy saving. + swapmap.New() + Create a new map datum, but does not allocate space or assign an + ID (used for loading). + swapmap.Del() + Deletes a map but does not save + swapmap.Save() + Saves to map_[id].sav + Maps with id==src are not saved. + swapmap.Unload() + Saves the map and then deletes it + Maps with id==src are not saved. + swapmap.SetID(id) + Change the map's id and make changes to the lookup list + swapmap.AllTurfs(z) + Returns a block of turfs encompassing the entire map, or on just + one z-level + z is in world coordinates; it is optional + swapmap.Contains(turf/T) + Returns nonzero if T is inside the map's boundaries. + Also works for objs and mobs, but the proc is not area-safe. + swapmap.InUse() + Returns nonzero if a mob with a key is within the map's + boundaries. + swapmap.LoCorner(z=z1) + Returns locate(x1,y1,z), where z=z1 if none is specified. + swapmap.HiCorner(z=z2) + Returns locate(x2,y2,z), where z=z2 if none is specified. + swapmap.BuildFilledRectangle(turf/corner1,turf/corner2,item) + Builds a filled rectangle of item from one corner turf to the + other, on multiple z-levels if necessary. The corners may be + specified in any order. + item is a type path like /turf/wall or /obj/barrel{full=1}. + swapmap.BuildRectangle(turf/corner1,turf/corner2,item) + Builds an unfilled rectangle of item from one corner turf to + the other, on multiple z-levels if necessary. + swapmap.BuildInTurfs(list/turfs,item) + Builds item on all of the turfs listed. The list need not + contain only turfs, or even only atoms. + */ + +swapmap + var/id // a string identifying this map uniquely + var/x1 // minimum x,y,z coords + var/y1 + var/z1 + var/x2 // maximum x,y,z coords (also used as width,height,depth until positioned) + var/y2 + var/z2 + var/tmp/locked // don't move anyone to this map; it's saving or loading + var/tmp/mode // save as text-mode + var/ischunk // tells the load routine to load to the specified location + + New(_id,x,y,z) + if(isnull(_id)) return + id=_id + mode=swapmaps_mode + if(isturf(x) && isturf(y)) + /* + Special format: Defines a map as an existing set of turfs; + this is useful for saving a compiled map in swapmap format. + Because this is a compiled-in map, its turfs are not deleted + when the datum is deleted. + */ + x1=min(x:x,y:x);x2=max(x:x,y:x) + y1=min(x:y,y:y);y2=max(x:y,y:y) + z1=min(x:z,y:z);z2=max(x:z,y:z) + InitializeSwapMaps() + if(z2>swapmaps_compiled_maxz ||\ + y2>swapmaps_compiled_maxy ||\ + x2>swapmaps_compiled_maxx) + qdel(src) + return + x2=x?(x):world.maxx + y2=y?(y):world.maxy + z2=z?(z):1 + AllocateSwapMap() + + Del() + // a temporary datum for a chunk can be deleted outright + // for others, some cleanup is necessary + if(!ischunk) + swapmaps_loaded-=src + swapmaps_byname-=id + if(z2>swapmaps_compiled_maxz ||\ + y2>swapmaps_compiled_maxy ||\ + x2>swapmaps_compiled_maxx) + var/list/areas=new + for(var/atom/A in block(locate(x1,y1,z1),locate(x2,y2,z2))) + for(var/obj/O in A) qdel(O) + for(var/mob/M in A) + if(!M.key) qdel(M) + else M.loc=null + areas[A.loc]=null + qdel(A) + // delete areas that belong only to this map + for(var/area/a in areas) + if(a && !a.contents.len) qdel(a) + if(x2>=world.maxx || y2>=world.maxy || z2>=world.maxz) CutXYZ() + qdel(areas) + ..() + + /* + Savefile format: + map + id + x // size, not coords + y + z + areas // list of areas, not including default + [each z; 1 to depth] + [each y; 1 to height] + [each x; 1 to width] + type // of turf + AREA // if non-default; saved as a number (index into areas list) + vars // all other changed vars + */ + Write(savefile/S) + var/x + var/y + var/z + var/n + var/list/areas + var/area/defarea=locate(world.area) + if(!defarea) defarea=new world.area + areas=list() + for(var/turf/T in block(locate(x1,y1,z1),locate(x2,y2,z2))) + areas[T.loc]=null + for(n in areas) // quickly eliminate associations for smaller storage + areas-=n + areas+=n + areas-=defarea + InitializeSwapMaps() + locked=1 + S["id"] << id + S["z"] << z2-z1+1 + S["y"] << y2-y1+1 + S["x"] << x2-x1+1 + S["areas"] << areas + for(n in 1 to areas.len) areas[areas[n]]=n + var/oldcd=S.cd + for(z=z1,z<=z2,++z) + S.cd="[z-z1+1]" + for(y=y1,y<=y2,++y) + S.cd="[y-y1+1]" + for(x=x1,x<=x2,++x) + S.cd="[x-x1+1]" + var/turf/T=locate(x,y,z) + S["type"] << T.type + if(T.loc!=defarea) S["AREA"] << areas[T.loc] + T.Write(S) + S.cd=".." + S.cd=".." + sleep() + S.cd=oldcd + locked=0 + qdel(areas) + + Read(savefile/S,_id,turf/locorner) + var/x + var/y + var/z + var/n + var/list/areas + var/area/defarea=locate(world.area) + id=_id + if(locorner) + ischunk=1 + x1=locorner.x + y1=locorner.y + z1=locorner.z + if(!defarea) defarea=new world.area + if(!_id) + S["id"] >> id + else + var/dummy + S["id"] >> dummy + S["z"] >> z2 // these are depth, + S["y"] >> y2 // height, + S["x"] >> x2 // width + S["areas"] >> areas + locked=1 + AllocateSwapMap() // adjust x1,y1,z1 - x2,y2,z2 coords + var/oldcd=S.cd + for(z=z1,z<=z2,++z) + S.cd="[z-z1+1]" + for(y=y1,y<=y2,++y) + S.cd="[y-y1+1]" + for(x=x1,x<=x2,++x) + S.cd="[x-x1+1]" + var/tp + S["type"]>>tp + var/turf/T=locate(x,y,z) + T.loc.contents-=T + T=new tp(locate(x,y,z)) + if("AREA" in S.dir) + S["AREA"]>>n + var/area/A=areas[n] + A.contents+=T + else defarea.contents+=T + // clear the turf + for(var/obj/O in T) qdel(O) + for(var/mob/M in T) + if(!M.key) qdel(M) + else M.loc=null + // finish the read + T.Read(S) + S.cd=".." + S.cd=".." + sleep() + S.cd=oldcd + locked=0 + qdel(areas) + + /* + Find an empty block on the world map in which to load this map. + If no space is found, increase world.maxz as necessary. (If the + map is greater in x,y size than the current world, expand + world.maxx and world.maxy too.) + + Ignore certain operations if loading a map as a chunk. Use the + x1,y1,z1 position for it, and *don't* count it as a loaded map. + */ + proc/AllocateSwapMap() + InitializeSwapMaps() + world.maxx=max(x2,world.maxx) // stretch x/y if necessary + world.maxy=max(y2,world.maxy) + if(!ischunk) + if(world.maxz<=swapmaps_compiled_maxz) + z1=swapmaps_compiled_maxz+1 + x1=1;y1=1 + else + var/list/l=ConsiderRegion(1,1,world.maxx,world.maxy,swapmaps_compiled_maxz+1) + x1=l[1] + y1=l[2] + z1=l[3] + qdel(l) + x2+=x1-1 + y2+=y1-1 + z2+=z1-1 + world.maxz=max(z2,world.maxz) // stretch z if necessary + if(!ischunk) + swapmaps_loaded[src]=null + swapmaps_byname[id]=src + + proc/ConsiderRegion(X1,Y1,X2,Y2,Z1,Z2) + while(1) + var/nextz=0 + var/swapmap/M + for(M in swapmaps_loaded) + if(M.z2Z2) || M.z1>=Z1+z2 ||\ + M.x1>X2 || M.x2=X1+x2 ||\ + M.y1>Y2 || M.y2=Y1+y2) continue + // look for sub-regions with a defined ceiling + var/nz2=Z2?(Z2):Z1+z2-1+M.z2-M.z1 + if(M.x1>=X1+x2) + .=ConsiderRegion(X1,Y1,M.x1-1,Y2,Z1,nz2) + if(.) return + else if(M.x2<=X2-x2) + .=ConsiderRegion(M.x2+1,Y1,X2,Y2,Z1,nz2) + if(.) return + if(M.y1>=Y1+y2) + .=ConsiderRegion(X1,Y1,X2,M.y1-1,Z1,nz2) + if(.) return + else if(M.y2<=Y2-y2) + .=ConsiderRegion(X1,M.y2+1,X2,Y2,Z1,nz2) + if(.) return + nextz=nextz?min(nextz,M.z2+1):(M.z2+1) + if(!M) + /* If nextz is not 0, then at some point there was an overlap that + could not be resolved by using an area to the side */ + if(nextz) Z1=nextz + if(!nextz || (Z2 && Z2-Z1+1=z2)?list(X1,Y1,Z1):null + X1=1;X2=world.maxx + Y1=1;Y2=world.maxy + + proc/CutXYZ() + var/mx=swapmaps_compiled_maxx + var/my=swapmaps_compiled_maxy + var/mz=swapmaps_compiled_maxz + for(var/swapmap/M in swapmaps_loaded) // may not include src + mx=max(mx,M.x2) + my=max(my,M.y2) + mz=max(mz,M.z2) + world.maxx=mx + world.maxy=my + world.maxz=mz + + // save and delete + proc/Unload() + Save() + qdel(src) + + proc/Save() + if(id==src) return 0 + var/savefile/S=mode?(new):new("map_[id].sav") + S << src + while(locked) sleep(1) + if(mode) + fdel("map_[id].txt") + S.ExportText("/","map_[id].txt") + return 1 + + // this will not delete existing savefiles for this map + proc/SetID(newid) + swapmaps_byname-=id + id=newid + swapmaps_byname[id]=src + + proc/AllTurfs(z) + if(isnum(z) && (zz2)) return null + return block(LoCorner(z),HiCorner(z)) + + // this could be safely called for an obj or mob as well, but + // probably not an area + proc/Contains(turf/T) + return (T && T.x>=x1 && T.x<=x2\ + && T.y>=y1 && T.y<=y2\ + && T.z>=z1 && T.z<=z2) + + proc/InUse() + for(var/turf/T in AllTurfs()) + for(var/mob/M in T) if(M.key) return 1 + + proc/LoCorner(z=z1) + return locate(x1,y1,z) + proc/HiCorner(z=z2) + return locate(x2,y2,z) + + /* + Build procs: Take 2 turfs as corners, plus an item type. + An item may be like: + + /turf/wall + /obj/fence{icon_state="iron"} + */ + proc/BuildFilledRectangle(turf/T1,turf/T2,item) + if(!Contains(T1) || !Contains(T2)) return + var/turf/T=T1 + // pick new corners in a block()-friendly form + T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) + T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) + for(T in block(T1,T2)) new item(T) + + proc/BuildRectangle(turf/T1,turf/T2,item) + if(!Contains(T1) || !Contains(T2)) return + var/turf/T=T1 + // pick new corners in a block()-friendly form + T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) + T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) + if(T2.x-T1.x<2 || T2.y-T1.y<2) BuildFilledRectangle(T1,T2,item) + else + //for(T in block(T1,T2)-block(locate(T1.x+1,T1.y+1,T1.z),locate(T2.x-1,T2.y-1,T2.z))) + for(T in block(T1,locate(T2.x,T1.y,T2.z))) new item(T) + for(T in block(locate(T1.x,T2.y,T1.z),T2)) new item(T) + for(T in block(locate(T1.x,T1.y+1,T1.z),locate(T1.x,T2.y-1,T2.z))) new item(T) + for(T in block(locate(T2.x,T1.y+1,T1.z),locate(T2.x,T2.y-1,T2.z))) new item(T) + + /* + Supplementary build proc: Takes a list of turfs, plus an item + type. Actually the list doesn't have to be just turfs. + */ + proc/BuildInTurfs(list/turfs,item) + for(var/T in turfs) new item(T) + +atom + Write(savefile/S) + for(var/V in vars-"x"-"y"-"z"-"contents"-"icon"-"overlays"-"underlays") + if(issaved(vars[V])) + if(vars[V]!=initial(vars[V])) S[V]<>ic + if(istext(ic)) icon=swapmaps_iconcache[ic] + if(l && contents!=l) + contents+=l + qdel(l) + + +// set this up (at runtime) as follows: +// list(\ +// 'player.dmi'="player",\ +// 'monster.dmi'="monster",\ +// ... +// 'item.dmi'="item") +var/list/swapmaps_iconcache + +// preferred mode; sav or text +var/const/SWAPMAPS_SAV=0 +var/const/SWAPMAPS_TEXT=1 +var/swapmaps_mode=SWAPMAPS_SAV + +var/swapmaps_compiled_maxx +var/swapmaps_compiled_maxy +var/swapmaps_compiled_maxz +var/swapmaps_initialized +var/swapmaps_loaded +var/swapmaps_byname + +proc/InitializeSwapMaps() + if(swapmaps_initialized) return + swapmaps_initialized=1 + swapmaps_compiled_maxx=world.maxx + swapmaps_compiled_maxy=world.maxy + swapmaps_compiled_maxz=world.maxz + swapmaps_loaded=list() + swapmaps_byname=list() + if(swapmaps_iconcache) + for(var/V in swapmaps_iconcache) + // reverse-associate everything + // so you can look up an icon file by name or vice-versa + swapmaps_iconcache[swapmaps_iconcache[V]]=V + +proc/SwapMaps_AddIconToCache(name,icon) + if(!swapmaps_iconcache) swapmaps_iconcache=list() + swapmaps_iconcache[name]=icon + swapmaps_iconcache[icon]=name + +proc/SwapMaps_Find(id) + InitializeSwapMaps() + return swapmaps_byname[id] + +proc/SwapMaps_Load(id) + InitializeSwapMaps() + var/swapmap/M=swapmaps_byname[id] + if(!M) + var/savefile/S + var/text=0 + if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) + text=1 + else if(fexists("map_[id].sav")) + S=new("map_[id].sav") + else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) + text=1 + else return // no file found + if(text) + S=new + S.ImportText("/",file("map_[id].txt")) + S >> M + while(M.locked) sleep(1) + M.mode=text + return M + +proc/SwapMaps_Save(id) + InitializeSwapMaps() + var/swapmap/M=swapmaps_byname[id] + if(M) M.Save() + return M + +proc/SwapMaps_Save_All() + InitializeSwapMaps() + for(var/swapmap/M in swapmaps_loaded) + if(M) M.Save() + +proc/SwapMaps_Unload(id) + InitializeSwapMaps() + var/swapmap/M=swapmaps_byname[id] + if(!M) return // return silently from an error + M.Unload() + return 1 + +proc/SwapMaps_DeleteFile(id) + fdel("map_[id].sav") + fdel("map_[id].txt") + +proc/SwapMaps_CreateFromTemplate(template_id) + var/swapmap/M=new + var/savefile/S + var/text=0 + if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[template_id].txt")) + text=1 + else if(fexists("map_[template_id].sav")) + S=new("map_[template_id].sav") + else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt")) + text=1 + else + world.log << "SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found." + return + if(text) + S=new + S.ImportText("/",file("map_[template_id].txt")) + /* + This hacky workaround is needed because S >> M will create a brand new + M to fill with data. There's no way to control the Read() process + properly otherwise. The //.0 path should always match the map, however. + */ + S.cd="//.0" + M.Read(S,M) + M.mode=text + while(M.locked) sleep(1) + return M + +proc/SwapMaps_LoadChunk(chunk_id,turf/locorner) + var/swapmap/M=new + var/savefile/S + var/text=0 + if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) + text=1 + else if(fexists("map_[chunk_id].sav")) + S=new("map_[chunk_id].sav") + else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) + text=1 + else + world.log << "SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found." + return + if(text) + S=new + S.ImportText("/",file("map_[chunk_id].txt")) + /* + This hacky workaround is needed because S >> M will create a brand new + M to fill with data. There's no way to control the Read() process + properly otherwise. The //.0 path should always match the map, however. + */ + S.cd="//.0" + M.Read(S,M,locorner) + while(M.locked) sleep(1) + qdel(M) + return 1 + +proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2) + if(!corner1 || !corner2) + world.log << "SwapMaps error in SwapMaps_SaveChunk():" + if(!corner1) world.log << " corner1 turf is null" + if(!corner2) world.log << " corner2 turf is null" + return + var/swapmap/M=new + M.id=chunk_id + M.ischunk=1 // this is a chunk + M.x1=min(corner1.x,corner2.x) + M.y1=min(corner1.y,corner2.y) + M.z1=min(corner1.z,corner2.z) + M.x2=max(corner1.x,corner2.x) + M.y2=max(corner1.y,corner2.y) + M.z2=max(corner1.z,corner2.z) + M.mode=swapmaps_mode + M.Save() + while(M.locked) sleep(1) + qdel(M) + return 1 + +proc/SwapMaps_GetSize(id) + var/savefile/S + var/text=0 + if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) + text=1 + else if(fexists("map_[id].sav")) + S=new("map_[id].sav") + else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) + text=1 + else + world.log << "SwapMaps error in SwapMaps_GetSize(): map_[id] file not found." + return + if(text) + S=new + S.ImportText("/",file("map_[id].txt")) + /* + The //.0 path should always be the map. There's no other way to + read this data. + */ + S.cd="//.0" + var/x + var/y + var/z + S["x"] >> x + S["y"] >> y + S["z"] >> z + return list(x,y,z) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index c26c2eb9cd..758737f1a9 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -164,7 +164,7 @@ user << "The crate's anti-tamper system activates!" var/turf/T = get_turf(src.loc) explosion(T, 0, 0, 0, 1) - del(src) + qdel(src) return else user << "You attempt to interact with the device using a hand gesture, but it appears this crate is from before the DECANECT came out." diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index ee043b1441..bdb70368d2 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -18,7 +18,7 @@ if (machine) machine.console = src else - del(src) + qdel(src) /obj/machinery/mineral/processing_unit_console/attack_hand(mob/user) add_fingerprint(user) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 9dc23503ec..c0c03d815a 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -18,7 +18,7 @@ if (machine) machine.console = src else - del(src) + qdel(src) /obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user) add_fingerprint(user) @@ -85,7 +85,7 @@ var/obj/item/stack/S = new stacktype(src) stack_storage[S.name] = 0 stack_paths[S.name] = stacktype - del(S) + qdel(S) stack_storage["glass"] = 0 stack_paths["glass"] = /obj/item/stack/sheet/glass diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 698815d0a9..f616d57ac4 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -62,7 +62,7 @@ matter = list("metal" = 3750) var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = "materials=1;engineering=1" - attack_verb = list("hit", "pierced", "sliced", "attacked", "drilled") + attack_verb = list("hit", "pierced", "sliced", "attacked") var/drill_sound = 'sound/weapons/Genhit.ogg' var/drill_verb = "drilling" sharp = 1 @@ -107,6 +107,7 @@ digspeed = 20 origin_tech = "materials=4" desc = "This makes no metallurgic sense." + drill_verb = "picking" /obj/item/weapon/pickaxe/plasmacutter name = "plasma cutter" @@ -127,7 +128,8 @@ item_state = "dpickaxe" digspeed = 10 origin_tech = "materials=6;engineering=4" - desc = "A pickaxe with a diamond pick head, this is just like minecraft." + desc = "A pickaxe with a diamond pick head." + drill_verb = "picking" /obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME! name = "diamond mining drill" diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index c56bcde642..bb7d441515 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -319,7 +319,7 @@ if(!S || S.field_type != get_responsive_reagent(F.find_type)) if(X) visible_message("\red[pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") - del(X) + qdel(X) finds.Remove(F) @@ -507,7 +507,7 @@ ..() if(istype(M,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = M - if(istype(R.module, /obj/item/weapon/robot_module/miner)) + if(R.module) if(istype(R.module_state_1,/obj/item/weapon/storage/bag/ore)) attackby(R.module_state_1,R) else if(istype(R.module_state_2,/obj/item/weapon/storage/bag/ore)) diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index bcf46bb292..eabb0c3a67 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -42,22 +42,22 @@ if(O) if (istype(O,/obj/item/stack/sheet/mineral/gold)) amt_gold += 100 * O.get_amount() - del(O) + qdel(O) if (istype(O,/obj/item/stack/sheet/mineral/silver)) amt_silver += 100 * O.get_amount() - del(O) + qdel(O) if (istype(O,/obj/item/stack/sheet/mineral/diamond)) amt_diamond += 100 * O.get_amount() - del(O) + qdel(O) if (istype(O,/obj/item/stack/sheet/mineral/phoron)) amt_phoron += 100 * O.get_amount() - del(O) + qdel(O) if (istype(O,/obj/item/stack/sheet/mineral/uranium)) amt_uranium += 100 * O.get_amount() - del(O) + qdel(O) if (istype(O,/obj/item/stack/sheet/metal)) amt_iron += 100 * O.get_amount() - del(O) + qdel(O) /obj/machinery/mineral/mint/attack_hand(user as mob) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 5428f3f6c0..ce365bbde2 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -97,5 +97,5 @@ for (var/obj/item/weapon/ore/O in contents) O.loc = src.loc O.ex_act(severity++) - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm index cf51df634e..11c6c3c834 100644 --- a/code/modules/mob/dead/observer/logout.dm +++ b/code/modules/mob/dead/observer/logout.dm @@ -2,4 +2,4 @@ ..() spawn(0) if(src && !key) //we've transferred to another mob. This ghost should be deleted. - del(src) + qdel(src) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 81edcc84be..8c65d6e535 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -29,6 +29,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images var/image/ghostimage = null //this mobs ghost image, for deleting and stuff var/ghostvision = 1 //is the ghost able to see things humans can't? var/seedarkness = 1 + incorporeal_move = 1 /mob/dead/observer/New(mob/body) sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF @@ -80,10 +81,10 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images real_name = name ..() -/mob/dead/observer/Del() +/mob/dead/observer/Destroy() if (ghostimage) ghost_darkness_images -= ghostimage - del(ghostimage) + qdel(ghostimage) ghostimage = null updateallghostimages() ..() @@ -193,29 +194,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. announce_ghost_joinleave(ghost) - -/mob/dead/observer/Move(NewLoc, direct) - following = null - set_dir(direct) - if(NewLoc) - loc = NewLoc - for(var/obj/effect/step_trigger/S in NewLoc) - S.Crossed(src) - - return - loc = get_turf(src) //Get out of closets and such as a ghost - if((direct & NORTH) && y < world.maxy) - y++ - else if((direct & SOUTH) && y > 1) - y-- - if((direct & EAST) && x < world.maxx) - x++ - else if((direct & WEST) && x > 1) - x-- - - for(var/obj/effect/step_trigger/S in locate(x, y, z)) //<-- this is dumb - S.Crossed(src) - /mob/dead/observer/can_use_hands() return 0 /mob/dead/observer/is_active() return 0 @@ -309,11 +287,23 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!thearea) return var/list/L = list() - for(var/turf/T in get_area_turfs(thearea.type)) - L+=T + var/holyblock = 0 + + if(usr.invisibility <= SEE_INVISIBLE_LIVING || (usr.mind in cult.current_antagonists)) + for(var/turf/T in get_area_turfs(thearea.type)) + if(!T.holy) + L+=T + else + holyblock = 1 + else + for(var/turf/T in get_area_turfs(thearea.type)) + L+=T if(!L || !L.len) - usr << "No area available." + if(holyblock) + usr << "This area has been entirely made into sacred grounds, you cannot enter it while you are in this plane of existence!" + else + usr << "No area available." usr.loc = pick(L) following = null @@ -329,7 +319,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp // This is the ghost's follow verb with an argument /mob/dead/observer/proc/ManualFollow(var/atom/movable/target) - if(target && target != src) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + usr << "You cannot follow a mob standing on holy grounds!" + return + if(target != src) if(following && following == target) return following = target @@ -344,6 +341,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp loc = T sleep(15) +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/dead/observer/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN, 0, src)) + return 0 + + return (T && T.holy) && (invisibility <= SEE_INVISIBLE_LIVING || (mind in cult.current_antagonists)) + /mob/dead/observer/verb/jumptomob(target in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" set name = "Jump to Mob" @@ -386,6 +392,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set hidden = 1 src << "\red You are dead! You have no mind to store memory!" +/mob/dead/observer/Post_Incorpmove() + following = null + /mob/dead/observer/verb/analyze_air() set name = "Analyze Air" set category = "Ghost" @@ -466,6 +475,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src << browse(dat, "window=manifest;size=370x420;can_close=1") +//This is called when a ghost is drag clicked to something. +/mob/dead/observer/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + //Used for drawing on walls with blood puddles as a spooky ghost. /mob/dead/verb/bloody_doodle() @@ -573,7 +591,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp for(var/image/I in client.images) if(I.icon_state == icon) iconRemoved = 1 - del(I) + qdel(I) if(!iconRemoved) var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index be9f1615e0..6f7d99c616 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -18,7 +18,7 @@ /mob/dead/observer/emote(var/act, var/type, var/message) - message = sanitize(message) + //message = sanitize(message) - already sanitized in verb/me_verb() if(!message) return diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index a97d616dee..07cd8f19ff 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -19,8 +19,8 @@ if(do_gibs) gibs(loc, viruses, dna) spawn(15) - if(animation) del(animation) - if(src) del(src) + if(animation) qdel(animation) + if(src) qdel(src) //This is the proc for turning a mob into ash. Mostly a copy of gib code (above). //Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. @@ -43,8 +43,8 @@ dead_mob_list -= src spawn(15) - if(animation) del(animation) - if(src) del(src) + if(animation) qdel(animation) + if(src) qdel(src) /mob/proc/death(gibbed,deathmessage="seizes up and falls limp...") diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/freelook/ai/cameranet.dm similarity index 89% rename from code/modules/mob/living/silicon/ai/freelook/cameranet.dm rename to code/modules/mob/freelook/ai/cameranet.dm index d2d042c778..f29749b38c 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/freelook/ai/cameranet.dm @@ -2,10 +2,8 @@ // // The datum containing all the chunks. -var/datum/visualnet/camera/cameranet = new() - /datum/visualnet/camera - // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). + // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Destroy(). var/list/cameras = list() var/cameras_unsorted = 1 chunk_type = /datum/chunk/camera diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/freelook/ai/chunk.dm similarity index 100% rename from code/modules/mob/living/silicon/ai/freelook/chunk.dm rename to code/modules/mob/freelook/ai/chunk.dm diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/freelook/ai/eye.dm similarity index 88% rename from code/modules/mob/living/silicon/ai/freelook/eye.dm rename to code/modules/mob/freelook/ai/eye.dm index 8bc60b819d..c0a42ace48 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -36,11 +36,14 @@ eyeobj.owner = src eyeobj.name = "[src.name] (AI Eye)" // Give it a name spawn(5) - eyeobj.loc = src.loc + if(eyeobj) + eyeobj.loc = src.loc -/mob/living/silicon/ai/Del() - eyeobj.owner = null - del(eyeobj) // No AI, no Eye +/mob/living/silicon/ai/Destroy() + if(eyeobj) + eyeobj.owner = null + qdel(eyeobj) // No AI, no Eye + eyeobj = null ..() /atom/proc/move_camera_by_click() diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/freelook/ai/update_triggers.dm similarity index 93% rename from code/modules/mob/living/silicon/ai/freelook/update_triggers.dm rename to code/modules/mob/freelook/ai/update_triggers.dm index 828281567e..327b39fbf2 100644 --- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/ai/update_triggers.dm @@ -41,7 +41,7 @@ dd_insertObjectList(cameranet.cameras, src) update_coverage(1) -/obj/machinery/camera/Del() +/obj/machinery/camera/Destroy() cameranet.cameras -= src clear_all_networks() ..() diff --git a/code/modules/mob/freelook/chunk.dm b/code/modules/mob/freelook/chunk.dm index 8c6c7d043a..9b6b562df3 100644 --- a/code/modules/mob/freelook/chunk.dm +++ b/code/modules/mob/freelook/chunk.dm @@ -101,7 +101,7 @@ var/turf/t = turf if(obscuredTurfs[t]) if(!t.obfuscations[obfuscation.type]) - t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, 15) + t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) obscured += t.obfuscations[obfuscation.type] for(var/eye in seenby) @@ -140,7 +140,7 @@ for(var/turf in obscuredTurfs) var/turf/t = turf if(!t.obfuscations[obfuscation.type]) - t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, 15) + t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) obscured += t.obfuscations[obfuscation.type] #undef UPDATE_BUFFER diff --git a/code/modules/mob/freelook/eye.dm b/code/modules/mob/freelook/eye.dm index 70ae8cb700..bec261797d 100644 --- a/code/modules/mob/freelook/eye.dm +++ b/code/modules/mob/freelook/eye.dm @@ -12,6 +12,7 @@ var/sprint = 10 var/cooldown = 0 var/acceleration = 1 + var/owner_follows_eye = 0 see_in_dark = 7 status_flags = GODMODE @@ -30,17 +31,19 @@ updateallghostimages() ..() -mob/eye/Del() +mob/eye/Destroy() if (ghostimage) ghost_darkness_images -= ghostimage ghost_sightless_images -= ghostimage - del(ghostimage) - ghostimage = null; + qdel(ghostimage) + ghostimage = null updateallghostimages() ..() // Movement code. Returns 0 to stop air movement from moving it. -/mob/eye/Move() +/mob/eye/Move(n, direct) + if(owner == src) + EyeMove(n, direct) return 0 /mob/eye/examinate() @@ -60,15 +63,35 @@ mob/eye/Del() /mob/eye/proc/setLoc(var/T) if(owner) T = get_turf(T) - loc = T + if(T != loc) + loc = T - if(owner.client) - owner.client.eye = src + if(owner.client) + owner.client.eye = src - visualnet.visibility(src) - return 1 + if(owner_follows_eye) + visualnet.updateVisibility(owner, 0) + owner.loc = loc + visualnet.updateVisibility(owner, 0) + + visualnet.visibility(src) + return 1 return 0 +/mob/eye/proc/getLoc() + if(owner) + if(!isturf(owner.loc) || !owner.client) + return + return loc +/mob + var/mob/eye/eyeobj + +/mob/proc/EyeMove(n, direct) + if(!eyeobj) + return + + return eyeobj.EyeMove(n, direct) + /mob/eye/EyeMove(n, direct) var/initial = initial(sprint) var/max_sprint = 50 @@ -86,18 +109,3 @@ mob/eye/Del() sprint = min(sprint + 0.5, max_sprint) else sprint = initial - -/mob/eye/proc/getLoc() - if(owner) - if(!isturf(owner.loc) || !owner.client) - return - return loc - -/mob - var/mob/eye/eyeobj - -/mob/proc/EyeMove(n, direct) - if(!eyeobj) - return - - return eyeobj.EyeMove(n, direct) diff --git a/code/modules/mob/freelook/life.dm b/code/modules/mob/freelook/life.dm new file mode 100644 index 0000000000..1d1248e872 --- /dev/null +++ b/code/modules/mob/freelook/life.dm @@ -0,0 +1,7 @@ +/mob/eye/Life() + ..() + // If we lost our client, reset the list of visible chunks so they update properly on return + if(owner == src && !client) + visibleChunks.Cut() + /*else if(owner && !owner.client) + visibleChunks.Cut()*/ diff --git a/code/modules/mob/freelook/mask/chunk.dm b/code/modules/mob/freelook/mask/chunk.dm new file mode 100644 index 0000000000..b0973951cc --- /dev/null +++ b/code/modules/mob/freelook/mask/chunk.dm @@ -0,0 +1,39 @@ +// CULT CHUNK +// +// A 16x16 grid of the map with a list of turfs that can be seen, are visible and are dimmed. +// Allows the Eye to stream these chunks and know what it can and cannot see. + +/datum/obfuscation/cult + icon_state = "white" + +/datum/chunk/cult + obfuscation = new /datum/obfuscation/cult() + +/datum/chunk/cult/acquireVisibleTurfs(var/list/visible) + for(var/mob/living/L in living_mob_list) + for(var/turf/t in L.seen_turfs()) + visible[t] = t + +/mob/living/proc/seen_turfs() + return seen_turfs_in_range(src, 3) + +/mob/living/carbon/human/seen_turfs() + /*if(src.isSynthetic()) + return list()*/ + + if(mind in cult.current_antagonists) + return seen_turfs_in_range(src, client ? client.view : 7) + return ..() + +/mob/living/silicon/seen_turfs() + return list() + +/mob/living/simple_animal/seen_turfs() + return seen_turfs_in_range(src, 1) + +/mob/living/simple_animal/shade/narsie/seen_turfs() + return view(2, src) + +/proc/seen_turfs_in_range(var/source, var/range) + var/turf/pos = get_turf(source) + return hear(range, pos) diff --git a/code/modules/mob/freelook/mask/cultnet.dm b/code/modules/mob/freelook/mask/cultnet.dm new file mode 100644 index 0000000000..4e4e01b847 --- /dev/null +++ b/code/modules/mob/freelook/mask/cultnet.dm @@ -0,0 +1,15 @@ +// CULT NET +// +// The datum containing all the chunks. + +/datum/visualnet/cult + chunk_type = /datum/chunk/cult + +/datum/visualnet/cult/proc/provides_vision(var/mob/living/L) + return L.provides_cult_vision() + +/mob/living/proc/provides_cult_vision() + return 1 + +/mob/living/silicon/provides_cult_vision() + return 0 diff --git a/code/modules/mob/freelook/mask/eye.dm b/code/modules/mob/freelook/mask/eye.dm new file mode 100644 index 0000000000..a0a9960322 --- /dev/null +++ b/code/modules/mob/freelook/mask/eye.dm @@ -0,0 +1,13 @@ +// MASK EYE +// +// A mob that a cultists controls to look around the station with. +// It streams chunks as it moves around, which will show it what the cultist can and cannot see. + +/mob/eye/maskEye + name = "Eye of Nar-Sie" + acceleration = 0 + owner_follows_eye = 1 + +/mob/eye/maskEye/New() + ..() + visualnet = cultnet diff --git a/code/modules/mob/freelook/mask/update_triggers.dm b/code/modules/mob/freelook/mask/update_triggers.dm new file mode 100644 index 0000000000..a8e68058fd --- /dev/null +++ b/code/modules/mob/freelook/mask/update_triggers.dm @@ -0,0 +1,50 @@ +//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update. + +#define CULT_UPDATE_BUFFER 30 + +/mob/living/var/updating_cult_vision = 0 + +/mob/living/Move() + var/oldLoc = src.loc + . = ..() + if(.) + if(cultnet.provides_vision(src)) + if(!updating_cult_vision) + updating_cult_vision = 1 + spawn(CULT_UPDATE_BUFFER) + if(oldLoc != src.loc) + cultnet.updateVisibility(oldLoc, 0) + cultnet.updateVisibility(loc, 0) + updating_cult_vision = 0 + +#undef CULT_UPDATE_BUFFER + +/mob/living/New() + ..() + cultnet.updateVisibility(src, 0) + +/mob/living/Destroy() + cultnet.updateVisibility(src, 0) + ..() + +/mob/living/rejuvenate() + var/was_dead = stat == DEAD + ..() + if(was_dead && stat != DEAD) + // Arise! + cultnet.updateVisibility(src, 0) + +/mob/living/death(gibbed, deathmessage="seizes up and falls limp...") + if(..()) + // If true, the mob went from living to dead (assuming everyone has been overriding as they should...) + cultnet.updateVisibility(src) + +/datum/antagonist/add_antagonist(var/datum/mind/player) + ..() + if(src == cult) + cultnet.updateVisibility(player.current, 0) + +/datum/antagonist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) + ..() + if(src == cult) + cultnet.updateVisibility(player.current, 0) diff --git a/code/modules/mob/living/silicon/ai/freelook/read_me.dm b/code/modules/mob/freelook/read_me.dm similarity index 96% rename from code/modules/mob/living/silicon/ai/freelook/read_me.dm rename to code/modules/mob/freelook/read_me.dm index 53e68ff137..8ddb068940 100644 --- a/code/modules/mob/living/silicon/ai/freelook/read_me.dm +++ b/code/modules/mob/freelook/read_me.dm @@ -20,7 +20,7 @@ HOW IT WORKS It works by first creating a camera network datum. Inside of this camera network are "chunks" (which will be - explained later) and "cameras". The cameras list is kept up to date by obj/machinery/camera/New() and Del(). + explained later) and "cameras". The cameras list is kept up to date by obj/machinery/camera/New() and Destroy(). Next the camera network has chunks. These chunks are a 16x16 tile block of turfs and cameras contained inside the chunk. These turfs are then sorted out based on what the cameras can and cannot see. If none of the cameras can see the turf, inside diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm index 9bba162c40..8408083ba8 100644 --- a/code/modules/mob/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/update_triggers.dm @@ -13,7 +13,7 @@ /turf/drain_power() return -1 -/turf/simulated/Del() +/turf/simulated/Destroy() updateVisibility(src) ..() @@ -24,7 +24,7 @@ // STRUCTURES -/obj/structure/Del() +/obj/structure/Destroy() updateVisibility(src) ..() @@ -34,9 +34,9 @@ // EFFECTS -/obj/effect/Del() +/obj/effect/Destroy() updateVisibility(src) - ..() + return ..() /obj/effect/New() ..() diff --git a/code/modules/mob/freelook/visualnet.dm b/code/modules/mob/freelook/visualnet.dm index dedc23ab2d..38cb5bb3d2 100644 --- a/code/modules/mob/freelook/visualnet.dm +++ b/code/modules/mob/freelook/visualnet.dm @@ -2,8 +2,6 @@ // // The datum containing all the chunks. -var/global/list/visual_nets = new() - /datum/visualnet // The chunks of the map, mapping the areas that an object can see. var/list/chunks = list() @@ -14,7 +12,7 @@ var/global/list/visual_nets = new() ..() visual_nets += src -/datum/visualnet/Del() +/datum/visualnet/Destroy() visual_nets -= src ..() diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 5e7fbe438d..6347a091f4 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -11,7 +11,7 @@ ..() processing_objects.Add(src) -/obj/item/weapon/holder/Del() +/obj/item/weapon/holder/Destroy() processing_objects.Remove(src) ..() @@ -26,7 +26,7 @@ mob_container.forceMove(get_turf(src)) M.reset_view() - del(src) + qdel(src) /obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob) for(var/mob/M in src.contents) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 0d20e00166..5a5e7d1044 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -20,7 +20,7 @@ if(!W.mob_can_equip(src, slot)) if(del_on_fail) - del(W) + qdel(W) else if(!disable_warning) src << "\red You are unable to equip that." //Only print if del_on_fail is false @@ -58,6 +58,10 @@ var/list/slot_equipment_priority = list( \ slot_r_store\ ) +//Checks if a given slot can be accessed at this time, either to equip or unequip I +/mob/proc/slot_is_accessible(var/slot, var/obj/item/I, mob/user=null) + return 1 + //puts the item "W" into an appropriate slot in a human's inventory //returns 0 if it cannot, 1 if successful /mob/proc/equip_to_appropriate_slot(obj/item/W) @@ -143,7 +147,8 @@ var/list/slot_equipment_priority = list( \ W.dropped() return 0 -// Removes an item from inventory and places it in the target atom +// Removes an item from inventory and places it in the target atom. +// If canremove or other conditions need to be checked then use unEquip instead. /mob/proc/drop_from_inventory(var/obj/item/W, var/atom/Target = null) if(W) if(!Target) @@ -196,15 +201,21 @@ var/list/slot_equipment_priority = list( \ update_inv_wear_mask(0) return -//This differs from remove_from_mob() in that it checks canremove first. +//This differs from remove_from_mob() in that it checks if the item can be unequipped first. /mob/proc/unEquip(obj/item/I, force = 0) //Force overrides NODROP for things like wizarditis and admin undress. if(!I) //If there's nothing to drop, the drop is automatically successful. return 1 - if(!I.canremove && !force) + var/slot + for(var/s in slot_back to slot_tie) //kind of worries me + if(get_equipped_item(s) == I) + slot = s + break + + if(slot && !I.mob_can_unequip(src, slot)) return 0 - remove_from_mob(I) + drop_from_inventory(I) return 1 //Attemps to remove an object on a mob. Will not move it to another area or such, just removes from the mob. @@ -220,6 +231,15 @@ var/list/slot_equipment_priority = list( \ return 1 +//Returns the item equipped to the specified slot, if any. +/mob/proc/get_equipped_item(var/slot) + switch(slot) + if(slot_l_hand) return l_hand + if(slot_r_hand) return r_hand + if(slot_back) return back + if(slot_wear_mask) return wear_mask + return null + //Outdated but still in use apparently. This should at least be a human proc. /mob/proc/get_equipped_items() var/list/items = new/list() diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index d2cb8a82ab..bf5b51a1b1 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -134,6 +134,12 @@ . = (L in languages) languages.Remove(L) +/mob/living/remove_language(rem_language) + var/datum/language/L = all_languages[rem_language] + if(default_language == L) + default_language = null + return ..() + // Can we speak this language, as opposed to just understanding it? /mob/proc/can_speak(datum/language/speaking) @@ -154,4 +160,32 @@ src << browse(dat, "window=checklanguage") return +/mob/living/check_languages() + var/dat = "Known Languages

        " + + if(default_language) + dat += "Current default language: [default_language] - reset

        " + + for(var/datum/language/L in languages) + if(!(L.flags & NONGLOBAL)) + if(L == default_language) + dat += "[L.name] (:[L.key]) - default - reset
        [L.desc]

        " + else + dat += "[L.name] (:[L.key]) - set default
        [L.desc]

        " + + src << browse(dat, "window=checklanguage") + +/mob/living/Topic(href, href_list) + if(href_list["default_lang"]) + if(href_list["default_lang"] == "reset") + set_default_language(null) + else + var/datum/language/L = all_languages[href_list["default_lang"]] + if(L) + set_default_language(L) + check_languages() + return 1 + else + return ..() + #undef SCRAMBLE_CACHE_LEN diff --git a/code/modules/mob/living/blob/blob.dm b/code/modules/mob/living/blob/blob.dm index 2b82ccbedb..8bbf517e60 100644 --- a/code/modules/mob/living/blob/blob.dm +++ b/code/modules/mob/living/blob/blob.dm @@ -246,7 +246,7 @@ B << "To create this node you will have to be on a normal blob tile and far enough away from any other node." B << "Check your Blob verbs and hit Create Node to build a node." spawn(10) - del(G_found) + qdel(G_found) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm new file mode 100644 index 0000000000..b9f8c9b4df --- /dev/null +++ b/code/modules/mob/living/bot/bot.dm @@ -0,0 +1,123 @@ +/mob/living/bot + name = "Bot" + health = 20 + maxHealth = 20 + icon = 'icons/obj/aibots.dmi' + layer = MOB_LAYER + universal_speak = 1 + density = 0 + var/obj/item/weapon/card/id/botcard = null + var/list/botcard_access = list() + var/on = 1 + var/open = 0 + var/locked = 1 + var/emagged = 0 + var/light_strength = 3 + + var/obj/access_scanner = null + var/list/req_access = list() + +/mob/living/bot/New() + ..() + update_icons() + + botcard = new /obj/item/weapon/card/id(src) + botcard.access = botcard_access.Copy() + + access_scanner = new /obj(src) + access_scanner.req_access = req_access.Copy() + +/mob/living/bot/Life() + ..() + weakened = 0 + stunned = 0 + paralysis = 0 + if(health <= 0) + death() + +/mob/living/bot/updatehealth() + if(status_flags & GODMODE) + health = maxHealth + stat = CONSCIOUS + else + health = maxHealth - getFireLoss() - getBruteLoss() + oxyloss = 0 + toxloss = 0 + cloneloss = 0 + halloss = 0 + +/mob/living/bot/death() + explode() + +/mob/living/bot/attackby(var/obj/item/O, var/mob/user) + if(O.GetID()) + if(access_scanner.allowed(user) && !open && !emagged) + locked = !locked + user << "Controls are now [locked ? "locked." : "unlocked."]" + attack_hand(user) + else + if(emagged) + user << "ERROR" + if(open) + user << "Please close the access panel before locking it." + else + user << "Access denied." + return + else if(istype(O, /obj/item/weapon/screwdriver)) + if(!locked) + open = !open + user << "Maintenance panel is now [open ? "opened" : "closed"]." + else + user << "You need to unlock the controls first." + return + else if(istype(O, /obj/item/weapon/weldingtool)) + if(health < maxHealth) + if(open) + health = min(maxHealth, health + 10) + user.visible_message("[user] repairs [src].","You repair [src].") + else + user << "Unable to repair with the maintenance panel closed." + else + user << "[src] does not need a repair." + return + else if (istype(O, /obj/item/weapon/card/emag) && !emagged) + Emag(user) + return + else + ..() + +/mob/living/bot/attack_ai(var/mob/user) + return attack_hand(user) + +/mob/living/bot/say(var/message) + var/verb = "beeps" + + message = sanitize(message) + + ..(message, null, verb) + +/mob/living/bot/Bump(var/atom/A) + if(istype(A, /obj/machinery/door) && botcard) + var/obj/machinery/door/D = A + if(!istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && D.check_access(botcard)) + D.open() + +/mob/living/bot/proc/Emag(var/mob/user) + log_and_message_admins("emagged [src]") + return + +/mob/living/bot/proc/turn_on() + if(stat) + return 0 + on = 1 + SetLuminosity(light_strength) + update_icons() + return 1 + +/mob/living/bot/proc/turn_off() + on = 0 + SetLuminosity(0) + update_icons() + +/mob/living/bot/proc/explode() + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm new file mode 100644 index 0000000000..fa28343547 --- /dev/null +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -0,0 +1,306 @@ +/mob/living/bot/cleanbot + name = "Cleanbot" + desc = "A little cleaning robot, he looks so excited!" + icon_state = "cleanbot0" + req_access = list(access_janitor) + botcard_access = list(access_janitor, access_maint_tunnels) + + locked = 0 // Start unlocked so roboticist can set them to patrol. + + var/obj/effect/decal/cleanable/target + var/list/path = list() + var/list/patrol_path = list() + var/list/ignorelist = list() + + var/obj/cleanbot_listener/listener = null + var/beacon_freq = 1445 // navigation beacon frequency + var/signal_sent = 0 + var/closest_dist + var/next_dest + var/next_dest_loc + + var/cleaning = 0 + var/screwloose = 0 + var/oddbutton = 0 + var/should_patrol = 0 + var/blood = 1 + var/list/target_types = list() + +/mob/living/bot/cleanbot/New() + ..() + get_targets() + + listener = new /obj/cleanbot_listener(src) + listener.cleanbot = src + + if(radio_controller) + radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS) + +/mob/living/bot/cleanbot/Life() + ..() + + if(!on) + return + + if(client) + return + if(cleaning) + return + + if(!screwloose && !oddbutton && prob(5)) + custom_emote(2, "makes an excited beeping booping sound!") + + if(screwloose && prob(5)) // Make a mess + if(istype(loc, /turf/simulated)) + var/turf/simulated/T = loc + if(T.wet < 1) + T.wet = 1 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + T.wet_overlay = image('icons/effects/water.dmi', T, "wet_floor") + T.overlays += T.wet_overlay + spawn(800) + if(istype(T) && T.wet < 2) + T.wet = 0 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + + if(oddbutton && prob(5)) // Make a big mess + visible_message("Something flies out of [src]. He seems to be acting oddly.") + var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(loc) + ignorelist += gib + spawn(600) + ignorelist -= gib + + if(!target) // Find a target + for(var/obj/effect/decal/cleanable/D in view(7, src)) + if(D in ignorelist) + continue + for(var/T in target_types) + if(istype(D, T)) + target = D + patrol_path = list() + + if(!target) // No targets in range + if(!should_patrol) + return + + if(!patrol_path || !patrol_path.len) + if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet + var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) + if(!frequency) + return + + closest_dist = 9999 + next_dest = null + next_dest_loc = null + + var/datum/signal/signal = new() + signal.source = src + signal.transmission_method = 1 + signal.data = list("findbeakon" = "patrol") + frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) + signal_sent = world.time + else + if(next_dest) + next_dest_loc = listener.memorized[next_dest] + if(next_dest_loc) + patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) + signal_sent = 0 + else + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() + return + if(patrol_path[1] == loc) + patrol_path -= patrol_path[1] + var/moved = step_towards(src, patrol_path[1]) + if(moved) + patrol_path -= patrol_path[1] + if(target) + if(loc == target.loc) + if(!cleaning) + UnarmedAttack(target) + return + if(!path.len) + spawn(0) + path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + path = list() + return + if(path.len) + step_to(src, path[1]) + path -= path[1] + return + +/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) + if(!..()) + return + + if(!istype(D)) + return + + if(D.loc != loc) + return + + cleaning = 1 + custom_emote(2, "begins to clean up the [D]") + update_icons() + var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 + if(do_after(src, cleantime)) + if(istype(loc, /turf/simulated)) + var/turf/simulated/f = loc + f.dirt = 0 + if(!D) + return + qdel(D) + cleaning = 0 + update_icons() + +/mob/living/bot/cleanbot/explode() + on = 0 + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) + + new /obj/item/weapon/reagent_containers/glass/bucket(Tsec) + new /obj/item/device/assembly/prox_sensor(Tsec) + if(prob(50)) + new /obj/item/robot_parts/l_arm(Tsec) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + qdel(src) + return + +/mob/living/bot/cleanbot/update_icons() + if(cleaning) + icon_state = "cleanbot-c" + else + icon_state = "cleanbot[on]" + +/mob/living/bot/cleanbot/turn_off() + ..() + target = null + path = list() + patrol_path = list() + +/mob/living/bot/cleanbot/attack_hand(var/mob/user) + var/dat + dat += "Automatic Station Cleaner v1.0

        " + dat += "Status: [on ? "On" : "Off"]
        " + dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
        " + dat += "Maintenance panel is [open ? "opened" : "closed"]" + if(!locked || issilicon(user)) + dat += "
        Cleans Blood: [blood ? "Yes" : "No"]
        " + dat += "
        Patrol station: [should_patrol ? "Yes" : "No"]
        " + if(open && !locked) + dat += "Odd looking screw twiddled: [screwloose ? "Yes" : "No"]
        " + dat += "Weird button pressed: [oddbutton ? "Yes" : "No"]" + + user << browse("Cleaner v1.0 controls[dat]", "window=autocleaner") + onclose(user, "autocleaner") + return + +/mob/living/bot/cleanbot/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + add_fingerprint(usr) + switch(href_list["operation"]) + if("start") + if(on) + turn_off() + else + turn_on() + if("blood") + blood = !blood + get_targets() + if("patrol") + should_patrol = !should_patrol + patrol_path = null + if("freq") + var/freq = text2num(input("Select frequency for navigation beacons", "Frequnecy", num2text(beacon_freq / 10))) * 10 + if (freq > 0) + beacon_freq = freq + if("screw") + screwloose = !screwloose + usr << "You press the weird button." + attack_hand(usr) + +/mob/living/bot/cleanbot/Emag(var/mob/user) + ..() + if(user) + user << "The [src] buzzes and beeps." + oddbutton = 1 + screwloose = 1 + +/mob/living/bot/cleanbot/proc/get_targets() + target_types = list() + + target_types += /obj/effect/decal/cleanable/blood/oil + target_types += /obj/effect/decal/cleanable/vomit + target_types += /obj/effect/decal/cleanable/crayon + target_types += /obj/effect/decal/cleanable/liquid_fuel + target_types += /obj/effect/decal/cleanable/mucus + target_types += /obj/effect/decal/cleanable/dirt + + if(blood) + target_types += /obj/effect/decal/cleanable/blood + +/* Radio object that listens to signals */ + +/obj/cleanbot_listener + var/mob/living/bot/cleanbot/cleanbot = null + var/list/memorized = list() + +/obj/cleanbot_listener/receive_signal(var/datum/signal/signal) + var/recv = signal.data["beacon"] + var/valid = signal.data["patrol"] + if(!recv || !valid || !cleanbot) + return + + var/dist = get_dist(cleanbot, signal.source.loc) + memorized[recv] = signal.source.loc + + if(dist < cleanbot.closest_dist) // We check all signals, choosing the closest beakon; then we move to the NEXT one after the closest one + cleanbot.closest_dist = dist + cleanbot.next_dest = signal.data["next_patrol"] + +/* Assembly */ + +/obj/item/weapon/bucket_sensor + desc = "It's a bucket. With a sensor attached." + name = "proxy bucket" + icon = 'icons/obj/aibots.dmi' + icon_state = "bucket_proxy" + force = 3.0 + throwforce = 10.0 + throw_speed = 2 + throw_range = 5 + w_class = 3.0 + var/created_name = "Cleanbot" + +/obj/item/weapon/bucket_sensor/attackby(var/obj/item/O, var/mob/user) + ..() + if(istype(O, /obj/item/robot_parts/l_arm) || istype(O, /obj/item/robot_parts/r_arm)) + user.drop_item() + qdel(O) + var/turf/T = get_turf(loc) + var/mob/living/bot/cleanbot/A = new /mob/living/bot/cleanbot(T) + A.name = created_name + user << "You add the robot arm to the bucket and sensor assembly. Beep boop!" + user.drop_from_inventory(src) + qdel(src) + + else if(istype(O, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && src.loc != usr) + return + created_name = t diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm new file mode 100644 index 0000000000..78262f58ec --- /dev/null +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -0,0 +1,192 @@ +/mob/living/bot/secbot/ed209 + name = "ED-209 Security Robot" + desc = "A security robot. He looks less than thrilled." + icon = 'icons/obj/aibots.dmi' + icon_state = "ed2090" + density = 1 + health = 100 + maxHealth = 100 + + bot_version = "2.5" + is_ranged = 1 + preparing_arrest_sounds = new() + + var/shot_delay = 4 + var/last_shot = 0 + +/mob/living/bot/secbot/ed209/update_icons() + if(on && is_attacking) + icon_state = "ed209-c" + else + icon_state = "ed209[on]" + +/mob/living/bot/secbot/ed209/explode() + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) + + new /obj/item/weapon/secbot_assembly/ed209_assembly(Tsec) + + var/obj/item/weapon/gun/energy/taser/G = new /obj/item/weapon/gun/energy/taser(Tsec) + G.power_supply.charge = 0 + if(prob(50)) + new /obj/item/robot_parts/l_leg(Tsec) + if(prob(50)) + new /obj/item/robot_parts/r_leg(Tsec) + if(prob(50)) + if(prob(50)) + new /obj/item/clothing/head/helmet(Tsec) + else + new /obj/item/clothing/suit/armor/vest(Tsec) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + + new /obj/effect/decal/cleanable/blood/oil(Tsec) + qdel(src) + +/mob/living/bot/secbot/ed209/RangedAttack(var/atom/A) + if(last_shot + shot_delay > world.time) + src << "You are not ready to fire yet!" + return + + last_shot = world.time + var/turf/T = get_turf(src) + var/turf/U = get_turf(A) + + var/projectile = /obj/item/projectile/beam/stun + if(emagged) + projectile = /obj/item/projectile/beam + + playsound(loc, emagged ? 'sound/weapons/Laser.ogg' : 'sound/weapons/Taser.ogg', 50, 1) + var/obj/item/projectile/P = new projectile(loc) + + P.original = A + P.starting = T + P.current = T + P.yo = U.y - T.y + P.xo = U.x - T.x + spawn() + P.process() + return + +// Assembly + +/obj/item/weapon/secbot_assembly/ed209_assembly + name = "ED-209 assembly" + desc = "Some sort of bizarre assembly." + icon = 'icons/obj/aibots.dmi' + icon_state = "ed209_frame" + item_state = "ed209_frame" + created_name = "ED-209 Security Robot" + var/lasercolor = "" + +/obj/item/weapon/secbot_assembly/ed209_assembly/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + ..() + + if(istype(W, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && src.loc != usr) + return + created_name = t + return + + switch(build_step) + if(0, 1) + if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg)) + user.drop_item() + qdel(W) + build_step++ + user << "You add the robot leg to [src]." + name = "legs/frame assembly" + if(build_step == 1) + item_state = "ed209_leg" + icon_state = "ed209_leg" + else + item_state = "ed209_legs" + icon_state = "ed209_legs" + + if(2) + if(istype(W, /obj/item/clothing/suit/storage/vest)) + user.drop_item() + qdel(W) + build_step++ + user << "You add the armor to [src]." + name = "vest/legs/frame assembly" + item_state = "ed209_shell" + icon_state = "ed209_shell" + + if(3) + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) + build_step++ + name = "shielded frame assembly" + user << "You welded the vest to [src]." + if(4) + if(istype(W, /obj/item/clothing/head/helmet)) + user.drop_item() + qdel(W) + build_step++ + user << "You add the helmet to [src]." + name = "covered and shielded frame assembly" + item_state = "ed209_hat" + icon_state = "ed209_hat" + + if(5) + if(isprox(W)) + user.drop_item() + qdel(W) + build_step++ + user << "You add the prox sensor to [src]." + name = "covered, shielded and sensored frame assembly" + item_state = "ed209_prox" + icon_state = "ed209_prox" + + if(6) + if(istype(W, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = W + if (C.get_amount() < 1) + user << "You need one coil of wire to wire [src]." + return + user << "You start to wire [src]." + if(do_after(user, 40) && build_step == 6) + if(C.use(1)) + build_step++ + user << "You wire the ED-209 assembly." + name = "wired ED-209 assembly" + return + + if(7) + if(istype(W, /obj/item/weapon/gun/energy/taser)) + name = "taser ED-209 assembly" + build_step++ + user << "You add [W] to [src]." + item_state = "ed209_taser" + icon_state = "ed209_taser" + user.drop_item() + qdel(W) + + if(8) + if(istype(W, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + var/turf/T = get_turf(user) + user << "Now attaching the gun to the frame..." + sleep(40) + if(get_turf(user) == T && build_step == 8) + build_step++ + name = "armed [name]" + user << "Taser gun attached." + + if(9) + if(istype(W, /obj/item/weapon/cell)) + build_step++ + user << "You complete the ED-209." + var/turf/T = get_turf(src) + new /mob/living/bot/secbot/ed209(T,created_name,lasercolor) + user.drop_item() + qdel(W) + user.drop_from_inventory(src) + qdel(src) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm new file mode 100644 index 0000000000..f1c84f3866 --- /dev/null +++ b/code/modules/mob/living/bot/farmbot.dm @@ -0,0 +1,359 @@ +#define FARMBOT_COLLECT 1 +#define FARMBOT_WATER 2 +#define FARMBOT_UPROOT 3 +#define FARMBOT_NUTRIMENT 4 + +/mob/living/bot/farmbot + name = "Farmbot" + desc = "The botanist's best friend." + icon = 'icons/obj/aibots.dmi' + icon_state = "farmbot0" + health = 50 + maxHealth = 50 + req_access = list(access_hydroponics) + + var/action = "" // Used to update icon + var/waters_trays = 1 + var/refills_water = 1 + var/uproots_weeds = 1 + var/replaces_nutriment = 0 + var/collects_produce = 0 + var/removes_dead = 0 + + var/obj/structure/reagent_dispensers/watertank/tank + + var/attacking = 0 + var/list/path = list() + var/atom/target + var/frustration = 0 + +/mob/living/bot/farmbot/New() + ..() + spawn(5) + tank = locate() in contents + if(!tank) + tank = new /obj/structure/reagent_dispensers/watertank(src) + +/mob/living/bot/farmbot/attack_hand(var/mob/user as mob) + . = ..() + if(.) + return + var/dat = "" + dat += "Automatic Hyrdoponic Assisting Unit v1.0

        " + dat += "Status: [on ? "On" : "Off"]
        " + dat += "Water Tank: " + if (tank) + dat += "[tank.reagents.total_volume]/[tank.reagents.maximum_volume]" + else + dat += "Error: Watertank not found" + dat += "
        Behaviour controls are [locked ? "locked" : "unlocked"]
        " + if(!locked) + dat += "Watering controls:
        " + dat += "Water plants : [waters_trays ? "Yes" : "No"]
        " + dat += "Refill watertank : [refills_water ? "Yes" : "No"]
        " + dat += "
        Weeding controls:
        " + dat += "Weed plants: [uproots_weeds ? "Yes" : "No"]
        " + dat += "
        Nutriment controls:
        " + dat += "Replace fertilizer: [replaces_nutriment ? "Yes" : "No"]
        " + dat += "
        Plant controls:
        " + dat += "Collect produce: [collects_produce ? "Yes" : "No"]
        " + dat += "Remove dead plants: [removes_dead ? "Yes" : "No"]
        " + dat += "
        " + + user << browse("Farmbot v1.0 controls[dat]", "window=autofarm") + onclose(user, "autofarm") + return + +/mob/living/bot/farmbot/Emag(var/mob/user) + ..() + if(user) + user << "You short out [src]'s plant identifier circuits." + spawn(rand(30, 50)) + visible_message("[src] buzzes oddly.") + emagged = 1 + +/mob/living/bot/farmbot/Topic(href, href_list) + if(..()) + return + usr.machine = src + add_fingerprint(usr) + if((href_list["power"]) && (access_scanner.allowed(usr))) + if(on) + turn_off() + else + turn_on() + + if(locked) + return + + if(href_list["water"]) + waters_trays = !waters_trays + else if(href_list["refill"]) + refills_water = !refills_water + else if(href_list["weed"]) + uproots_weeds = !uproots_weeds + else if(href_list["replacenutri"]) + replaces_nutriment = !replaces_nutriment + else if(href_list["collect"]) + collects_produce = !collects_produce + else if(href_list["removedead"]) + removes_dead = !removes_dead + + attack_hand(usr) + return + +/mob/living/bot/farmbot/update_icons() + if(on && action) + icon_state = "farmbot_[action]" + else + icon_state = "farmbot[on]" + +/mob/living/bot/farmbot/Life() + ..() + if(!on) + return + if(emagged && prob(1)) + flick("farmbot_broke", src) + if(client) + return + + if(target) + if(Adjacent(target)) + UnarmedAttack(target) + path = list() + target = null + else + if(path.len && frustration < 5) + if(path[1] == loc) + path -= path[1] + var/t = step_towards(src, path[1]) + if(t) + path -= path[1] + else + ++frustration + else + path = list() + target = null + else + if(emagged) + for(var/mob/living/carbon/human/H in view(7, src)) + target = H + break + else + for(var/obj/machinery/portable_atmospherics/hydroponics/tray in view(7, src)) + if(process_tray(tray)) + target = tray + frustration = 0 + break + if(!target && refills_water && tank && tank.reagents.total_volume < tank.reagents.maximum_volume) + for(var/obj/structure/sink/source in view(7, src)) + target = source + frustration = 0 + break + if(target) + var/t = get_dir(target, src) // Turf with the tray is impassable, so a* can't navigate directly to it + path = AStar(loc, get_step(target, t), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + path = list() + +/mob/living/bot/farmbot/UnarmedAttack(var/atom/A, var/proximity) + if(!..()) + return + if(attacking) + return + + if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) + var/obj/machinery/portable_atmospherics/hydroponics/T = A + var/t = process_tray(T) + switch(t) + if(0) + return + if(FARMBOT_COLLECT) + action = "water" // Needs a better one + update_icons() + visible_message("[src] starts [T.dead? "removing the plant from" : "harvesting"] \the [A].") + attacking = 1 + if(do_after(src, 30)) + visible_message("[src] [T.dead? "removes the plant from" : "harvests"] \the [A].") + T.attack_hand(src) + if(FARMBOT_WATER) + action = "water" + update_icons() + visible_message("[src] starts watering \the [A].") + attacking = 1 + if(do_after(src, 30)) + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + visible_message("[src] waters \the [A].") + tank.reagents.trans_to(T, 100 - T.waterlevel) + if(FARMBOT_UPROOT) + action = "hoe" + update_icons() + visible_message("[src] starts uprooting the weeds in \the [A].") + attacking = 1 + if(do_after(src, 30)) + visible_message("[src] uproots the weeds in \the [A].") + T.weedlevel = 0 + if(FARMBOT_NUTRIMENT) + action = "fertile" + update_icons() + visible_message("[src] starts fertilizing \the [A].") + attacking = 1 + if(do_after(src, 30)) + visible_message("[src] waters \the [A].") + T.reagents.add_reagent("ammonia", 10) + attacking = 0 + action = "" + update_icons() + T.update_icon() + else if(istype(A, /obj/structure/sink)) + if(!tank || tank.reagents.total_volume >= tank.reagents.maximum_volume) + return + action = "water" + update_icons() + visible_message("[src] starts refilling its tank from \the [A].") + attacking = 1 + while(do_after(src, 10) && tank.reagents.total_volume < tank.reagents.maximum_volume) + tank.reagents.add_reagent("water", 10) + if(prob(5)) + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + attacking = 0 + action = "" + update_icons() + visible_message("[src] finishes refilling its tank.") + else if(emagged && ishuman(A)) + var/action = pick("weed", "water") + attacking = 1 + spawn(50) // Some delay + attacking = 0 + switch(action) + if("weed") + flick("farmbot_hoe", src) + if(prob(50)) + visible_message("[src] swings wildly at [A] with a minihoe, missing completely!") + return + var/t = pick("slashed", "sliced", "cut", "clawed") + A.attack_generic(src, 5, t) + if("water") + flick("farmbot_water", src) + visible_message("[src] splashes [A] with water!") // That's it. RP effect. + +/mob/living/bot/farmbot/explode() + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) + + new /obj/item/weapon/minihoe(Tsec) + new /obj/item/weapon/reagent_containers/glass/bucket(Tsec) + new /obj/item/device/assembly/prox_sensor(Tsec) + new /obj/item/device/analyzer/plant_analyzer(Tsec) + + if(tank) + tank.loc = Tsec + + if(prob(50)) + new /obj/item/robot_parts/l_arm(Tsec) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + qdel(src) + return + +/mob/living/bot/farmbot/proc/process_tray(var/obj/machinery/portable_atmospherics/hydroponics/tray) + if(!tray || !istype(tray)) + return 0 + + if(tray.closed_system || !tray.seed) + return 0 + + if(tray.dead && removes_dead || tray.harvest && collects_produce) + return FARMBOT_COLLECT + + else if(refills_water && tray.waterlevel < 40 && !tray.reagents.has_reagent("water")) + return FARMBOT_WATER + + else if(uproots_weeds && tray.weedlevel > 3) + return FARMBOT_UPROOT + + else if(replaces_nutriment && tray.nutrilevel < 1 && tray.reagents.total_volume < 1) + return FARMBOT_NUTRIMENT + + return 0 + +// Assembly + +/obj/item/weapon/farmbot_arm_assembly + name = "water tank/robot arm assembly" + desc = "A water tank with a robot arm permanently grafted to it." + icon = 'icons/obj/aibots.dmi' + icon_state = "water_arm" + var/build_step = 0 + var/created_name = "Farmbot" + w_class = 3.0 + + New() + ..() + spawn(4) // If an admin spawned it, it won't have a watertank it, so lets make one for em! + var tank = locate(/obj/structure/reagent_dispensers/watertank) in contents + if(!tank) + new /obj/structure/reagent_dispensers/watertank(src) + + +/obj/structure/reagent_dispensers/watertank/attackby(var/obj/item/robot_parts/S, mob/user as mob) + if ((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm))) + ..() + return + + var/obj/item/weapon/farmbot_arm_assembly/A = new /obj/item/weapon/farmbot_arm_assembly(loc) + + user << "You add the robot arm to [src]." + loc = A //Place the water tank into the assembly, it will be needed for the finished bot + user.drop_from_inventory(S) + qdel(S) + +/obj/item/weapon/farmbot_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + if((istype(W, /obj/item/device/analyzer/plant_analyzer)) && (build_step == 0)) + build_step++ + user << "You add the plant analyzer to [src]." + name = "farmbot assembly" + user.remove_from_mob(W) + qdel(W) + + else if((istype(W, /obj/item/weapon/reagent_containers/glass/bucket)) && (build_step == 1)) + build_step++ + user << "You add a bucket to [src]." + name = "farmbot assembly with bucket" + user.remove_from_mob(W) + qdel(W) + + else if((istype(W, /obj/item/weapon/minihoe)) && (build_step == 2)) + build_step++ + user << "You add a minihoe to [src]." + name = "farmbot assembly with bucket and minihoe" + user.remove_from_mob(W) + qdel(W) + + else if((isprox(W)) && (build_step == 3)) + build_step++ + user << "You complete the Farmbot! Beep boop." + var/mob/living/bot/farmbot/S = new /mob/living/bot/farmbot(get_turf(src)) + for(var/obj/structure/reagent_dispensers/watertank/wTank in contents) + wTank.loc = S + S.tank = wTank + S.name = created_name + user.remove_from_mob(W) + qdel(W) + qdel(src) + + else if(istype(W, /obj/item/weapon/pen)) + var/t = input(user, "Enter new robot name", name, created_name) as text + t = sanitize(t, MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + + created_name = t + +/obj/item/weapon/farmbot_arm_assembly/attack_hand(mob/user as mob) + return //it's a converted watertank, no you cannot pick it up and put it in your backpack \ No newline at end of file diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm new file mode 100644 index 0000000000..08c5ac1c4b --- /dev/null +++ b/code/modules/mob/living/bot/floorbot.dm @@ -0,0 +1,365 @@ +/mob/living/bot/floorbot + name = "Floorbot" + desc = "A little floor repairing robot, he looks so excited!" + icon_state = "floorbot0" + req_access = list(access_construction) + + var/amount = 10 // 1 for tile, 2 for lattice + var/maxAmount = 60 + var/tilemake = 0 // When it reaches 100, bot makes a tile + var/repairing = 0 + var/improvefloors = 0 + var/eattiles = 0 + var/maketiles = 0 + var/targetdirection = null + var/list/path = list() + var/list/ignorelist = list() + var/turf/target + +/mob/living/bot/floorbot/update_icons() + if(repairing) + icon_state = "floorbot-c" + else if(amount > 0) + icon_state = "floorbot[on]" + else + icon_state = "floorbot[on]e" + +/mob/living/bot/floorbot/attack_hand(var/mob/user) + user.set_machine(src) + var/dat + dat += "Automatic Station Floor Repairer v1.0

        " + dat += "Status: [src.on ? "On" : "Off"]
        " + dat += "Maintenance panel is [open ? "opened" : "closed"]
        " + //dat += "Tiles left: [amount]
        " + dat += "Behvaiour controls are [locked ? "locked" : "unlocked"]
        " + if(!locked || issilicon(user)) + dat += "Improves floors: [improvefloors ? "Yes" : "No"]
        " + dat += "Finds tiles: [eattiles ? "Yes" : "No"]
        " + dat += "Make singles pieces of metal into tiles when empty: [maketiles ? "Yes" : "No"]
        " + var/bmode + if(targetdirection) + bmode = dir2text(targetdirection) + else + bmode = "Disabled" + dat += "

        Bridge Mode : [bmode]
        " + + user << browse("Repairbot v1.0 controls[dat]", "window=autorepair") + onclose(user, "autorepair") + return + +/mob/living/bot/floorbot/Emag(var/mob/user) + ..() + emagged = 1 + if(user) + user << "The [src] buzzes and beeps." + +/mob/living/bot/floorbot/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + add_fingerprint(usr) + switch(href_list["operation"]) + if("start") + if (on) + turn_off() + else + turn_on() + if("improve") + improvefloors = !improvefloors + if("tiles") + eattiles = !eattiles + if("make") + maketiles = !maketiles + if("bridgemode") + switch(targetdirection) + if(null) + targetdirection = 1 + if(1) + targetdirection = 2 + if(2) + targetdirection = 4 + if(4) + targetdirection = 8 + if(8) + targetdirection = null + else + targetdirection = null + attack_hand(usr) + +/mob/living/bot/floorbot/turn_off() + ..() + target = null + path = list() + ignorelist = list() + +/mob/living/bot/floorbot/Life() + ..() + + if(!on) + return + + ++tilemake + if(tilemake >= 100) + tilemake = 0 + addTiles(1) + + if(client) + return + + if(prob(5)) + custom_emote(2, "makes an excited booping beeping sound!") + + if(ignorelist.len) // Don't stick forever + for(var/T in ignorelist) + if(prob(1)) + ignorelist -= T + + if(amount && !emagged) + if(!target && targetdirection) // Building a bridge + var/turf/T = get_step(src, targetdirection) + while(T in range(src)) + if(istype(T, /turf/space)) + target = T + break + T = get_step(T, targetdirection) + + if(!target) // Fixing floors + for(var/turf/T in view(src)) + if(T.loc.name == "Space") + continue + if(T in ignorelist) + continue + if(istype(T, /turf/space)) + if(get_turf(T) == loc || prob(40)) // So they target the same tile all the time + target = T + if(improvefloors && istype(T, /turf/simulated/floor)) + var/turf/simulated/floor/F = T + if(!F.floor_type && (get_turf(T) == loc || prob(40))) + target = T + + if(emagged) // Time to griff + for(var/turf/simulated/floor/D in view(src)) + if(D.loc.name == "Space") + continue + if(D in ignorelist) + continue + target = D + break + + if(!target && amount < maxAmount && eattiles || maketiles) // Eat tiles + if(eattiles) + for(var/obj/item/stack/tile/plasteel/T in view(src)) + if(T in ignorelist) + continue + target = T + break + if(maketiles && !target) + for(var/obj/item/stack/sheet/metal/T in view(src)) + if(T in ignorelist) + continue + target = T + break + + if(target && get_turf(target) == loc) + UnarmedAttack(target) + + if(target && get_turf(target) != loc && !path.len) + spawn(0) + path = AStar(loc, get_turf(target), /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + path = list() + ignorelist += target + target = null + + if(path.len) + step_to(src, path[1]) + path -= path[1] + +/mob/living/bot/floorbot/UnarmedAttack(var/atom/A, var/proximity) + if(!..()) + return + + if(repairing) + return + + if(get_turf(A) != loc) + return + + if(emagged && istype(A, /turf/simulated/floor)) + var/turf/simulated/floor/F = A + repairing = 1 + update_icons() + if(F.is_plating()) + visible_message("[src] begins to tear the floor tile from the floor!") + if(do_after(src, 50)) + F.break_tile_to_plating() + addTiles(1) + else + visible_message("[src] begins to tear through the floor!") + if(do_after(src, 150)) // Extra time because this can and will kill. + F.ReplaceWithLattice() + addTiles(1) + target = null + repairing = 0 + update_icons() + else if(istype(A, /turf/space)) + var/building = 2 + if(locate(/obj/structure/lattice, A)) + building = 1 + if(amount < building) + return + repairing = 1 + update_icons() + visible_message("[src] begins to repair the hole.") + if(do_after(src, 50)) + if(A && (locate(/obj/structure/lattice, A) && building == 1 || !locate(/obj/structure/lattice, A) && building == 2)) // Make sure that it still needs repairs + var/obj/item/I + if(building == 1) + I = new /obj/item/stack/tile/plasteel(src) + else + I = PoolOrNew(/obj/item/stack/rods, src) + A.attackby(I, src) + target = null + repairing = 0 + update_icons() + else if(istype(A, /turf/simulated/floor)) + var/turf/simulated/floor/F = A + if(!F.floor_type && amount) + repairing = 1 + update_icons() + visible_message("[src] begins to improve the floor.") + if(do_after(src, 50)) + if(!F.floor_type) + var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel(src) + F.attackby(T, src) + addTiles(-1) + target = null + repairing = 0 + update_icons() + else if(istype(A, /obj/item/stack/tile/plasteel) && amount < maxAmount) + var/obj/item/stack/tile/plasteel/T = A + visible_message("[src] begins to collect tiles.") + repairing = 1 + update_icons() + if(do_after(src, 20)) + if(T) + var/eaten = min(maxAmount - amount, T.get_amount()) + T.use(eaten) + addTiles(eaten) + target = null + repairing = 0 + update_icons() + else if(istype(A, /obj/item/stack/sheet/metal) && amount + 3 < maxAmount) + var/obj/item/stack/sheet/metal/M = A + visible_message("[src] begins to make tiles.") + repairing = 1 + update_icons() + if(do_after(50)) + if(M) + M.use(1) + addTiles(4) + +/mob/living/bot/floorbot/explode() + turn_off() + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) + + var/obj/item/weapon/storage/toolbox/mechanical/N = new /obj/item/weapon/storage/toolbox/mechanical(Tsec) + N.contents = list() + new /obj/item/device/assembly/prox_sensor(Tsec) + if(prob(50)) + new /obj/item/robot_parts/l_arm(Tsec) + var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel(Tsec) + T.amount = amount + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + qdel(src) + +/mob/living/bot/floorbot/proc/addTiles(var/am) + amount += am + if(amount < 0) + amount = 0 + else if(amount > maxAmount) + amount = maxAmount + +/* Assembly */ + +/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/plasteel/T, mob/user as mob) + if(!istype(T, /obj/item/stack/tile/plasteel)) + ..() + return + if(contents.len >= 1) + user << "They wont fit in as there is already stuff inside." + return + if(user.s_active) + user.s_active.close(user) + if(T.use(10)) + var/obj/item/weapon/toolbox_tiles/B = new /obj/item/weapon/toolbox_tiles + user.put_in_hands(B) + user << "You add the tiles into the empty toolbox. They protrude from the top." + user.drop_from_inventory(src) + qdel(src) + else + user << "You need 10 floor tiles for a floorbot." + return + +/obj/item/weapon/toolbox_tiles + desc = "It's a toolbox with tiles sticking out the top" + name = "tiles and toolbox" + icon = 'icons/obj/aibots.dmi' + icon_state = "toolbox_tiles" + force = 3.0 + throwforce = 10.0 + throw_speed = 2 + throw_range = 5 + w_class = 3.0 + var/created_name = "Floorbot" + +/obj/item/weapon/toolbox_tiles/attackby(var/obj/item/W, mob/user as mob) + ..() + if(isprox(W)) + qdel(W) + var/obj/item/weapon/toolbox_tiles_sensor/B = new /obj/item/weapon/toolbox_tiles_sensor() + B.created_name = created_name + user.put_in_hands(B) + user << "You add the sensor to the toolbox and tiles!" + user.drop_from_inventory(src) + qdel(src) + else if (istype(W, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, user) && loc != user) + return + created_name = t + +/obj/item/weapon/toolbox_tiles_sensor + desc = "It's a toolbox with tiles sticking out the top and a sensor attached" + name = "tiles, toolbox and sensor arrangement" + icon = 'icons/obj/aibots.dmi' + icon_state = "toolbox_tiles_sensor" + force = 3.0 + throwforce = 10.0 + throw_speed = 2 + throw_range = 5 + w_class = 3.0 + var/created_name = "Floorbot" + +/obj/item/weapon/toolbox_tiles_sensor/attackby(var/obj/item/W, mob/user as mob) + ..() + if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) + qdel(W) + var/turf/T = get_turf(user.loc) + var/mob/living/bot/floorbot/A = new /mob/living/bot/floorbot(T) + A.name = created_name + user << "You add the robot arm to the odd looking toolbox assembly! Boop beep!" + user.drop_from_inventory(src) + qdel(src) + else if(istype(W, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, user) && loc != user) + return + created_name = t \ No newline at end of file diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm new file mode 100644 index 0000000000..d6e20a9641 --- /dev/null +++ b/code/modules/mob/living/bot/medbot.dm @@ -0,0 +1,365 @@ +/mob/living/bot/medbot + name = "Medbot" + desc = "A little medical robot. He looks somewhat underwhelmed." + icon_state = "medibot0" + req_access = list(access_medical) + + var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits. + botcard_access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) + + //AI vars + var/frustration = 0 + var/list/path = list() + var/mob/living/carbon/human/patient = null + var/mob/ignored = list() // Used by emag + var/last_newpatient_speak = 0 + var/vocal = 1 + + //Healing vars + var/obj/item/weapon/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents. + var/currently_healing = 0 + var/injection_amount = 15 //How much reagent do we inject at a time? + var/heal_threshold = 10 //Start healing when they have this much damage in a category + var/use_beaker = 0 //Use reagents in beaker instead of default treatment agents. + var/treatment_brute = "tricordrazine" + var/treatment_oxy = "tricordrazine" + var/treatment_fire = "tricordrazine" + var/treatment_tox = "tricordrazine" + var/treatment_virus = "spaceacillin" + var/treatment_emag = "toxin" + var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds? + +/mob/living/bot/medbot/Life() + ..() + + if(!on) + return + + if(!client) + + if(vocal && prob(1)) + var/message = pick("Radar, put a mask on!", "There's always a catch, and it's the best there is.", "I knew it, I should've been a plastic surgeon.", "What kind of medbay is this? Everyone's dropping like dead flies.", "Delicious!") + say(message) + + if(patient) + if(Adjacent(patient)) + if(!currently_healing) + UnarmedAttack(patient) + else + if(path.len && (get_dist(patient, path[path.len]) > 2)) // We have a path, but it's off + path = list() + if(!path.len && (get_dist(src, patient) > 1)) + spawn(0) + path = AStar(loc, get_turf(patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + path = list() + if(path.len) + step_to(src, path[1]) + path -= path[1] + ++frustration + if(get_dist(src, patient) > 7 || frustration > 8) + patient = null + else + for(var/mob/living/carbon/human/H in view(7, src)) // Time to find a patient! + if(valid_healing_target(H)) + patient = H + frustration = 0 + if(last_newpatient_speak + 300 < world.time) + var/message = pick("Hey, [H.name]! Hold on, I'm coming.", "Wait [H.name]! I want to help!", "[H.name], you appear to be injured!") + say(message) + custom_emote(1, "points at [H.name].") + last_newpatient_speak = world.time + break + +/mob/living/bot/medbot/UnarmedAttack(var/mob/living/carbon/human/H, var/proximity) + if(!..()) + return + + if(!on) + return + + if(!istype(H)) + return + + if(H.stat == DEAD) + var/death_message = pick("No! NO!", "Live, damnit! LIVE!", "I... I've never lost a patient before. Not today, I mean.") + say(death_message) + patient = null + return + + var/t = valid_healing_target(H) + if(!t) + var/message = pick("All patched up!", "An apple a day keeps me away.", "Feel better soon!") + say(message) + patient = null + return + + icon_state = "medibots" + visible_message("[src] is trying to inject [H]!") + if(declare_treatment) + var/area/location = get_area(src) + broadcast_medical_hud_message("[src] is treating [H] in [location]", src) + currently_healing = 1 + update_icons() + if(do_mob(src, H, 30)) + if(t == 1) + reagent_glass.reagents.trans_to(H, injection_amount) + reagent_glass.reagents.reaction(H, 2) + else + H.reagents.add_reagent(t, injection_amount) + visible_message("[src] injects [H] with the syringe!") + currently_healing = 0 + update_icons() + +/mob/living/bot/medbot/update_icons() + overlays.Cut() + if(skin) + overlays += image('icons/obj/aibots.dmi', "medskin_[skin]") + if(currently_healing) + icon_state = "medibots" + else + icon_state = "medibot[on]" + +/mob/living/bot/medbot/attack_hand(var/mob/user) + var/dat + dat += "Automatic Medical Unit v1.0

        " + dat += "Status: [on ? "On" : "Off"]
        " + dat += "Maintenance panel is [open ? "opened" : "closed"]
        " + dat += "Beaker: " + if (reagent_glass) + dat += "Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]" + else + dat += "None Loaded" + dat += "
        Behaviour controls are [locked ? "locked" : "unlocked"]
        " + if(!locked || issilicon(user)) + dat += "Healing Threshold: " + dat += "-- " + dat += "- " + dat += "[heal_threshold] " + dat += "+ " + dat += "++" + dat += "
        " + + dat += "Injection Level: " + dat += "- " + dat += "[injection_amount] " + dat += "+ " + dat += "
        " + + dat += "Reagent Source: " + dat += "[use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]
        " + + dat += "Treatment report is [declare_treatment ? "on" : "off"]. Toggle
        " + + dat += "The speaker switch is [vocal ? "on" : "off"]. Toggle
        " + + user << browse("Medibot v1.0 controls[dat]", "window=automed") + onclose(user, "automed") + return + +/mob/living/bot/medbot/attackby(var/obj/item/O, var/mob/user) + if(istype(O, /obj/item/weapon/reagent_containers/glass)) + if(locked) + user << "You cannot insert a beaker because the panel is locked." + return + if(!isnull(reagent_glass)) + user << "There is already a beaker loaded." + return + + user.drop_item() + O.loc = src + reagent_glass = O + user << "You insert [O]." + return + else + ..() + +/mob/living/bot/medbot/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + add_fingerprint(usr) + if ((href_list["power"]) && access_scanner.allowed(usr)) + if (on) + turn_off() + else + turn_on() + + else if((href_list["adj_threshold"]) && (!locked || issilicon(usr))) + var/adjust_num = text2num(href_list["adj_threshold"]) + heal_threshold += adjust_num + if(heal_threshold < 5) + heal_threshold = 5 + if(heal_threshold > 75) + heal_threshold = 75 + + else if((href_list["adj_inject"]) && (!locked || issilicon(usr))) + var/adjust_num = text2num(href_list["adj_inject"]) + injection_amount += adjust_num + if(injection_amount < 5) + injection_amount = 5 + if(injection_amount > 15) + injection_amount = 15 + + else if((href_list["use_beaker"]) && (!locked || issilicon(usr))) + use_beaker = !use_beaker + + else if (href_list["eject"] && (!isnull(reagent_glass))) + if(!locked) + reagent_glass.loc = get_turf(src) + reagent_glass = null + else + usr << "You cannot eject the beaker because the panel is locked." + + else if ((href_list["togglevoice"]) && (!locked || issilicon(usr))) + vocal = !vocal + + else if ((href_list["declaretreatment"]) && (!locked || issilicon(usr))) + declare_treatment = !declare_treatment + + attack_hand(usr) + return + +/mob/living/bot/medbot/Emag(var/mob/user) + ..() + if(!emagged) + if(user) + user << "You short out [src]'s reagent synthesis circuits." + visible_message("[src] buzzes oddly!") + flick("medibot_spark", src) + patient = null + currently_healing = 0 + emagged = 1 + on = 1 + update_icons() + ignored |= user + +/mob/living/bot/medbot/explode() + on = 0 + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) + + new /obj/item/weapon/storage/firstaid(Tsec) + new /obj/item/device/assembly/prox_sensor(Tsec) + new /obj/item/device/healthanalyzer(Tsec) + if (prob(50)) + new /obj/item/robot_parts/l_arm(Tsec) + + if(reagent_glass) + reagent_glass.loc = Tsec + reagent_glass = null + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + qdel(src) + return + +/mob/living/bot/medbot/proc/valid_healing_target(var/mob/living/carbon/human/H) + if(H.stat == DEAD) // He's dead, Jim + return null + + if(H.suiciding) + return null + + if(H in ignored) + return null + + if(emagged) + return treatment_emag + + // If they're injured, we're using a beaker, and they don't have on of the chems in the beaker + if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15)))) + for(var/datum/reagent/R in reagent_glass.reagents.reagent_list) + if(!H.reagents.has_reagent(R)) + return 1 + continue + + if((H.getBruteLoss() >= heal_threshold) && (!H.reagents.has_reagent(treatment_brute))) + return treatment_brute //If they're already medicated don't bother! + + if((H.getOxyLoss() >= (15 + heal_threshold)) && (!H.reagents.has_reagent(treatment_oxy))) + return treatment_oxy + + if((H.getFireLoss() >= heal_threshold) && (!H.reagents.has_reagent(treatment_fire))) + return treatment_fire + + if((H.getToxLoss() >= heal_threshold) && (!H.reagents.has_reagent(treatment_tox))) + return treatment_tox + + for(var/datum/disease/D in H.viruses) + if (!H.reagents.has_reagent(treatment_virus)) + return treatment_virus // STOP DISEASE FOREVER + +/* Construction */ + +/obj/item/weapon/storage/firstaid/attackby(var/obj/item/robot_parts/S, mob/user as mob) + if ((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm))) + ..() + return + + if(contents.len >= 1) + user << "You need to empty [src] out first." + return + + var/obj/item/weapon/firstaid_arm_assembly/A = new /obj/item/weapon/firstaid_arm_assembly + if(istype(src, /obj/item/weapon/storage/firstaid/fire)) + A.skin = "ointment" + else if(istype(src, /obj/item/weapon/storage/firstaid/toxin)) + A.skin = "tox" + else if(istype(src, /obj/item/weapon/storage/firstaid/o2)) + A.skin = "o2" + + qdel(S) + user.put_in_hands(A) + user << "You add the robot arm to the first aid kit." + user.drop_from_inventory(src) + qdel(src) + +/obj/item/weapon/firstaid_arm_assembly + name = "first aid/robot arm assembly" + desc = "A first aid kit with a robot arm permanently grafted to it." + icon = 'icons/obj/aibots.dmi' + icon_state = "firstaid_arm" + var/build_step = 0 + var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess + var/skin = null //Same as medbot, set to tox or ointment for the respective kits. + w_class = 3.0 + +/obj/item/weapon/firstaid_arm_assembly/New() + ..() + spawn(5) // Terrible. TODO: fix + if(skin) + overlays += image('icons/obj/aibots.dmi', "kit_skin_[src.skin]") + +/obj/item/weapon/firstaid_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + if(istype(W, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + created_name = t + else + switch(build_step) + if(0) + if(istype(W, /obj/item/device/healthanalyzer)) + user.drop_item() + qdel(W) + build_step++ + user << "You add the health sensor to [src]." + name = "First aid/robot arm/health analyzer assembly" + overlays += image('icons/obj/aibots.dmi', "na_scanner") + + if(1) + if(isprox(W)) + user.drop_item() + qdel(W) + user << "You complete the Medibot! Beep boop." + var/turf/T = get_turf(src) + var/mob/living/bot/medbot/S = new /mob/living/bot/medbot(T) + S.skin = skin + S.name = created_name + user.drop_from_inventory(src) + qdel(src) diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm new file mode 100644 index 0000000000..9698021cbb --- /dev/null +++ b/code/modules/mob/living/bot/secbot.dm @@ -0,0 +1,579 @@ +/mob/living/bot/secbot + name = "Securitron" + desc = "A little security robot. He looks less than thrilled." + icon_state = "secbot0" + maxHealth = 50 + health = 50 + req_access = list(access_security, access_forensics_lockers) + botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) + + var/mob/target + + var/idcheck = 0 // If true, arrests for having weapons without authorization. + var/check_records = 0 // If true, arrests people without a record. + var/check_arrest = 1 // If true, arrests people who are set to arrest. + var/arrest_type = 0 // If true, doesn't handcuff. You monster. + var/declare_arrests = 0 // If true, announces arrests over sechuds. + var/auto_patrol = 0 // If true, patrols on its own + + var/mode = 0 +#define SECBOT_IDLE 0 // idle +#define SECBOT_HUNT 1 // found target, hunting +#define SECBOT_ARREST 2 // arresting target +#define SECBOT_START_PATROL 3 // start patrol +#define SECBOT_WAIT_PATROL 4 // waiting for signals +#define SECBOT_PATROL 5 // patrolling +#define SECBOT_SUMMON 6 // summoned by PDA + var/is_attacking = 0 + var/is_ranged = 0 + var/awaiting_surrender = 0 + + var/obj/secbot_listener/listener = null + var/beacon_freq = 1445 // Navigation beacon frequency + var/control_freq = AI_FREQ // Bot control frequency + var/list/path = list() + var/frustration = 0 + var/turf/patrol_target = null // This is where we are headed + var/closest_dist // Used to find the closest beakon + var/destination = "__nearest__" // This is the current beacon's ID + var/next_destination = "__nearest__" // This is the next beacon's ID + var/nearest_beacon // Tag of the beakon that we assume to be the closest one + + var/bot_version = 1.3 + var/list/threat_found_sounds = new('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg') + var/list/preparing_arrest_sounds = new('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg') + +/mob/living/bot/secbot/beepsky + name = "Officer Beepsky" + desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." + auto_patrol = 1 + +/mob/living/bot/secbot/New() + ..() + listener = new /obj/secbot_listener(src) + listener.secbot = src + + spawn(5) // Since beepsky is made on the start... this delay is necessary + if(radio_controller) + radio_controller.add_object(listener, control_freq, filter = RADIO_SECBOT) + radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS) + +/mob/living/bot/secbot/turn_off() + ..() + target = null + frustration = 0 + mode = SECBOT_IDLE + +/mob/living/bot/secbot/update_icons() + if(on && is_attacking) + icon_state = "secbot-c" + else + icon_state = "secbot[on]" + +/mob/living/bot/secbot/attack_hand(var/mob/user) + user.set_machine(src) + var/dat + dat += "Automatic Security Unit v[bot_version]

        " + dat += "Status: [on ? "On" : "Off"]
        " + dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
        " + dat += "Maintenance panel is [open ? "opened" : "closed"]" + if(!locked || issilicon(user)) + dat += "
        Check for Weapon Authorization: [idcheck ? "Yes" : "No"]
        " + dat += "Check Security Records: [check_records ? "Yes" : "No"]
        " + dat += "Check Arrest Status: [check_arrest ? "Yes" : "No"]
        " + dat += "Operating Mode: [arrest_type ? "Detain" : "Arrest"]
        " + dat += "Report Arrests: [declare_arrests ? "Yes" : "No"]
        " + dat += "Auto Patrol: [auto_patrol ? "On" : "Off"]" + user << browse("Securitron v[bot_version] controls[dat]", "window=autosec") + onclose(user, "autosec") + return + +/mob/living/bot/secbot/Topic(href, href_list) + if(..()) + return + + usr.set_machine(src) + add_fingerprint(usr) + + if((href_list["power"]) && (access_scanner.allowed(usr))) + if(on) + turn_off() + else + turn_on() + return + + switch(href_list["operation"]) + if("idcheck") + idcheck = !idcheck + if("ignorerec") + check_records = !check_records + if("ignorearr") + check_arrest = !check_arrest + if("switchmode") + arrest_type = !arrest_type + if("patrol") + auto_patrol = !auto_patrol + mode = SECBOT_IDLE + if("declarearrests") + declare_arrests = !declare_arrests + attack_hand(usr) + +/mob/living/bot/secbot/attackby(var/obj/item/O, var/mob/user) + var/curhealth = health + ..() + if(health < curhealth) + target = user + awaiting_surrender = 5 + mode = SECBOT_HUNT + +/mob/living/bot/secbot/Life() + ..() + if(!on) + return + if(client) + return + + if(!target) + scan_view() + + if(!locked && (mode == SECBOT_START_PATROL || mode == SECBOT_PATROL)) // Stop running away when we set you up + mode = SECBOT_IDLE + + switch(mode) + if(SECBOT_IDLE) + if(auto_patrol && locked) + mode = SECBOT_START_PATROL + return + + if(SECBOT_HUNT) // Target is in the view or has been recently - chase it + if(frustration > 7) + target = null + frustration = 0 + awaiting_surrender = 0 + mode = SECBOT_IDLE + return + if(target) + var/threat = check_threat(target) + if(threat < 4) // Re-evaluate in case they dropped the weapon or something + target = null + frustration = 0 + awaiting_surrender = 0 + mode = SECBOT_IDLE + return + if(!(target in view(7, src))) + ++frustration + if(Adjacent(target)) + mode = SECBOT_ARREST + return + else + if(is_ranged) + RangedAttack(target) + else + step_towards(src, target) // Melee bots chase a bit faster + spawn(8) + if(!Adjacent(target)) + step_towards(src, target) + spawn(16) + if(!Adjacent(target)) + step_towards(src, target) + + if(SECBOT_ARREST) // Target is next to us - attack it + if(!target) + mode = SECBOT_IDLE + if(!Adjacent(target)) + awaiting_surrender = 5 // I'm done playing nice + mode = SECBOT_HUNT + var/threat = check_threat(target) + if(threat < 4) + target = null + awaiting_surrender = 0 + frustration = 0 + mode = SECBOT_IDLE + return + if(awaiting_surrender < 5 && ishuman(target) && !target.lying) + if(awaiting_surrender == 0) + say("Down on the floor, [target]! You have five seconds to comply.") + ++awaiting_surrender + else + UnarmedAttack(target) + if(ishuman(target) && declare_arrests) + var/area/location = get_area(src) + broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [check_threat(target)] suspect [target] in [location].", src) + return + + if(SECBOT_START_PATROL) + if(path.len && patrol_target) + mode = SECBOT_PATROL + return + else if(patrol_target) + spawn(0) + calc_path() + if(!path.len) + patrol_target = null + mode = SECBOT_IDLE + else + mode = SECBOT_PATROL + if(!patrol_target) + if(next_destination) + find_next_target() + else + find_patrol_target() + say("Engaging patrol mode.") + mode = SECBOT_WAIT_PATROL + return + + if(SECBOT_WAIT_PATROL) + if(patrol_target) + mode = SECBOT_START_PATROL + else + ++frustration + if(frustration > 120) + frustration = 0 + mode = SECBOT_IDLE + + if(SECBOT_PATROL) + patrol_step() + spawn(10) + patrol_step() + return + + if(SECBOT_SUMMON) + patrol_step() + spawn(8) + patrol_step() + spawn(16) + patrol_step() + return + +/mob/living/bot/secbot/UnarmedAttack(var/mob/M, var/proximity) + if(!..()) + return + + if(!istype(M)) + return + + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/C = M + var/cuff = 1 + if(istype(C, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = C + if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/rig)) + cuff = 0 + if(!C.lying || C.handcuffed || arrest_type) + cuff = 0 + if(!cuff) + C.stun_effect_act(0, 60, null) + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + is_attacking = 1 + update_icons() + spawn(2) + is_attacking = 0 + update_icons() + visible_message("[C] was prodded by [src] with a stun baton!") + else + playsound(loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) + visible_message("[src] is trying to put handcuffs on [C]!") + if(do_mob(src, C, 60)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/weapon/handcuffs(C) + C.update_inv_handcuffed() + if(preparing_arrest_sounds.len) + playsound(loc, pick(preparing_arrest_sounds), 50, 0) + else if(istype(M, /mob/living/simple_animal)) + var/mob/living/simple_animal/S = M + S.AdjustStunned(10) + S.adjustBruteLoss(15) + playsound(loc, "swing_hit", 50, 1, -1) + is_attacking = 1 + update_icons() + spawn(2) + is_attacking = 0 + update_icons() + visible_message("[M] was beaten by [src] with a stun baton!") + +/mob/living/bot/secbot/explode() + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) + + var/obj/item/weapon/secbot_assembly/Sa = new /obj/item/weapon/secbot_assembly(Tsec) + Sa.build_step = 1 + Sa.overlays += image('icons/obj/aibots.dmi', "hs_hole") + Sa.created_name = name + new /obj/item/device/assembly/prox_sensor(Tsec) + new /obj/item/weapon/melee/baton(Tsec) + if(prob(50)) + new /obj/item/robot_parts/l_arm(Tsec) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + + new /obj/effect/decal/cleanable/blood/oil(Tsec) + qdel(src) + +/mob/living/bot/secbot/proc/scan_view() + for(var/mob/living/M in view(7, src)) + if(M.invisibility >= INVISIBILITY_LEVEL_ONE) + continue + if(M.stat) + continue + + var/threat = check_threat(M) + + if(threat >= 4) + target = M + say("Level [threat] infraction alert!") + custom_emote(1, "points at [M.name]!") + mode = SECBOT_HUNT + break + return + +/mob/living/bot/secbot/proc/calc_path(var/turf/avoid = null) + path = AStar(loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id=botcard, exclude=avoid) + if(!path) + path = list() + +/mob/living/bot/secbot/proc/check_threat(var/mob/living/M) + if(M.stat == DEAD) + return 0 + if(emagged) + return 10 + + var/threatcount = 0 + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(H.handcuffed) + return 0 + + var/obj/item/weapon/card/id/id = GetIdCard(H) //Agent cards lower threatlevel. + if(id && istype(id, /obj/item/weapon/card/id/syndicate)) + threatcount -= 2 + + if(idcheck && !access_scanner.allowed(H)) + if(istype(H.l_hand, /obj/item/weapon/gun) || istype(H.l_hand, /obj/item/weapon/melee)) + threatcount += 4 + + if(istype(H.r_hand, /obj/item/weapon/gun) || istype(H.r_hand, /obj/item/weapon/melee)) + threatcount += 4 + + if(istype(H.belt, /obj/item/weapon/gun) || istype(H.belt, /obj/item/weapon/melee)) + threatcount += 2 + + if(H.species.name != "Human") //beepsky so racist. + threatcount += 2 + + if(check_records || check_arrest) + var/perpname = H.name + if(id) + perpname = id.registered_name + + var/datum/data/record/R = find_security_record("name", perpname) + if(check_records && !R) + threatcount += 4 + + if(check_arrest && R && (R.fields["criminal"] == "*Arrest*")) + threatcount += 4 + + else if(isanimal(M)) + if(istype(M, /mob/living/simple_animal/hostile) && !istype(M, /mob/living/simple_animal/hostile/retaliate/goat)) + threatcount += 4 + + return threatcount + +/mob/living/bot/secbot/proc/patrol_step() + if(loc == patrol_target) + patrol_target = null + path = list() + mode = SECBOT_IDLE + return + + if(path.len && patrol_target) + var/turf/next = path[1] + if(loc == next) + path -= next + return + var/moved = step_towards(src, next) + if(moved) + path -= next + frustration = 0 + else + ++frustration + if(frustration > 5) // Make a new path + mode = SECBOT_START_PATROL + return + else + mode = SECBOT_START_PATROL + +/mob/living/bot/secbot/proc/find_patrol_target() + send_status() + nearest_beacon = null + next_destination = "__nearest__" + listener.post_signal(beacon_freq, "findbeacon", "patrol") + +/mob/living/bot/secbot/proc/find_next_target() + send_status() + nearest_beacon = null + listener.post_signal(beacon_freq, "findbeacon", "patrol") + +/mob/living/bot/secbot/proc/send_status() + var/list/kv = list( + "type" = "secbot", + "name" = name, + "loca" = get_area(loc), + "mode" = mode + ) + listener.post_signal_multiple(control_freq, kv) + +/obj/secbot_listener + var/mob/living/bot/secbot/secbot = null + +/obj/secbot_listener/proc/post_signal(var/freq, var/key, var/value) // send a radio signal with a single data key/value pair + post_signal_multiple(freq, list("[key]" = value)) + +/obj/secbot_listener/proc/post_signal_multiple(var/freq, var/list/keyval) // send a radio signal with multiple data key/values + var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) + if(!frequency) + return + + var/datum/signal/signal = new() + signal.source = secbot + signal.transmission_method = 1 + signal.data = keyval.Copy() + + if(signal.data["findbeacon"]) + frequency.post_signal(secbot, signal, filter = RADIO_NAVBEACONS) + else if(signal.data["type"] == "secbot") + frequency.post_signal(secbot, signal, filter = RADIO_SECBOT) + else + frequency.post_signal(secbot, signal) + +/obj/secbot_listener/receive_signal(datum/signal/signal) + if(!secbot || !secbot.on) + return + + var/recv = signal.data["command"] + if(recv == "bot_status") + secbot.send_status() + return + + if(signal.data["active"] == secbot) + switch(recv) + if("stop") + secbot.mode = SECBOT_IDLE + secbot.auto_patrol = 0 + return + + if("go") + secbot.mode = SECBOT_IDLE + secbot.auto_patrol = 1 + return + + if("summon") + secbot.patrol_target = signal.data["target"] + secbot.next_destination = secbot.destination + secbot.destination = null + //secbot.awaiting_beacon = 0 + secbot.mode = SECBOT_SUMMON + secbot.calc_path() + secbot.say("Responding.") + return + + recv = signal.data["beacon"] + var/valid = signal.data["patrol"] + if(!recv || !valid) + return + + if(recv == secbot.next_destination) // This beacon is our target + secbot.destination = secbot.next_destination + secbot.patrol_target = signal.source.loc + secbot.next_destination = signal.data["next_patrol"] + else if(secbot.next_destination == "__nearest__") + var/dist = get_dist(secbot, signal.source.loc) + if(dist <= 1) + return + + if(secbot.nearest_beacon) + if(dist < secbot.closest_dist) + secbot.nearest_beacon = recv + secbot.patrol_target = secbot.nearest_beacon + secbot.next_destination = signal.data["next_patrol"] + secbot.closest_dist = dist + return + else + secbot.nearest_beacon = recv + secbot.patrol_target = secbot.nearest_beacon + secbot.next_destination = signal.data["next_patrol"] + secbot.closest_dist = dist + +//Secbot Construction + +/obj/item/clothing/head/helmet/attackby(var/obj/item/device/assembly/signaler/S, mob/user as mob) + ..() + if(!issignaler(S)) + ..() + return + + if(type != /obj/item/clothing/head/helmet) //Eh, but we don't want people making secbots out of space helmets. + return + + if(S.secured) + qdel(S) + var/obj/item/weapon/secbot_assembly/A = new /obj/item/weapon/secbot_assembly + user.put_in_hands(A) + user << "You add the signaler to the helmet." + user.drop_from_inventory(src) + qdel(src) + else + return + +/obj/item/weapon/secbot_assembly + name = "helmet/signaler assembly" + desc = "Some sort of bizarre assembly." + icon = 'icons/obj/aibots.dmi' + icon_state = "helmet_signaler" + item_state = "helmet" + var/build_step = 0 + var/created_name = "Securitron" + +/obj/item/weapon/secbot_assembly/attackby(var/obj/item/O, var/mob/user) + ..() + if(istype(O, /obj/item/weapon/weldingtool) && !build_step) + var/obj/item/weapon/weldingtool/WT = O + if(WT.remove_fuel(0, user)) + build_step = 1 + overlays += image('icons/obj/aibots.dmi', "hs_hole") + user << "You weld a hole in \the [src]." + + else if(isprox(O) && (build_step == 1)) + user.drop_item() + build_step = 2 + user << "You add \the [O] to [src]." + overlays += image('icons/obj/aibots.dmi', "hs_eye") + name = "helmet/signaler/prox sensor assembly" + qdel(O) + + else if((istype(O, /obj/item/robot_parts/l_arm) || istype(O, /obj/item/robot_parts/r_arm)) && build_step == 2) + user.drop_item() + build_step = 3 + user << "You add \the [O] to [src]." + name = "helmet/signaler/prox sensor/robot arm assembly" + overlays += image('icons/obj/aibots.dmi', "hs_arm") + qdel(O) + + else if(istype(O, /obj/item/weapon/melee/baton) && build_step == 3) + user.drop_item() + user << "You complete the Securitron! Beep boop." + var/mob/living/bot/secbot/S = new /mob/living/bot/secbot(get_turf(src)) + S.name = created_name + qdel(O) + qdel(src) + + else if(istype(O, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + created_name = t \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index fa567cbb44..588acea5ad 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -13,7 +13,7 @@ if(istype(loc,/obj/item/weapon/holder/diona)) var/obj/item/weapon/holder/diona/L = loc src.loc = L.loc - del(L) + qdel(L) src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") return "Diona" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index b6306ed5e2..54c7f9a969 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -38,7 +38,7 @@ for(var/datum/language/L in languages) adult.add_language(L.name) - del(src) + qdel(src) /mob/living/carbon/alien/proc/update_progression() if(amount_grown < max_grown) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index c4107f8119..c98c6304f5 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -35,7 +35,6 @@ var/locked = 0 var/mob/living/carbon/brain/brainmob = null//The current occupant. - var/mob/living/silicon/robot = null//Appears unused. var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm. attackby(var/obj/item/O as obj, var/mob/user as mob) @@ -61,7 +60,7 @@ living_mob_list += brainmob user.drop_item() - del(O) + qdel(O) name = "Man-Machine Interface: [brainmob.real_name]" icon_state = "mmi_full" @@ -115,6 +114,15 @@ locked = 1 return +/obj/item/device/mmi/Destroy() + if(isrobot(loc)) + var/mob/living/silicon/robot/borg = loc + borg.mmi = null + if(brainmob) + qdel(brainmob) + brainmob = null + ..() + /obj/item/device/mmi/radio_enabled name = "radio-enabled man-machine interface" desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio." diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 230b7736f2..e72671d78a 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -15,7 +15,7 @@ R.my_atom = src ..() - Del() + Destroy() if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. if(stat!=DEAD) //If not dead. death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 05ceed7916..486916821b 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -27,6 +27,12 @@ if(brainmob && brainmob.client) brainmob.client.screen.len = null //clear the hud +/obj/item/organ/brain/Destroy() + if(brainmob) + qdel(brainmob) + brainmob = null + ..() + /obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H) name = "\the [H]'s [initial(src.name)]" brainmob = new(src) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 517e32362a..43918f5288 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -7,8 +7,8 @@ /mob/living/carbon/brain/gib() if(istype(container, /obj/item/device/mmi)) - del(container)//Gets rid of the MMI if there is one + qdel(container)//Gets rid of the MMI if there is one if(loc) if(istype(loc,/obj/item/organ/brain)) - del(loc)//Gets rid of the brain item + qdel(loc)//Gets rid of the brain item ..(null,1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index d5ac4f756d..d933dc5d47 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -3,6 +3,8 @@ if (silent) return + message = sanitize(message) + if(!(container && istype(container, /obj/item/device/mmi))) return //No MMI, can't speak, bucko./N else diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index da10a9ea00..6647b7c930 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -7,6 +7,13 @@ if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level germ_level++ +/mob/living/carbon/Destroy() + for(var/guts in internal_organs) + qdel(guts) + for(var/food in stomach_contents) + qdel(food) + return ..() + /mob/living/carbon/Move(NewLoc, direct) . = ..() if(.) @@ -456,6 +463,9 @@ return 1 /mob/living/carbon/get_default_language() + if(default_language) + return default_language + if(!species) return null return species.default_language ? all_languages[species.default_language] : null diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index e2ef586f05..52ba116d43 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -1,7 +1,7 @@ -/mob/living/carbon/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/location = src, var/mob/user = src, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list()) +/mob/living/carbon/human/proc/change_appearance(var/flags = APPEARANCE_ALL_HAIR, var/location = src, var/mob/user = src, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list(), var/datum/topic_state/state = default_state) var/obj/nano_module/appearance_changer/AC = new(location, src, check_species_whitelist, species_whitelist, species_blacklist) AC.flags = flags - AC.ui_interact(user) + AC.ui_interact(user, state = state) /mob/living/carbon/human/proc/change_species(var/new_species) if(!new_species) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 338b265a4f..63b781e183 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -10,6 +10,10 @@ sleep(1) + for(var/obj/item/I in src) + drop_from_inventory(I) + I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(1,3), round(30/I.w_class)) + ..(species.gibbed_anim) gibs(loc, viruses, dna, null, species.flesh_color, species.blood_color) @@ -74,7 +78,7 @@ mutations.Add(HUSK) status_flags |= DISFIGURED //makes them unknown without fucking up other stuff like admintools - update_body(0) + update_body(1) return /mob/living/carbon/human/proc/Drain() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 258c8cbcd1..8d7c655730 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -119,14 +119,14 @@ m_type = 1 if ("flap") if (!src.restrained()) - message = "[src] flaps his wings." + message = "[src] flaps \his wings." m_type = 2 if(miming) m_type = 1 if ("aflap") if (!src.restrained()) - message = "[src] flaps his wings ANGRILY!" + message = "[src] flaps \his wings ANGRILY!" m_type = 2 if(miming) m_type = 1 @@ -618,4 +618,4 @@ HTML += "
        " HTML +="\[Done\]" HTML += "" - src << browse(HTML, "window=flavor_changes;size=430x300") \ No newline at end of file + src << browse(HTML, "window=flavor_changes;size=430x300") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 965870f97e..d725557161 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -395,14 +395,14 @@ else if(is_bleeding["right foot"]) display_shoes = 1 if(display_chest) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(display_shoes) - msg += "[src] has blood running from [t_his] shoes!\n" + msg += "[src] has blood running from [t_his] shoes!\n" if(display_gloves) - msg += "[src] has blood running from under [t_his] gloves!\n" + msg += "[src] has blood running from under [t_his] gloves!\n" for(var/implant in get_visible_implants(0)) - msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" + msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" if(digitalcamo) msg += "[t_He] [t_is] repulsively uncanny!\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e4cd673508..6ed25076ae 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -21,7 +21,10 @@ set_species() if(species) - name = species.get_random_name(gender) + real_name = species.get_random_name(gender) + name = real_name + if(mind) + mind.name = real_name var/datum/reagents/R = new/datum/reagents(1000) reagents = R @@ -44,6 +47,11 @@ dna.real_name = real_name make_blood() +/mob/living/carbon/human/Destroy() + for(var/organ in organs) + qdel(organ) + return ..() + /mob/living/carbon/human/Stat() ..() statpanel("Status") @@ -59,7 +67,7 @@ if (internal) if (!internal.air_contents) - del(internal) + qdel(internal) else stat("Internal Atmosphere Info", internal.name) stat("Tank Pressure", internal.air_contents.return_pressure()) @@ -812,7 +820,7 @@ for(var/x in all_hairs) var/datum/sprite_accessory/hair/H = new x // create new hair datum based on type x hairs.Add(H.name) // add hair name to hairs - del(H) // delete the hair after it's all done + qdel(H) // delete the hair after it's all done var/new_style = input("Please select hair style", "Character Generation",h_style) as null|anything in hairs @@ -827,7 +835,7 @@ for(var/x in all_fhairs) var/datum/sprite_accessory/facial_hair/H = new x fhairs.Add(H.name) - del(H) + qdel(H) new_style = input("Please select facial style", "Character Generation",f_style) as null|anything in fhairs @@ -860,11 +868,11 @@ var/list/creatures = list() for(var/mob/living/carbon/h in world) creatures += h - var/mob/target = input ("Who do you want to project your mind to ?") as null|anything in creatures + var/mob/target = input("Who do you want to project your mind to ?") as null|anything in creatures if (isnull(target)) return - var/say = input ("What do you wish to say") + var/say = sanitize(input("What do you wish to say")) if(mRemotetalk in target.mutations) target.show_message("\blue You hear [src.real_name]'s voice: [say]") else @@ -923,23 +931,12 @@ germ_level += n /mob/living/carbon/human/revive() - for (var/obj/item/organ/external/O in organs) - O.status &= ~ORGAN_BROKEN - O.status &= ~ORGAN_BLEEDING - O.status &= ~ORGAN_SPLINTED - O.status &= ~ORGAN_CUT_AWAY - O.status &= ~ORGAN_ATTACHABLE - O.wounds.Cut() - O.heal_damage(1000,1000,1,1) - - var/obj/item/organ/external/head/h = organs_by_name["head"] - h.disfigured = 0 if(species && !(species.flags & NO_BLOOD)) vessel.add_reagent("blood",560-vessel.total_volume) fixblood() - // Fix up any missing organs. + // Fix up all organs. // This will ignore any prosthetics in the prefs currently. species.create_organs(src) @@ -949,13 +946,11 @@ if(H.brainmob.real_name == src.real_name) if(H.brainmob.mind) H.brainmob.mind.transfer_to(src) - del(H) - - for(var/obj/item/organ/I in internal_organs) - I.damage = 0 + qdel(H) for (var/datum/disease/virus in viruses) virus.cure() + for (var/ID in virus2) var/datum/disease2/disease/V = virus2[ID] V.cure(src) @@ -1024,7 +1019,7 @@ .=..() if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len) feet_blood_color = null - del(feet_blood_DNA) + qdel(feet_blood_DNA) update_inv_shoes(1) return 1 @@ -1150,7 +1145,7 @@ if(client && client.screen) client.screen.len = null if(hud_used) - del(hud_used) + qdel(hud_used) hud_used = new /datum/hud(src) if(species) @@ -1365,4 +1360,4 @@ /mob/living/carbon/human/drop_from_inventory(var/obj/item/W, var/atom/Target = null) if(W in organs) return - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ebdfbd8b5a..94dfeddf34 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -100,9 +100,9 @@ var/hit_zone = H.zone_sel.selecting var/obj/item/organ/external/affecting = get_organ(hit_zone) - if(!affecting || affecting.status & ORGAN_DESTROYED) + if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED)) M << "They are missing that limb!" - return + return 1 switch(src.a_intent) if(I_HELP) @@ -214,25 +214,18 @@ w_uniform.add_fingerprint(M) var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) - if(istype(r_hand,/obj/item/weapon/gun) || istype(l_hand,/obj/item/weapon/gun)) - var/obj/item/weapon/gun/W = null - var/chance = 0 + var/list/holding = list(get_active_hand() = 40, get_inactive_hand = 20) - if (istype(l_hand,/obj/item/weapon/gun)) - W = l_hand - chance = hand ? 40 : 20 - - if (istype(r_hand,/obj/item/weapon/gun)) - W = r_hand - chance = !hand ? 40 : 20 - - if (prob(chance)) - visible_message("[src]'s [W] goes off during struggle!") + //See if they have any guns that might go off + for(var/obj/item/weapon/gun/W in holding) + if(W && prob(holding[W])) var/list/turfs = list() for(var/turf/T in view()) turfs += T - var/turf/target = pick(turfs) - return W.afterattack(target,src) + if(turfs.len) + var/turf/target = pick(turfs) + visible_message("[src]'s [W] goes off during the struggle!") + return W.afterattack(target,src) var/randn = rand(1, 100) if(!(species.flags & NO_SLIP) && randn <= 25) @@ -245,39 +238,25 @@ visible_message("[M] attempted to push [src]!") return - var/talked = 0 // BubbleWrap - if(randn <= 60) - //BubbleWrap: Disarming breaks a pull - if(pulling) - visible_message("\red [M] has broken [src]'s grip on [pulling]!") - talked = 1 - stop_pulling() + //See about breaking grips or pulls + if(break_all_grabs(M)) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return - //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? - if(istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/lgrab = l_hand - if(lgrab.affecting) - visible_message("\red [M] has broken [src]'s grip on [lgrab.affecting]!") - talked = 1 - spawn(1) - del(lgrab) - if(istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/rgrab = r_hand - if(rgrab.affecting) - visible_message("\red [M] has broken [src]'s grip on [rgrab.affecting]!") - talked = 1 - spawn(1) - del(rgrab) - //End BubbleWrap - - if(!talked) //BubbleWrap - drop_item() - visible_message("\red [M] has disarmed [src]!") + //Actually disarm them + for(var/obj/item/I in holding) + if(I) + drop_from_inventory(I) + visible_message("[M] has disarmed [src]!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return + + //if M (and only M) has a grab on src, start dislocating limbs + if(grab_joint(M)) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("\red [M] attempted to disarm [src]!") return @@ -302,16 +281,68 @@ return 1 /mob/living/carbon/human/proc/attack_joint(var/obj/item/W, var/mob/living/user, var/def_zone) - var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src) + if(!def_zone) def_zone = user.zone_sel.selecting + var/target_zone = get_zone_with_miss_chance(check_zone(def_zone), src) + if(user == src) // Attacking yourself can't miss target_zone = user.zone_sel.selecting if(!target_zone) return null var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) - if(!organ || organ.is_dislocated() || organ.dislocated == -1) + if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1)) return null var/dislocation_str if(prob(W.force)) - dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")] with a grisly crunch!" + dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!" organ.dislocate() return dislocation_str + +//Used to attack a joint through grabbing +/mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone) + var/has_grab = 0 + for(var/obj/item/weapon/grab/G in list(user.l_hand, user.r_hand)) + if(G.affecting == src && G.state == GRAB_NECK) + has_grab = 1 + break + + if(!has_grab) + return 0 + + if(!def_zone) def_zone = user.zone_sel.selecting + var/target_zone = check_zone(def_zone) + if(!target_zone) + return 0 + var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) + if(!organ || organ.is_dislocated() || organ.dislocated == -1) + return 0 + + user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!") + if(do_after(user, 100)) + organ.dislocate() + src.visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") + return 1 + return 0 + +//Breaks all grips and pulls that the mob currently has. +/mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) + var/success = 0 + if(pulling) + visible_message("[user] has broken [src]'s grip on [pulling]!") + success = 1 + stop_pulling() + + if(istype(l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/lgrab = l_hand + if(lgrab.affecting) + visible_message("[user] has broken [src]'s grip on [lgrab.affecting]!") + success = 1 + spawn(1) + qdel(lgrab) + if(istype(r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/rgrab = r_hand + if(rgrab.affecting) + visible_message("[user] has broken [src]'s grip on [rgrab.affecting]!") + success = 1 + spawn(1) + qdel(rgrab) + return success diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index e96e526077..04ca892225 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -319,7 +319,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t This function restores the subjects blood to max. */ /mob/living/carbon/human/proc/restore_blood() - if(!species.flags & NO_BLOOD) + if(!(species.flags & NO_BLOOD)) var/blood_volume = vessel.get_reagent_amount("blood") vessel.add_reagent("blood",560.0-blood_volume) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index de7a982b1a..c962b8355b 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -1,7 +1,7 @@ /mob/living/carbon/human/proc/update_eyes() - if(internal_organs_by_name["eyes"]) - var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"] - eyes.eye_colour = list(r_eyes,g_eyes,b_eyes) + var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"] + if(eyes) + eyes.update_colour() regenerate_icons() /mob/living/carbon/var/list/internal_organs = list() @@ -70,12 +70,12 @@ for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot")) var/obj/item/organ/external/E = organs_by_name[limb_tag] - if(!E) - stance_damage += 2 - else if (E.status & ORGAN_DESTROYED) + if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD))) stance_damage += 2 // let it fail even if just foot&leg - else if (E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || !E.is_usable()) + else if (E.is_malfunctioning() || E.is_broken() || !E.is_usable()) stance_damage += 1 + else if (E.is_dislocated()) + stance_damage += 0.5 // Canes and crutches help you stand (if the latter is ever added) // One cane mitigates a broken leg+foot, or a missing foot. @@ -102,10 +102,14 @@ if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED)) continue - if(E.is_broken()) + if(E.is_broken() || E.is_dislocated()) if(E.body_part == HAND_LEFT) + if(!l_hand) + continue drop_from_inventory(l_hand) else + if(!r_hand) + continue drop_from_inventory(r_hand) var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") @@ -125,7 +129,7 @@ spark_system.attach(src) spark_system.start() spawn(10) - del(spark_system) + qdel(spark_system) //Handles chem traces /mob/living/carbon/human/proc/handle_trace_chems() diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 10988afb92..0357d4ee09 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -218,4 +218,41 @@ log_say("PsychicWhisper: [key_name(src)]->[M.key] : [msg]") M << "\green You hear a strange, alien voice in your head... \italic [msg]" src << "\green You said: \"[msg]\" to [M]" - return \ No newline at end of file + return + +/mob/living/carbon/human/proc/diona_split_nymph() + set name = "Split" + set desc = "Split your humanoid form into its constituent nymphs." + set category = "Abilities" + + var/turf/T = get_turf(src) + + var/mob/living/carbon/alien/diona/S = new(T) + S.set_dir(dir) + if(mind) + mind.transfer_to(S) + + message_admins("\The [src] has split into nymphs; player now controls [key_name_admin(S)]") + log_admin("\The [src] has split into nymphs; player now controls [key_name(S)]") + + var/nymphs = 1 + + for(var/mob/living/carbon/alien/diona/D in src) + nymphs++ + D.loc = T + D.set_dir(pick(NORTH, SOUTH, EAST, WEST)) + + if(nymphs < 5) + for(var/i in nymphs to 4) + var/mob/M = new /mob/living/carbon/alien/diona(T) + M.set_dir(pick(NORTH, SOUTH, EAST, WEST)) + + + for(var/obj/item/W in src) + drop_from_inventory(W) + + visible_message("\The [src] quivers slightly, then splits apart with a wet slithering noise.") + + del(src) + + diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 5484508fe7..c19540c800 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -34,7 +34,7 @@ This saves us from having to call add_fingerprint() any time something is put in if (equip_to_slot_if_possible(W, slots[slot], del_on_fail = 0)) return slot if (del_on_fail) - del(W) + qdel(W) return null @@ -317,6 +317,48 @@ This saves us from having to call add_fingerprint() any time something is put in return 1 +//Checks if a given slot can be accessed at this time, either to equip or unequip I +/mob/living/carbon/human/slot_is_accessible(var/slot, var/obj/item/I, mob/user=null) + var/obj/item/covering = null + var/check_flags = 0 + + switch(slot) + if(slot_wear_mask) + covering = src.head + check_flags = HEADCOVERSMOUTH + if(slot_glasses) + covering = src.head + check_flags = HEADCOVERSEYES + if(slot_gloves, slot_w_uniform) + covering = src.wear_suit + + if(covering) + if((covering.body_parts_covered & I.body_parts_covered) || (covering.flags & check_flags)) + user << "\The [covering] is in the way." + return 0 + return 1 + +/mob/living/carbon/human/get_equipped_item(var/slot) + switch(slot) + if(slot_wear_suit) return wear_suit + if(slot_gloves) return gloves + if(slot_shoes) return shoes + if(slot_belt) return belt + if(slot_glasses) return glasses + if(slot_head) return head + if(slot_l_ear) return l_ear + if(slot_r_ear) return r_ear + if(slot_w_uniform) return w_uniform + if(slot_wear_id) return wear_id + if(slot_l_store) return l_store + if(slot_r_store) return r_store + if(slot_s_store) return s_store + if(slot_handcuffed) return handcuffed + if(slot_legcuffed) return legcuffed + return ..() + +///Bizarre equip effect system below + /* MouseDrop human inventory menu */ @@ -341,9 +383,9 @@ This saves us from having to call add_fingerprint() any time something is put in /obj/effect/equip_e/New() if (!ticker) - del(src) + qdel(src) spawn(100) - del(src) + qdel(src) ..() return @@ -354,22 +396,22 @@ This saves us from having to call add_fingerprint() any time something is put in switch(place) if("mask") if (!( target.wear_mask )) - del(src) + qdel(src) if("l_hand") if (!( target.l_hand )) - del(src) + qdel(src) if("r_hand") if (!( target.r_hand )) - del(src) + qdel(src) if("suit") if (!( target.wear_suit )) - del(src) + qdel(src) if("uniform") if (!( target.w_uniform )) - del(src) + qdel(src) if("back") if (!( target.back )) - del(src) + qdel(src) if("syringe") return if("pill") @@ -382,10 +424,10 @@ This saves us from having to call add_fingerprint() any time something is put in return if("handcuff") if (!( target.handcuffed )) - del(src) + qdel(src) if("id") if ((!( target.wear_id ) || !( target.w_uniform ))) - del(src) + qdel(src) if("splints") var/count = 0 for(var/organ in list("l_leg","r_leg","l_arm","r_arm")) @@ -394,19 +436,19 @@ This saves us from having to call add_fingerprint() any time something is put in count = 1 break if(count == 0) - del(src) + qdel(src) return if("sensor") if (! target.w_uniform ) - del(src) + qdel(src) if("internal") if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && (istype(target.back, /obj/item/weapon/tank) || istype(target.belt, /obj/item/weapon/tank) || istype(target.s_store, /obj/item/weapon/tank)) && !( target.internal )) ) && !( target.internal ))) - del(src) + qdel(src) var/list/L = list( "syringe", "pill", "drink", "dnainjector", "fuel", "sensor", "internal", "tie") if ((item && !( L.Find(place) ))) if(isrobot(source) && place != "handcuff") - del(src) + qdel(src) for(var/mob/O in viewers(target, null)) O.show_message("\red [source] is trying to put \a [item] on [target]", 1) else @@ -508,7 +550,7 @@ This saves us from having to call add_fingerprint() any time something is put in message = "\red [source] is trying to empty [target]'s pockets." if("CPR") if (!target.cpr_time) - del(src) + qdel(src) target.cpr_time = 0 message = "\red [source] is trying perform CPR on [target]!" if("internal") @@ -566,7 +608,7 @@ It can still be worn/put on as normal. if ((source.restrained() || source.stat)) return //Source restrained or unconscious / dead var/slot_to_process - var/strip_item //this will tell us which item we will be stripping - if any. + var/obj/item/strip_item //this will tell us which item we will be stripping - if any. switch(place) //here we go again... if("mask") @@ -607,13 +649,13 @@ It can still be worn/put on as normal. strip_item = target.shoes if("l_hand") if (istype(target, /obj/item/clothing/suit/straight_jacket)) - del(src) + qdel(src) slot_to_process = slot_l_hand if (target.l_hand) strip_item = target.l_hand if("r_hand") if (istype(target, /obj/item/clothing/suit/straight_jacket)) - del(src) + qdel(src) slot_to_process = slot_r_hand if (target.r_hand) strip_item = target.r_hand @@ -700,11 +742,11 @@ It can still be worn/put on as normal. S.add_fingerprint(source) if (!( istype(S, /obj/item/weapon/dnainjector) )) S.inuse = 0 - del(src) + qdel(src) S.inject(target, source) if (S.s_time >= world.time + 30) S.inuse = 0 - del(src) + qdel(src) S.s_time = world.time for(var/mob/O in viewers(source, null)) O.show_message("\red [source] injects [target] with the DNA Injector!", 1) @@ -748,19 +790,23 @@ It can still be worn/put on as normal. target.internals.icon_state = "internal1" if(slot_to_process) if(strip_item) //Stripping an item from the mob - var/obj/item/W = strip_item - target.remove_from_mob(W) - W.add_fingerprint(source) - if(slot_to_process == slot_l_store) //pockets! Needs to process the other one too. Snowflake code, wooo! It's not like anyone will rewrite this anytime soon. If I'm wrong then... CONGRATULATIONS! ;) - if(target.r_store) - target.remove_from_mob(target.r_store) //At this stage l_store is already processed by the code above, we only need to process r_store. - else - if(item && target.has_organ_for_slot(slot_to_process)) //Placing an item on the mob - if(item.mob_can_equip(target, slot_to_process, 0)) - source.remove_from_mob(item) - target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1) + if(strip_item.mob_can_unequip(target, slot_to_process, 0)) + target.drop_from_inventory(strip_item) + source.put_in_hands(strip_item) + strip_item.add_fingerprint(source) + if(slot_to_process == slot_l_store) //pockets! Needs to process the other one too. Snowflake code, wooo! It's not like anyone will rewrite this anytime soon. If I'm wrong then... CONGRATULATIONS! ;) + if(target.r_store) + target.drop_from_inventory(target.r_store) //At this stage l_store is already processed by the code above, we only need to process r_store. + else + source << "You fail to remove \the [strip_item] from [target]!" + else if(item) + if(target.has_organ_for_slot(slot_to_process) && item.mob_can_equip(target, slot_to_process, 0)) //Placing an item on the mob + source.drop_from_inventory(item) + target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1) + else + source << "You fail to place \the [item] on [target]!" if(source && target) if(source.machine == target) target.show_inv(source) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 10c22f6012..3843d68918 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -2,7 +2,7 @@ //NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! #define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. -#define HUMAN_CRIT_MAX_OXYLOSS ( (tickerProcess.getLastTickerTimeDuration()) / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. +#define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point @@ -389,7 +389,7 @@ // Lung damage increases the minimum safe pressure. if(species.has_organ["lungs"]) var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"] - if(!L) + if(isnull(L)) safe_pressure_min = INFINITY //No lungs, how are you breathing? else if(L.is_broken()) safe_pressure_min *= 1.5 @@ -974,7 +974,7 @@ else for(var/atom/a in hallucinations) - del a + qdel(a) if(halloss > 100) src << "You're in too much pain to keep going..." @@ -1404,7 +1404,7 @@ if(M.stat == 2) M.death(1) stomach_contents.Remove(M) - del(M) + qdel(M) continue if(air_master.current_cycle%3==1) if(!(M.status_flags & GODMODE)) diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index 290c81723e..b586a197c9 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -2,7 +2,7 @@ name = "fancy uniform" desc = "It looks like it was tailored for a monkey." icon_state = "punpun" - item_color = "punpun" + worn_state = "punpun" species_restricted = list("Monkey") /mob/living/carbon/human/monkey/punpun/New() diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 221fbc1224..10a2dca6aa 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -3,12 +3,11 @@ if(name != GetVoice()) alt_name = "(as [get_id_name("Unknown")])" - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - src << "You're muzzled and cannot speak!" - return - message = sanitize(message) - ..(message, alt_name = alt_name) //ohgod we should really be passing a datum here. + ..(message, alt_name = alt_name) + +/mob/living/carbon/human/is_muzzled() + return istype(src.wear_mask, /obj/item/clothing/mask/muzzle) /mob/living/carbon/human/proc/forcesay(list/append) if(stat == CONSCIOUS) diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm index fa40f8ee00..41349846eb 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm @@ -23,4 +23,4 @@ /datum/species/shadow/handle_death(var/mob/living/carbon/human/H) spawn(1) new /obj/effect/decal/cleanable/ash(H.loc) - del(H) \ No newline at end of file + qdel(H) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index c037d81fb7..a37e4c41b1 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -30,7 +30,7 @@ poison_type = "oxygen" siemens_coefficient = 0.2 - flags = IS_WHITELISTED | NO_SCAN | HAS_EYE_COLOR + flags = CAN_JOIN | IS_WHITELISTED | NO_SCAN | HAS_EYE_COLOR blood_color = "#2299FC" flesh_color = "#808D11" @@ -47,10 +47,14 @@ "liver" = /obj/item/organ/liver, "kidneys" = /obj/item/organ/kidneys, "brain" = /obj/item/organ/brain, - "eyes" = /obj/item/organ/eyes, - "stack" = /obj/item/organ/stack/vox + "eyes" = /obj/item/organ/eyes ) /datum/species/vox/get_random_name(var/gender) var/datum/language/species_language = all_languages[default_language] return species_language.get_random_name(gender) + +/datum/species/vox/can_shred(var/mob/living/carbon/human/H, var/ignore_intent) + if(!H.mind || !H.mind.special_role) // Pariah check. + return 0 + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index b97e8ceed6..5c01ea38b4 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -168,13 +168,17 @@ /datum/species/proc/get_random_name(var/gender) var/datum/language/species_language = all_languages[language] + if(!species_language) + species_language = all_languages[default_language] + if(!species_language) + return "unknown" return species_language.get_random_name(gender) /datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. for(var/obj/item/organ/organ in H.contents) if((organ in H.organs) || (organ in H.internal_organs)) - del(organ) + qdel(organ) if(H.organs) H.organs.Cut() if(H.internal_organs) H.internal_organs.Cut() diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index 0166900a0f..64e12eadfa 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -45,11 +45,8 @@ if(prob(1)) H.emote(pick("scratch","jump","roll","tail")) -/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H) - H.real_name = "[lowertext(name)] ([rand(100,999)])" - H.name = H.real_name - - ..() +/datum/species/monkey/get_random_name() + return "[lowertext(name)] ([rand(100,999)])" /datum/species/monkey/tajaran name = "Farwa" diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 62907752aa..ee8a1438d2 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -168,6 +168,10 @@ "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right) ) + inherent_verbs = list( + /mob/living/carbon/human/proc/diona_split_nymph + ) + warning_low_pressure = 50 hazard_low_pressure = -1 @@ -209,7 +213,7 @@ if(D.client) D.loc = H.loc else - del(D) + qdel(D) H.visible_message("\red[H] splits apart with a wet slithering noise!") diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm index 093025189b..c60d8bca1d 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm @@ -16,9 +16,9 @@ spawn(0) AddInfectionImages(affected_mob) else - del(src) + qdel(src) -/obj/item/alien_embryo/Del() +/obj/item/alien_embryo/Destroy() if(affected_mob) affected_mob.status_flags &= ~(XENO_HOST) spawn(0) @@ -98,7 +98,7 @@ new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention if(gib_on_success) affected_mob.gib() - del(src) + qdel(src) /*---------------------------------------- Proc: RefreshInfectionImage() @@ -114,7 +114,7 @@ Des: Removes all infection images from aliens and places an infection image on a if(alien.client) for(var/image/I in alien.client.images) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) + qdel(I) for(var/mob/living/L in mob_list) if(iscorgi(L) || iscarbon(L)) if(L.status_flags & XENO_HOST) @@ -156,4 +156,4 @@ Des: Removes the alien infection image from all aliens in the world located in p for(var/image/I in alien.client.images) if(I.loc == C) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) \ No newline at end of file + qdel(I) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm index 6fbdfa8ddb..bdc505fe34 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm @@ -41,7 +41,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(config.aliens_allowed) ..() else - del(src) + qdel(src) /obj/item/clothing/mask/facehugger/examine(mob/user) ..(user) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 913e3e71ad..e94db830d7 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -61,6 +61,9 @@ var/weeds_heal_rate = 1 // Health regen on weeds. var/weeds_plasma_rate = 5 // Plasma regen on weeds. +/datum/species/xenos/get_random_name() + return "alien [caste_name] ([alien_number])" + /datum/species/xenos/can_understand(var/mob/other) if(istype(other,/mob/living/carbon/alien/larva)) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index e1caf89324..4ef350ef88 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -45,7 +45,7 @@ Des: Removes all infected images from the alien. if (client) for(var/image/I in client.images) if(dd_hasprefix_case(I.icon_state, "infected")) - del(I) + qdel(I) return /* TODO: Convert this over. diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 148baf6618..155a1f23b7 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -41,12 +41,12 @@ if (target.l_hand) // Disarm left hand //Urist McAssistant dropped the macguffin with a scream just sounds odd. Plus it doesn't work with NO_PAIN - target.visible_message("\The [target.l_hand] was knocked right out of [src]'s grasp!") + target.visible_message("\The [target.l_hand] was knocked right out of [target]'s grasp!") target.drop_l_hand() if("r_arm", "r_hand") if (target.r_hand) // Disarm right hand - target.visible_message("\The [target.r_hand] was knocked right out of [src]'s grasp!") + target.visible_message("\The [target.r_hand] was knocked right out of [target]'s grasp!") target.drop_r_hand() if("chest") if(!target.lying) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 0882c558c7..d7776fa18d 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -237,24 +237,30 @@ var/global/list/damage_icon_parts = list() //CACHING: Generate an index key from visible bodyparts. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. - //Create a new, blank icon for our mob to use. if(stand_icon) - del(stand_icon) + qdel(stand_icon) stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank") + var/icon_key = "[species.race_key][g][s_tone][r_skin][g_skin][b_skin]" + var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"] - var/icon_key = "[species.race_key][g][s_tone]" - for(var/obj/item/organ/external/part in organs) - if(part.is_stump() || (part.status & ORGAN_DESTROYED)) - icon_key = "[icon_key]0" + if(eyes) + icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]" + else + icon_key += "#000000" + + for(var/organ_tag in species.has_limbs) + var/obj/item/organ/external/part = organs_by_name[organ_tag] + if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED)) + icon_key += "0" else if(part.status & ORGAN_ROBOT) - icon_key = "[icon_key]2[part.model ? "-[part.model]": ""]" + icon_key += "2[part.model ? "-[part.model]": ""]" else if(part.status & ORGAN_DEAD) - icon_key = "[icon_key]3" + icon_key += "3" else - icon_key = "[icon_key]1" + icon_key += "1" - icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0][s_tone]" + icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" var/icon/base_icon if(human_icon_cache[icon_key]) @@ -406,7 +412,7 @@ var/global/list/damage_icon_parts = list() if (targeted_by && target_locked) overlays_standing[TARGETED_LAYER] = target_locked else if (!targeted_by && target_locked) - del(target_locked) + qdel(target_locked) if (!targeted_by) overlays_standing[TARGETED_LAYER] = null if(update_icons) update_icons() @@ -451,37 +457,49 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1) if(w_uniform && istype(w_uniform, /obj/item/clothing/under) ) w_uniform.screen_loc = ui_iclothing - var/t_color = w_uniform.item_color - if(!t_color) t_color = icon_state - var/image/standing = image("icon_state" = "[t_color]_s") + //determine the icon to use + var/icon/under_icon if(w_uniform.icon_override) - standing.icon = w_uniform.icon_override + under_icon = w_uniform.icon_override else if(w_uniform.sprite_sheets && w_uniform.sprite_sheets[species.name]) - standing.icon = w_uniform.sprite_sheets[species.name] + under_icon = w_uniform.sprite_sheets[species.name] + else if(w_uniform.item_icons && w_uniform.item_icons[slot_w_uniform_str]) + under_icon = w_uniform.item_icons[slot_w_uniform_str] else - standing.icon = 'icons/mob/uniform.dmi' + under_icon = INV_W_UNIFORM_DEF_ICON + + //determine state to use + var/under_state + if(w_uniform.item_state_slots && w_uniform.item_state_slots[slot_w_uniform_str]) + under_state = w_uniform.item_state_slots[slot_w_uniform_str] + else if(w_uniform.item_state) + under_state = w_uniform.item_state + else + under_state = w_uniform.icon_state + //need to append _s to the icon state for legacy compatibility + var/image/standing = image(icon = under_icon, icon_state = "[under_state]_s") + + //apply blood overlay if(w_uniform.blood_DNA) - var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "uniformblood") + var/image/bloodsies = image(icon = species.blood_mask, icon_state = "uniformblood") bloodsies.color = w_uniform.blood_color standing.overlays += bloodsies - if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. - for(var/obj/item/clothing/accessory/A in w_uniform:accessories) - var/tie_color = A.item_color - if(!tie_color) tie_color = A.icon_state - standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]") + //accessories + var/obj/item/clothing/under/under = w_uniform + if(under.accessories.len) + for(var/obj/item/clothing/accessory/A in under.accessories) + var/accessory_state = A.overlay_state? A.overlay_state : A.icon_state + standing.overlays += image(icon = INV_ACCESSORIES_DEF_ICON, icon_state = accessory_state) overlays_standing[UNIFORM_LAYER] = standing else overlays_standing[UNIFORM_LAYER] = null - // This really, really seems like it should not be mixed in the middle of display code... - // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY - for( var/obj/item/thing in list(r_store, l_store, wear_id, belt) ) - if(thing) - remove_from_mob(thing) - if(update_icons) update_icons() + + if(update_icons) + update_icons() /mob/living/carbon/human/update_inv_wear_id(var/update_icons=1) if(wear_id) @@ -736,19 +754,38 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_back(var/update_icons=1) if(back) back.screen_loc = ui_back //TODO - var/obj/item/weapon/rig/rig = back + + //determine the icon to use + var/icon/overlay_icon if(back.icon_override) - overlays_standing[BACK_LAYER] = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]") - //If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc. - else if(istype(rig) && rig.mob_icon) - overlays_standing[BACK_LAYER] = rig.mob_icon + overlay_icon = back.icon_override + else if(istype(back, /obj/item/weapon/rig)) + //If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc. + var/obj/item/weapon/rig/rig = back + overlay_icon = rig.mob_icon else if(back.sprite_sheets && back.sprite_sheets[species.name]) - overlays_standing[BACK_LAYER] = image("icon" = back.sprite_sheets[species.name], "icon_state" = "[back.icon_state]") + overlay_icon = back.sprite_sheets[species.name] + else if(back.item_icons && (slot_back_str in back.item_icons)) + overlay_icon = back.item_icons[slot_back_str] else - overlays_standing[BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]") + overlay_icon = INV_BACK_DEF_ICON + + //determine state to use + var/overlay_state + if(back.item_state_slots && back.item_state_slots[slot_back_str]) + overlay_state = back.item_state_slots[slot_back_str] + else if(back.item_state) + overlay_state = back.item_state + else + overlay_state = back.icon_state + + //create the image + overlays_standing[BACK_LAYER] = image(icon = overlay_icon, icon_state = overlay_state) else - overlays_standing[BACK_LAYER] = null - if(update_icons) update_icons() + overlays_standing[BACK_LAYER] = null + + if(update_icons) + update_icons() /mob/living/carbon/human/update_hud() //TODO: do away with this if possible @@ -784,46 +821,62 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_r_hand(var/update_icons=1) if(r_hand) r_hand.screen_loc = ui_rhand //TODO - - var/t_icon = INV_R_HAND_DEF_ICON - if(r_hand.item_icons && (icon_r_hand in r_hand.item_icons)) - t_icon = r_hand.item_icons[icon_r_hand] - - var/t_state = r_hand.item_state //useful for clothing that changes icon_state but retains the same sprite on the mob when held in hand - if(!t_state) t_state = r_hand.icon_state - if(r_hand.icon_override) - t_state = "[t_state]_r" - overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.icon_override, "icon_state" = "[t_state]") - else - overlays_standing[R_HAND_LAYER] = image("icon" = t_icon, "icon_state" = "[t_state]") - if (handcuffed) drop_r_hand() + //determine icon to use + var/icon/t_icon + if(r_hand.icon_override) + t_icon = r_hand.icon_override + else if(r_hand.item_icons && (slot_r_hand_str in r_hand.item_icons)) + t_icon = r_hand.item_icons[slot_r_hand_str] + else + t_icon = INV_R_HAND_DEF_ICON + + //determine icon state to use + var/t_state + if(r_hand.item_state_slots && r_hand.item_state_slots[slot_r_hand_str]) + t_state = r_hand.item_state_slots[slot_r_hand_str] + else if(r_hand.item_state) + t_state = r_hand.item_state + else + t_state = r_hand.icon_state + + overlays_standing[R_HAND_LAYER] = image(icon = t_icon, icon_state = t_state) + + if (handcuffed) drop_r_hand() //this should be moved out of icon code else overlays_standing[R_HAND_LAYER] = null - + if(update_icons) update_icons() /mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) if(l_hand) l_hand.screen_loc = ui_lhand //TODO - - var/t_icon = INV_L_HAND_DEF_ICON - if(l_hand.item_icons && (icon_l_hand in l_hand.item_icons)) - t_icon = l_hand.item_icons[icon_l_hand] - - var/t_state = l_hand.item_state //useful for clothing that changes icon_state but retains the same sprite on the mob when held in hand - if(!t_state) t_state = l_hand.icon_state - if(l_hand.icon_override) - t_state = "[t_state]_l" - overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.icon_override, "icon_state" = "[t_state]") - else - overlays_standing[L_HAND_LAYER] = image("icon" = t_icon, "icon_state" = "[t_state]") - if (handcuffed) drop_l_hand() + //determine icon to use + var/icon/t_icon + if(l_hand.icon_override) + t_icon = l_hand.icon_override + else if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons)) + t_icon = l_hand.item_icons[slot_l_hand_str] + else + t_icon = INV_L_HAND_DEF_ICON + + //determine icon state to use + var/t_state + if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str]) + t_state = l_hand.item_state_slots[slot_l_hand_str] + else if(l_hand.item_state) + t_state = l_hand.item_state + else + t_state = l_hand.icon_state + + overlays_standing[L_HAND_LAYER] = image(icon = t_icon, icon_state = t_state) + + if (handcuffed) drop_l_hand() //This probably should not be here else overlays_standing[L_HAND_LAYER] = null - + if(update_icons) update_icons() /mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 2f67cbec85..7336189e11 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -143,7 +143,7 @@ //now mobs var/speech_bubble_test = say_test(message) var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]") - spawn(30) del(speech_bubble) + spawn(30) qdel(speech_bubble) for(var/mob/M in listening) M << speech_bubble diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/metroid/death.dm index 022726b00a..d5510ac509 100644 --- a/code/modules/mob/living/carbon/metroid/death.dm +++ b/code/modules/mob/living/carbon/metroid/death.dm @@ -10,14 +10,13 @@ is_adult = 0 maxHealth = 150 revive() - regenerate_icons() if (!client) rabid = 1 number = rand(1, 1000) name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" return . = ..(gibbed, "seizes up and falls limp...") - + mood = null regenerate_icons() return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm index 9f10399112..f7adc8b20f 100644 --- a/code/modules/mob/living/carbon/metroid/items.dm +++ b/code/modules/mob/living/carbon/metroid/items.dm @@ -23,7 +23,7 @@ user <<"You apply the enhancer. It now has triple the amount of uses." Uses = 3 enhanced = 1 - del(O) + qdel(O) /obj/item/slime_extract/New() ..() @@ -145,14 +145,14 @@ pet.icon_dead = "[M.colour] baby slime dead" pet.colour = "[M.colour]" user <<"You feed the slime the potion, removing it's powers and calming it." - del(M) + qdel(M) var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN) if (!newname) newname = "pet slime" pet.name = newname pet.real_name = newname - del(src) + qdel(src) /obj/item/weapon/slimepotion2 name = "advanced docility potion" @@ -176,14 +176,14 @@ pet.icon_dead = "[M.colour] baby slime dead" pet.colour = "[M.colour]" user <<"You feed the slime the potion, removing it's powers and calming it." - del(M) + qdel(M) var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN) if (!newname) newname = "pet slime" pet.name = newname pet.real_name = newname - del(src) + qdel(src) /obj/item/weapon/slimesteroid @@ -208,7 +208,7 @@ user <<"You feed the slime the steroid. It now has triple the amount of extract." M.cores = 3 - del(src) + qdel(src) /obj/item/weapon/slimesteroid2 name = "extract enhancer" @@ -227,7 +227,7 @@ user <<"You apply the enhancer. It now has triple the amount of uses." target.Uses = 3 target.enahnced = 1 - del(src)*/ + qdel(src)*/ /obj/effect/golemrune anchored = 1 @@ -268,7 +268,7 @@ G.set_species("Golem") G.key = ghost.key G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." - del (src) + qdel(src) proc/announce_to_ghosts() @@ -350,7 +350,7 @@ spawn(rand(50,100)) src.visible_message(" The [name] bursts open!") new/mob/living/carbon/slime(T) - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/egg/slime/process() diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 0e2a237372..ebbfb991d0 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -71,6 +71,7 @@ mutation_chance = rand(25, 35) var/sanitizedcolour = replacetext(colour, " ", "") coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + regenerate_icons() ..(location) /mob/living/carbon/slime/movement_delay() @@ -177,7 +178,7 @@ var/f_loss = null switch (severity) if (1.0) - del(src) + qdel(src) return if (2.0) diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index b2f8c2588f..b5fd583ade 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -161,7 +161,7 @@ src.mind.transfer_to(new_slime) else new_slime.key = src.key - del(src) + qdel(src) else src << "I am not ready to reproduce yet..." else diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/metroid/say.dm index f1a1761908..cd07f6bf3b 100644 --- a/code/modules/mob/living/carbon/metroid/say.dm +++ b/code/modules/mob/living/carbon/metroid/say.dm @@ -1,4 +1,7 @@ /mob/living/carbon/slime/say(var/message) + + message = sanitize(message) + var/verb = say_quote(message) if(copytext(message,1,2) == "*") diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm deleted file mode 100644 index 1b3da8f49a..0000000000 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ /dev/null @@ -1,141 +0,0 @@ -//Monkey Overlays Indexes//////// -#define M_MASK_LAYER 1 -#define M_BACK_LAYER 2 -#define M_HANDCUFF_LAYER 3 -#define M_L_HAND_LAYER 4 -#define M_R_HAND_LAYER 5 -#define TARGETED_LAYER 6 -#define M_FIRE_LAYER 6 -#define M_TOTAL_LAYERS 7 -///////////////////////////////// - -/mob/living/carbon/monkey - var/list/overlays_lying[M_TOTAL_LAYERS] - var/list/overlays_standing[M_TOTAL_LAYERS] - -/mob/living/carbon/monkey/regenerate_icons() - ..() - update_inv_wear_mask(0) - update_inv_back(0) - update_inv_r_hand(0) - update_inv_l_hand(0) - update_inv_handcuffed(0) - update_fire(0) - update_icons() - //Hud Stuff - update_hud() - return - -/mob/living/carbon/monkey/update_icons() - update_hud() - lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again - overlays.Cut() - for(var/image/I in overlays_standing) - overlays += I - - if(lying) - var/matrix/M = matrix() - M.Turn(90) - M.Translate(1,-6) - src.transform = M - else - var/matrix/M = matrix() - src.transform = M - - -//////// -/mob/living/carbon/monkey/update_inv_wear_mask(var/update_icons=1) - if( wear_mask && istype(wear_mask, /obj/item/clothing/mask) ) - overlays_standing[M_MASK_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]") - wear_mask.screen_loc = ui_monkey_mask - else - overlays_standing[M_MASK_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1) - if(r_hand) - var/t_icon = INV_R_HAND_DEF_ICON - if(r_hand.item_icons && (icon_r_hand in r_hand.item_icons)) - t_icon = r_hand.item_icons[icon_r_hand] - - var/t_state = r_hand.item_state - if(!t_state) t_state = r_hand.icon_state - - overlays_standing[M_R_HAND_LAYER] = image("icon" = t_icon, "icon_state" = t_state) - r_hand.screen_loc = ui_rhand - if (handcuffed) drop_r_hand() - else - overlays_standing[M_R_HAND_LAYER] = null - - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_l_hand(var/update_icons=1) - if(l_hand) - var/t_icon = INV_L_HAND_DEF_ICON - if(l_hand.item_icons && (icon_l_hand in l_hand.item_icons)) - t_icon = l_hand.item_icons[icon_l_hand] - - var/t_state = l_hand.item_state - if(!t_state) t_state = l_hand.icon_state - - overlays_standing[M_L_HAND_LAYER] = image("icon" = t_icon, "icon_state" = t_state) - l_hand.screen_loc = ui_lhand - if (handcuffed) drop_l_hand() - else - overlays_standing[M_L_HAND_LAYER] = null - - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_back(var/update_icons=1) - if(back) - overlays_standing[M_BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]") - back.screen_loc = ui_monkey_back - else - overlays_standing[M_BACK_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1) - if(handcuffed) - drop_r_hand() - drop_l_hand() - stop_pulling() - overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1") - else - overlays_standing[M_HANDCUFF_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_hud() - if (client) - client.screen |= contents - -//Call when target overlay should be added/removed -/mob/living/carbon/monkey/update_targeted(var/update_icons=1) - if (targeted_by && target_locked) - overlays_standing[TARGETED_LAYER] = target_locked - else if (!targeted_by && target_locked) - del(target_locked) - if (!targeted_by) - overlays_standing[TARGETED_LAYER] = null - if(update_icons) update_icons() - -/mob/living/carbon/monkey/update_fire(var/update_icons=1) - if(on_fire) - overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER) - else - overlays_standing[M_FIRE_LAYER] = null - if(update_icons) update_icons() -//Monkey Overlays Indexes//////// -#undef M_MASK_LAYER -#undef M_BACK_LAYER -#undef M_HANDCUFF_LAYER -#undef M_L_HAND_LAYER -#undef M_R_HAND_LAYER -#undef TARGETED_LAYER -#undef M_FIRE_LAYER -#undef M_TOTAL_LAYERS - diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm new file mode 100644 index 0000000000..95ee36b1f6 --- /dev/null +++ b/code/modules/mob/living/carbon/resist.dm @@ -0,0 +1,170 @@ + +/mob/living/carbon/process_resist() + + //drop && roll + if(on_fire) + fire_stacks -= 2 //reduced + Weaken(3) + spin(32,2) + visible_message( + "[src] rolls on the floor, trying to put themselves out!", + "You stop, drop, and roll!" + ) + sleep(30) + if(fire_stacks <= 0) + visible_message( + "[src] has successfully extinguished themselves!", + "You extinguish yourself." + ) + ExtinguishMob() + return + + if(handcuffed) + spawn() escape_handcuffs() + else if(legcuffed) + spawn() escape_legcuffs() + + ..() + +/mob/living/carbon/proc/escape_handcuffs() + if(!(last_special <= world.time)) return + + next_move = world.time + 100 + last_special = world.time + 100 + + if(can_break_cuffs()) //Don't want to do a lot of logic gating here. + break_handcuffs() + return + + var/obj/item/weapon/handcuffs/HC = handcuffed + + //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type + var/breakouttime = 1200 + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... + if(istype(HC)) + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + + visible_message( + "[src] attempts to remove \the [HC]!", + "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + ) + + if(do_after(src, breakouttime)) + if(!handcuffed || buckled) + return + visible_message( + "[src] manages to remove \the [handcuffed]!", + "You successfully remove \the [handcuffed]." + ) + drop_from_inventory(handcuffed) + +/mob/living/carbon/proc/escape_legcuffs() + if(!(last_special <= world.time)) return + + next_move = world.time + 100 + last_special = world.time + 100 + + if(can_break_cuffs()) //Don't want to do a lot of logic gating here. + break_legcuffs() + return + + var/obj/item/weapon/legcuffs/HC = legcuffed + + //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type + var/breakouttime = 1200 + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... + if(istype(HC)) + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + + visible_message( + "[usr] attempts to remove \the [HC]!", + "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + ) + + if(do_after(src, breakouttime)) + if(!legcuffed || buckled) + return + visible_message( + "[src] manages to remove \the [legcuffed]!", + "You successfully remove \the [legcuffed]." + ) + + drop_from_inventory(legcuffed) + legcuffed = null + update_inv_legcuffed() + +/mob/living/carbon/proc/can_break_cuffs() + if(HULK in mutations) + return 1 + +/mob/living/carbon/proc/break_handcuffs() + visible_message( + "[src] is trying to break \the [handcuffed]!", + "You attempt to break your [handcuffed.name]. (This will take around 5 seconds and you need to stand still)" + ) + + if(do_after(src, 50)) + if(!handcuffed || buckled) + return + + visible_message( + "[src] manages to break \the [handcuffed]!", + "You successfully break your [handcuffed.name]." + ) + + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + + del(handcuffed) + handcuffed = null + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() + update_inv_handcuffed() + +/mob/living/carbon/proc/break_legcuffs() + src << "You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" + visible_message("[src] is trying to break the legcuffs!") + + if(do_after(src, 50)) + if(!legcuffed || buckled) + return + + visible_message( + "[src] manages to break the legcuffs!", + "You successfully break your legcuffs." + ) + + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + + del(legcuffed) + legcuffed = null + update_inv_legcuffed() + +/mob/living/carbon/human/can_break_cuffs() + if(species.can_shred(src,1)) + return 1 + return ..() + +/mob/living/carbon/escape_buckle() + if(!buckled) return + if(!(last_special <= world.time)) return + + if(!restrained()) + ..() + else + next_move = world.time + 100 + last_special = world.time + 100 + visible_message( + "[usr] attempts to unbuckle themself!", + "You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" + ) + + if(do_after(usr, 1200)) + if(!buckled) + return + visible_message("[usr] manages to unbuckle themself!", + "You successfully unbuckle yourself.") + buckled.user_unbuckle_mob(src) diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index a83e76ef76..b020bf0a54 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -36,12 +36,8 @@ if(istype(src,/mob/living/carbon/human)) var/mob/living/carbon/human/M = src for(var/obj/item/organ/external/organ in M.organs) - if (!organ) - continue - else if(organ.status & ORGAN_BROKEN || organ.open) + if(organ && (organ.is_broken() || organ.open)) src.traumatic_shock += 30 - if(organ.status & ORGAN_SPLINTED) - src.traumatic_shock -= 25 if(src.traumatic_shock < 0) src.traumatic_shock = 0 diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm new file mode 100644 index 0000000000..eb4d3d032f --- /dev/null +++ b/code/modules/mob/living/default_language.dm @@ -0,0 +1,25 @@ +/mob/living + var/datum/language/default_language + +/mob/living/verb/set_default_language(language as null|anything in languages) + set name = "Set Default Language" + set category = "IC" + + if(language) + src << "You will now speak [language] if you do not specify a language when speaking." + else + src << "You will now speak whatever your standard default language is if you do not specify one when speaking." + default_language = language + +// Silicons can't neccessarily speak everything in their languages list +/mob/living/silicon/set_default_language(language as null|anything in speech_synthesizer_langs) + ..() + +/mob/living/verb/check_default_language() + set name = "Check Default Language" + set category = "IC" + + if(default_language) + src << "You are currently speaking [default_language] by default." + else + src << "Your current default language is your species or mob type default." diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0bf4978297..d723cb5556 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -376,7 +376,8 @@ default behaviour is: /mob/living/proc/revive() rejuvenate() - buckled = initial(src.buckled) + if(buckled) + buckled.unbuckle_mob() if(iscarbon(src)) var/mob/living/carbon/C = src @@ -511,7 +512,7 @@ default behaviour is: for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1) //G = null - del(G) + qdel(G) else ok = 0 if (locate(/obj/item/weapon/grab, M.grabbed_by.len)) @@ -570,284 +571,84 @@ default behaviour is: set name = "Resist" set category = "IC" - if(usr.stat || !isliving(usr) || usr.next_move > world.time) - return + if(can_resist()) + next_move = world.time + 20 + process_resist() - usr.next_move = world.time + 20 - - var/mob/living/L = usr +/mob/living/proc/can_resist() + //need to allow !canmove, or otherwise neck grabs can't be resisted + //so just check weakened instead. + if(stat || weakened) + return 0 + if(next_move > world.time) + return 0 + return 1 +/mob/living/proc/process_resist() //Getting out of someone's inventory. - if(istype(src.loc,/obj/item/weapon/holder)) - var/obj/item/weapon/holder/H = src.loc //Get our item holder. - var/mob/M = H.loc //Get our mob holder (if any). - - if(istype(M)) - M.drop_from_inventory(H) - M << "[H] wriggles out of your grip!" - src << "You wriggle out of [M]'s grip!" - else if(istype(H.loc,/obj/item)) - src << "You struggle free of [H.loc]." - H.loc = get_turf(H) - - if(istype(M)) - for(var/atom/A in M.contents) - if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) - return - - M.status_flags &= ~PASSEMOTES + if(istype(src.loc, /obj/item/weapon/holder)) + escape_inventory(src.loc) return - //Resisting control by an alien mind. - if(istype(src.loc,/mob/living/simple_animal/borer)) - var/mob/living/simple_animal/borer/B = src.loc - var/mob/living/captive_brain/H = src - - H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." - B.host << "You feel the captive mind of [src] begin to resist your control." - - spawn(rand(200,250)+B.host.brainloss) - - if(!B || !B.controlling) - return - - B.host.adjustBrainLoss(rand(5,10)) - H << "With an immense exertion of will, you regain control of your body!" - B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." - - B.detatch() - - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae - - return - //resisting grabs (as if it helps anyone...) - if ((!( L.stat ) && !( L.restrained() ))) - var/resisting = 0 - for(var/obj/O in L.requests) - L.requests.Remove(O) - del(O) - resisting++ - for(var/obj/item/weapon/grab/G in usr.grabbed_by) - resisting++ - switch(G.state) - if(GRAB_PASSIVE) - del(G) - if(GRAB_AGGRESSIVE) - if(prob(60)) //same chance of breaking the grab as disarm - L.visible_message("[L] has broken free of [G.assailant]'s grip!") - del(G) - if(GRAB_NECK) - //If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun. - if (((world.time - G.assailant.l_move_time < 30 || !L.stunned) && prob(15)) || prob(3)) - L.visible_message("[L] has broken free of [G.assailant]'s headlock!") - del(G) - if(resisting) - L.visible_message("[L] resists!") - + if (!restrained()) + resist_grab() //unbuckling yourself - if(L.buckled && (L.last_special <= world.time) ) - if(iscarbon(L)) - var/mob/living/carbon/C = L - if( C.handcuffed ) - C.next_move = world.time + 100 - C.last_special = world.time + 100 - C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" - for(var/mob/O in viewers(L)) - O.show_message("\red [usr] attempts to unbuckle themself!", 1) - spawn(0) - if(do_after(usr, 1200)) - if(!C.buckled) - return - for(var/mob/O in viewers(C)) - O.show_message("\red [usr] manages to unbuckle themself!", 1) - C << "\blue You successfully unbuckle yourself." - C.buckled.user_unbuckle_mob(C) - else - L.buckled.user_unbuckle_mob(L) + if(buckled) + spawn() escape_buckle() //Breaking out of a locker? - else if( src.loc && (istype(src.loc, /obj/structure/closet)) ) - var/breakout_time = 2 //2 minutes by default + if( src.loc && (istype(src.loc, /obj/structure/closet)) ) + var/obj/structure/closet/C = loc + spawn() C.mob_breakout(src) - var/obj/structure/closet/C = L.loc - if(C.opened) - return //Door's open... wait, why are you in it's contents then? - if(istype(L.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - if(!SC.locked && !SC.welded) - return //It's a secure closet, but isn't locked. Easily escapable from, no need to 'resist' - else - if(!C.welded) - return //closed but not welded... - // else Meh, lets just keep it at 2 minutes for now - // breakout_time++ //Harder to get out of welded lockers than locked lockers +/mob/living/proc/escape_inventory(obj/item/weapon/holder/H) + if(H != src.loc) return + + var/mob/M = H.loc //Get our mob holder (if any). - //okay, so the closet is either welded or locked... resist!!! - usr.next_move = world.time + 100 - L.last_special = world.time + 100 - L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)" - for(var/mob/O in viewers(usr.loc)) - O.show_message("\red The [L.loc] begins to shake violently!", 1) + if(istype(M)) + M.drop_from_inventory(H) + M << "[H] wriggles out of your grip!" + src << "You wriggle out of [M]'s grip!" + else if(istype(H.loc,/obj/item)) + src << "You struggle free of [H.loc]." + H.loc = get_turf(H) + if(istype(M)) + for(var/atom/A in M.contents) + if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) + return - spawn(0) - if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds - if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened - return + M.status_flags &= ~PASSEMOTES - //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... - if(istype(L.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - if(!SC.locked && !SC.welded) - return - else - if(!C.welded) - return +/mob/living/proc/escape_buckle() + if(buckled) + buckled.user_unbuckle_mob(src) - //Well then break it! - if(istype(usr.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - SC.desc = "It appears to be broken." - SC.icon_state = SC.icon_off - flick(SC.icon_broken, SC) - sleep(10) - flick(SC.icon_broken, SC) - sleep(10) - SC.broken = 1 - SC.locked = 0 - SC.update_icon() - usr << "\red You successfully break out!" - for(var/mob/O in viewers(L.loc)) - O.show_message("\red \the [usr] successfully broke out of \the [SC]!", 1) - if(istype(SC.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace) - var/obj/structure/bigDelivery/BD = SC.loc - BD.attack_hand(usr) - SC.open() - else - C.welded = 0 - C.update_icon() - usr << "\red You successfully break out!" - for(var/mob/O in viewers(L.loc)) - O.show_message("\red \the [usr] successfully broke out of \the [C]!", 1) - if(istype(C.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above - var/obj/structure/bigDelivery/BD = C.loc - BD.attack_hand(usr) - C.open() - - //drop && roll or breaking out of handcuffs - else if(iscarbon(L)) - var/mob/living/carbon/CM = L - if(CM.on_fire && CM.canmove) - CM.fire_stacks -= 5 - CM.Weaken(3) - CM.spin(32,2) - CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \ - "You stop, drop, and roll!") - sleep(30) - if(fire_stacks <= 0) - CM.visible_message("[CM] has successfully extinguished themselves!", \ - "You extinguish yourself.") - ExtinguishMob() - return - if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - - var/can_break_cuffs - if(HULK in usr.mutations) - can_break_cuffs = 1 - else if(istype(CM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = CM - if(H.species.can_shred(H,1)) - can_break_cuffs = 1 - - if(can_break_cuffs) //Don't want to do a lot of logic gating here. - usr << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] is trying to break the handcuffs!", CM), 1) - spawn(0) - if(do_after(CM, 50)) - if(!CM.handcuffed || CM.buckled) - return - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] manages to break the handcuffs!", CM), 1) - CM << "\red You successfully break your handcuffs." - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.handcuffed) - CM.handcuffed = null - if(buckled && buckled.buckle_require_restraints) - buckled.unbuckle_mob() - CM.update_inv_handcuffed() - else - var/obj/item/weapon/handcuffs/HC = CM.handcuffed - var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to remove \the [HC]!", 1) - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.handcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to remove the handcuffs!", 1) - CM << "\blue You successfully remove \the [CM.handcuffed]." - CM.drop_from_inventory(CM.handcuffed) - - else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - - var/can_break_cuffs - if(HULK in usr.mutations) - can_break_cuffs = 1 - else if(istype(CM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = CM - if(H.species.can_shred(H,1)) - can_break_cuffs = 1 - - if(can_break_cuffs) //Don't want to do a lot of logic gating here. - usr << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] is trying to break the legcuffs!", CM), 1) - spawn(0) - if(do_after(CM, 50)) - if(!CM.legcuffed || CM.buckled) - return - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] manages to break the legcuffs!", CM), 1) - CM << "\red You successfully break your legcuffs." - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.legcuffed) - CM.legcuffed = null - CM.update_inv_legcuffed() - else - var/obj/item/weapon/legcuffs/HC = CM.legcuffed - var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to remove \the [HC]!", 1) - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.legcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to remove the legcuffs!", 1) - CM << "\blue You successfully remove \the [CM.legcuffed]." - CM.drop_from_inventory(CM.legcuffed) - CM.legcuffed = null - CM.update_inv_legcuffed() +/mob/living/proc/resist_grab() + var/resisting = 0 + for(var/obj/O in requests) + requests.Remove(O) + qdel(O) + resisting++ + for(var/obj/item/weapon/grab/G in grabbed_by) + resisting++ + switch(G.state) + if(GRAB_PASSIVE) + qdel(G) + if(GRAB_AGGRESSIVE) + if(prob(60)) //same chance of breaking the grab as disarm + visible_message("[src] has broken free of [G.assailant]'s grip!") + qdel(G) + if(GRAB_NECK) + //If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun. + if (((world.time - G.assailant.l_move_time < 30 || !stunned) && prob(15)) || prob(3)) + visible_message("[src] has broken free of [G.assailant]'s headlock!") + qdel(G) + if(resisting) + visible_message("[src] resists!") /mob/living/verb/lay_down() set name = "Rest" diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index e3ce0c9302..1518e72ff4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -52,6 +52,7 @@ if(istype(get_active_hand(),/obj/item/device/assembly/signaler)) var/obj/item/device/assembly/signaler/signaler = get_active_hand() if(signaler.deadman && prob(80)) + log_and_message_admins("has triggered a signaler deadman's switch") src.visible_message("\red [src] triggers their deadman's switch!") signaler.signal() @@ -59,7 +60,7 @@ if(P.taser_effect) stun_effect_act(0, P.agony, def_zone, P) src <<"\red You have been hit by [P]!" - del P + qdel(P) return //Armor diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 3771bc135e..8a01f86774 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -22,9 +22,6 @@ var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. - //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. - var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas. - var/t_phoron = null var/t_oxygen = null var/t_sl_gas = null diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 1ce1085648..8919ab0952 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -80,7 +80,10 @@ proc/get_radio_key_from_channel(var/channel) if(dongle.translate_binary) return 1 /mob/living/proc/get_default_language() - return null + return default_language + +/mob/living/proc/is_muzzled() + return 0 /mob/living/proc/handle_speech_problems(var/message, var/verb) var/list/returns[3] @@ -135,6 +138,10 @@ proc/get_radio_key_from_channel(var/channel) return say_dead(message) return + if(is_muzzled()) + src << "You're muzzled and cannot speak!" + return + var/message_mode = parse_message_mode(message, "headset") switch(copytext(message,1,2)) @@ -256,7 +263,7 @@ proc/get_radio_key_from_channel(var/channel) var/speech_bubble_test = say_test(message) var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]") - spawn(30) del(speech_bubble) + spawn(30) qdel(speech_bubble) for(var/mob/M in listening) M << speech_bubble diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f84f10aaa7..d476eb4f12 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -6,6 +6,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/ai_announcement, /mob/living/silicon/ai/proc/ai_call_shuttle, // /mob/living/silicon/ai/proc/ai_recall_shuttle, + /mob/living/silicon/ai/proc/ai_emergency_message, /mob/living/silicon/ai/proc/ai_camera_track, /mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_goto_location, @@ -45,7 +46,7 @@ var/list/ai_verbs_default = list( density = 1 status_flags = CANSTUN|CANPARALYSE|CANPUSH shouldnt_see = list(/obj/effect/rune) - var/list/network = list("SS13") + var/list/network = list("Exodus") var/obj/machinery/camera/camera = null var/list/connected_robots = list() var/aiRestorePowerRoutine = 0 @@ -55,7 +56,6 @@ var/list/ai_verbs_default = list( var/obj/item/device/multitool/aiMulti = null var/obj/item/device/radio/headset/heads/ai_integrated/aiRadio = null var/custom_sprite = 0 //For our custom sprites - var/apc_override = 0 //hack for letting the AI use its APC even when visionless var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through. var/datum/trackable/track = null var/last_announcement = "" @@ -82,13 +82,11 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/add_ai_verbs() src.verbs |= ai_verbs_default - src.verbs |= ai_verbs_subsystems - src.verbs |= silicon_verbs_subsystems + src.verbs |= silicon_subsystems /mob/living/silicon/ai/proc/remove_ai_verbs() src.verbs -= ai_verbs_default - src.verbs -= ai_verbs_subsystems - src.verbs -= silicon_verbs_subsystems + src.verbs -= silicon_subsystems /mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0) announcement = new() @@ -148,7 +146,7 @@ var/list/ai_verbs_default = list( if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. empty_playable_ai_cores += new/obj/structure/AIcore/deactivated(loc)//New empty terminal. - del(src)//Delete AI. + qdel(src)//Delete AI. return else if (B.brainmob.mind) @@ -198,9 +196,9 @@ var/list/ai_verbs_default = list( job = "AI" -/mob/living/silicon/ai/Del() +/mob/living/silicon/ai/Destroy() ai_list -= src - del(eyeobj) + qdel(eyeobj) ..() /mob/living/silicon/ai/pointed(atom/A as mob|obj|turf in view()) @@ -236,7 +234,7 @@ var/list/ai_verbs_default = list( powered_ai = ai powered_ai.psupply = src if(isnull(powered_ai)) - Del() + qdel(src) loc = powered_ai.loc use_power(1) // Just incase we need to wake up the power system. @@ -245,7 +243,7 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply/process() if(!powered_ai || powered_ai.stat & DEAD) - Del() + qdel() if(powered_ai.APU_power) use_power = 0 return @@ -370,6 +368,30 @@ var/list/ai_verbs_default = list( if(confirm == "Yes") cancel_call_proc(src) +/mob/living/silicon/ai/var/emergency_message_cooldown = 0 +/mob/living/silicon/ai/proc/ai_emergency_message() + set category = "AI Commands" + set name = "Send Emergency Message" + + if(check_unable(AI_CHECK_WIRELESS)) + return + if(!is_relay_online()) + usr <<"No Emergency Bluespace Relay detected. Unable to transmit message." + return + if(emergency_message_cooldown) + usr << "Arrays recycling. Please stand by." + return + var/input = input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") + if(!input) + return + Centcomm_announce(input, usr) + usr << "Message transmitted." + log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]") + emergency_message_cooldown = 1 + spawn(300) + emergency_message_cooldown = 0 + + /mob/living/silicon/ai/check_eye(var/mob/user as mob) if (!camera) return null @@ -464,41 +486,41 @@ var/list/ai_verbs_default = list( //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead //Addition by Mord_Sith to define AI's network change ability -/mob/living/silicon/ai/proc/ai_network_change() - set category = "AI Commands" - set name = "Jump To Network" - unset_machine() - var/cameralist[0] - +/mob/living/silicon/ai/proc/get_camera_network_list() if(check_unable()) return - var/mob/living/silicon/ai/U = usr - + var/list/cameralist = new() for (var/obj/machinery/camera/C in cameranet.cameras) if(!C.can_use()) continue - var/list/tempnetwork = difflist(C.network,restricted_camera_networks,1) - if(tempnetwork.len) - for(var/i in tempnetwork) - cameralist[i] = i - var/old_network = network - network = input(U, "Which network would you like to view?") as null|anything in cameralist + for(var/i in tempnetwork) + cameralist[i] = i - if(!U.eyeobj) - U.view_core() + cameralist = sortAssoc(cameralist) + return cameralist + +/mob/living/silicon/ai/proc/ai_network_change(var/network in get_camera_network_list()) + set category = "AI Commands" + set name = "Jump To Network" + unset_machine() + + if(!network) return - if(isnull(network)) - network = old_network // If nothing is selected - else - for(var/obj/machinery/camera/C in cameranet.cameras) - if(!C.can_use()) - continue - if(network in C.network) - U.eyeobj.setLoc(get_turf(C)) - break + if(!eyeobj) + view_core() + return + + src.network = network + + for(var/obj/machinery/camera/C in cameranet.cameras) + if(!C.can_use()) + continue + if(network in C.network) + eyeobj.setLoc(get_turf(C)) + break src << "\blue Switched to [network] camera network." //End of code by Mord_Sith @@ -533,7 +555,7 @@ var/list/ai_verbs_default = list( input = input("Select a crew member:") as null|anything in personnel_list var/icon/character_icon = personnel_list[input] if(character_icon) - del(holo_icon)//Clear old icon so we're not storing it in memory. + qdel(holo_icon)//Clear old icon so we're not storing it in memory. holo_icon = getHologramIcon(icon(character_icon)) else alert("No suitable records found. Aborting.") @@ -546,7 +568,7 @@ var/list/ai_verbs_default = list( ) input = input("Please select a hologram:") as null|anything in icon_list if(input) - del(holo_icon) + qdel(holo_icon) switch(input) if("default") holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1")) @@ -647,14 +669,14 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/check_unable(var/flags = 0) if(stat == DEAD) - usr << "\red You are dead!" + src << "You are dead!" return 1 if((flags & AI_CHECK_WIRELESS) && src.control_disabled) - usr << "\red Wireless control is disabled!" + src << "Wireless control is disabled!" return 1 if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi) - src << "\red System Error - Transceiver Disabled!" + src << "System Error - Transceiver Disabled!" return 1 return 0 @@ -793,4 +815,4 @@ var/list/ai_verbs_default = list( psupply = new/obj/machinery/ai_powersupply(src) #undef AI_CHECK_WIRELESS -#undef AI_CHECK_RADIO \ No newline at end of file +#undef AI_CHECK_RADIO diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index efa4ccd4a4..7c60bb75e4 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -34,10 +34,10 @@ var/global/list/empty_playable_ai_cores = list() job_master.FreeRole(job) if(mind.objectives.len) - del(mind.objectives) + qdel(mind.objectives) mind.special_role = null clear_antag_roles(mind) ghostize(0) - del(src) + qdel(src) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index df323f0910..cfc74cbaa3 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -74,8 +74,7 @@ else var/area/current_area = get_area(src) - if ((((!loc.master.power_equip) && current_area.requires_power == 1 || istype(T, /turf/space)) && !istype(src.loc,/obj/item)) && !APU_power) - //If our area lacks equipment power, and is not magically powered (i.e. centcom), or if we are in space and not carded and without active APU, lose power. + if (lacks_power()) if (src:aiRestorePowerRoutine==0) src:aiRestorePowerRoutine = 1 @@ -143,10 +142,9 @@ sleep(50) src << "Receiving control information from APC." sleep(2) - //bring up APC dialog - apc_override = 1 - theAPC.attack_ai(src) - apc_override = 0 + theAPC.operating = 1 + theAPC.equipment = 3 + theAPC.update() src:aiRestorePowerRoutine = 3 src << "Here are your current laws:" src.show_laws() @@ -161,6 +159,13 @@ if (MED_HUD) process_med_hud(src,0,src.eyeobj) +/mob/living/silicon/ai/proc/lacks_power() + if(APU_power) + return 1 + var/turf/T = get_turf(src) + var/area/A = get_area(src) + return ((!A.master.power_equip) && A.requires_power == 1 || istype(T, /turf/space)) && !istype(src.loc,/obj/item) + /mob/living/silicon/ai/updatehealth() if(status_flags & GODMODE) health = 100 diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index b5b6808bac..5336cd873f 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -1,9 +1,7 @@ /mob/living/silicon/ai/Login() //ThisIsDumb(TM) TODO: tidy this up ¬_¬ ~Carn ..() - for(var/obj/effect/rune/rune in world) - var/image/blood = image(loc = rune) - blood.override = 1 - client.images += blood + for(var/obj/effect/rune/rune in rune_list) + client.images += rune.blood_image regenerate_icons() flash = new /obj/screen() flash.icon_state = "blank" diff --git a/code/modules/mob/living/silicon/ai/subsystems.dm b/code/modules/mob/living/silicon/ai/subsystems.dm deleted file mode 100644 index af2f2f5b2c..0000000000 --- a/code/modules/mob/living/silicon/ai/subsystems.dm +++ /dev/null @@ -1,36 +0,0 @@ -/mob/living/silicon/ai - var/list/ai_verbs_subsystems = list( - /mob/living/silicon/ai/proc/subsystem_crew_monitor, - /mob/living/silicon/ai/proc/subsystem_power_monitor, - /mob/living/silicon/ai/proc/subsystem_rcon - ) - - var/obj/nano_module/crew_monitor/crew_monitor - var/obj/nano_module/rcon/rcon - var/obj/nano_module/power_monitor/power_monitor - -/mob/living/silicon/ai/init_subsystems() - ..() - del(alarm_monitor) - alarm_monitor = new/obj/nano_module/alarm_monitor/ai(src) - crew_monitor = new(src) - rcon = new(src) - power_monitor = new(src) - -/mob/living/silicon/ai/proc/subsystem_crew_monitor() - set category = "Subystems" - set name = "Crew Monitor" - - crew_monitor.ui_interact(usr) - -/mob/living/silicon/ai/proc/subsystem_power_monitor() - set category = "Subystems" - set name = "Power Monitor" - - power_monitor.ui_interact(usr) - -/mob/living/silicon/ai/proc/subsystem_rcon() - set category = "Subystems" - set name = "RCON" - - rcon.ui_interact(usr) diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 87e70393d0..920a3a1658 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -3,11 +3,11 @@ card.removePersonality() if(gibbed) src.loc = get_turf(card) - del(card) + qdel(card) else close_up() if(mind) - del(mind) + qdel(mind) ..(gibbed) ghostize() - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 6c099af932..fe426c36d0 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -8,7 +8,7 @@ var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) M.show_message("\red The data cable rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2) - del(src.cable) + qdel(src.cable) regular_hud_updates() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index edfe9bea0b..25c8f82701 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -101,7 +101,6 @@ /mob/living/silicon/pai/Login() ..() - usr << browse_rsc('html/paigrid.png') // Go ahead and cache the interface resources as early as possible // this function shows the information about being silenced as a pAI in the Status panel @@ -117,10 +116,6 @@ if (src.client.statpanel == "Status") show_silenced() - if (proc_holder_list.len)//Generic list for proc_holder objects. - for(var/obj/effect/proc_holder/P in proc_holder_list) - statpanel("[P.panel]","",P) - /mob/living/silicon/pai/check_eye(var/mob/user as mob) if (!src.current) return null diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 195d58fb34..294ee51562 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -55,9 +55,9 @@ var/datum/paiController/paiController // Global handler for pAI candidates switch(option) if("name") - t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text + t = sanitizeSafe(input("Enter a name for your pAI", "pAI Name", candidate.name) as text, MAX_NAME_LEN) if(t) - candidate.name = sanitizeSafe(t, MAX_NAME_LEN) + candidate.name = t if("desc") t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message if(t) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index b78deedf7a..0d70692b13 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -29,7 +29,7 @@ var/obj/item/robot_parts/robot_component/comp = wrapped brokenstate = comp.icon_state_broken if(wrapped) - del wrapped + qdel(wrapped) wrapped = new/obj/item/broken_device diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index ca3c80d3a7..3dd2afd216 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,7 +1,7 @@ /mob/living/silicon/robot/dust() //Delete the MMI first so that it won't go popping out. if(mmi) - del(mmi) + qdel(mmi) ..() /mob/living/silicon/robot/death(gibbed) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 68396cba33..77bb2b466d 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -14,7 +14,7 @@ lawupdate = 0 density = 1 req_access = list(access_engine, access_robotics) - integrated_light_power = 2 + integrated_light_power = 3 local_transmit = 1 mob_bump_flag = SIMPLE_ANIMAL @@ -24,6 +24,11 @@ //Used for self-mailing. var/mail_destination = "" + var/obj/machinery/drone_fabricator/master_fabricator + var/law_type = /datum/ai_laws/drone + var/module_type = /obj/item/weapon/robot_module/drone + var/can_pull_size = 2 + var/can_pull_mobs holder_type = /obj/item/weapon/holder/drone @@ -36,9 +41,6 @@ add_language("Robot Talk", 0) add_language("Drone Talk", 1) - if(camera && "Robots" in camera.network) - camera.add_network("Engineering") - //They are unable to be upgraded, so let's give them a bit of a better battery. cell.maxcharge = 10000 cell.charge = 10000 @@ -52,16 +54,18 @@ C.max_damage = 10 verbs -= /mob/living/silicon/robot/verb/Namepick - module = new /obj/item/weapon/robot_module/drone(src) - - //Some tidying-up. - flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT logo and the subscript: 'NanoTrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'" updateicon() /mob/living/silicon/robot/drone/init() - laws = new /datum/ai_laws/drone() + if(!laws) laws = new law_type + if(!module) module = new module_type(src) + aiCamera = new/obj/item/device/camera/siliconcam/drone_camera(src) + flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT logo and the subscript: 'NanoTrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'" playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + spawn(1) + if(camera && ("Robots" in camera.network)) + camera.add_network("Engineering") //Redefining some robot procs... /mob/living/silicon/robot/drone/SetName(pickedName as text) @@ -91,26 +95,26 @@ /mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/borg/upgrade/)) - user << "\red The maintenance drone chassis not compatible with \the [W]." + user << "\The [src] is not compatible with \the [W]." return else if (istype(W, /obj/item/weapon/crowbar)) - user << "The machine is hermetically sealed. You can't open the case." + user << "\The [src] is hermetically sealed. You can't open the case." return else if (istype(W, /obj/item/weapon/card/emag)) if(!client || stat == 2) - user << "\red There's not much point subverting this heap of junk." + user << "There's not much point subverting this heap of junk." return if(emagged) - src << "\red [user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt." - user << "\red You attempt to subvert [src], but the sequencer has no effect." + src << "\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt." + user << "You attempt to subvert [src], but the sequencer has no effect." return - user << "\red You swipe the sequencer across [src]'s interface and watch its eyes flicker." - src << "\red You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script." + user << "You swipe the sequencer across [src]'s interface and watch its eyes flicker." + src << "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script." var/obj/item/weapon/card/emag/emag = W emag.uses-- @@ -130,7 +134,7 @@ src << "Obey these laws:" laws.show_laws(src) - src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands." + src << "ALERT: [user.real_name] is your new master. Obey your new laws and his commands." return else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) @@ -138,14 +142,14 @@ if(stat == 2) if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave. - user << "\red The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one." + user << "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one." return if(!allowed(usr)) - user << "\red Access denied." + user << "Access denied." return - user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to reboot it.", "\red You swipe your ID card through \the [src], attempting to reboot it.") + user.visible_message("\The [user] swipes \his ID card through \the [src], attempting to reboot it.", ">You swipe your ID card through \the [src], attempting to reboot it.") var/drones = 0 for(var/mob/living/silicon/robot/drone/D in world) if(D.key && D.client) @@ -155,7 +159,7 @@ return else - user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to shut it down.", "\red You swipe your ID card through \the [src], attempting to shut it down.") + user.visible_message("\The [user] swipes \his ID card through \the [src], attempting to shut it down.", "You swipe your ID card through \the [src], attempting to shut it down.") if(emagged) return @@ -163,7 +167,7 @@ if(allowed(usr)) shut_down() else - user << "\red Access denied." + user << "Access denied." return @@ -185,7 +189,7 @@ //Drones killed by damage will gib. /mob/living/silicon/robot/drone/handle_regular_status_updates() - if(health <= -35 && src.stat != 2) + if((health <= -35 || (master_fabricator && src.z != master_fabricator.z)) && src.stat != 2) timeofdeath = world.time death() //Possibly redundant, having trouble making death() cooperate. gib() @@ -194,32 +198,31 @@ //DRONE MOVEMENT. /mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip) - //TODO: Consider making a magboot item for drones to equip. ~Z return 0 //CONSOLE PROCS /mob/living/silicon/robot/drone/proc/law_resync() if(stat != 2) if(emagged) - src << "\red You feel something attempting to modify your programming, but your hacked subroutines are unaffected." + src << "You feel something attempting to modify your programming, but your hacked subroutines are unaffected." else - src << "\red A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it." + src << "A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it." full_law_reset() show_laws() /mob/living/silicon/robot/drone/proc/shut_down() if(stat != 2) if(emagged) - src << "\red You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you." + src << "You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you." else - src << "\red You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself." + src << "You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself." death() /mob/living/silicon/robot/drone/proc/full_law_reset() clear_supplied_laws() clear_inherent_laws() clear_ion_laws() - laws = new /datum/ai_laws/drone + laws = new law_type //Reboot procs. @@ -267,17 +270,32 @@ ..() else if(istype(AM,/obj/item)) var/obj/item/O = AM - if(O.w_class > 2) + if(O.w_class > can_pull_size) src << "You are too small to pull that." return else ..() else - src << "You are too small to pull that." - return + if(!can_pull_mobs) + src << "You are too small to pull that." + return /mob/living/silicon/robot/drone/add_robot_verbs() - src.verbs |= silicon_verbs_subsystems + src.verbs |= silicon_subsystems /mob/living/silicon/robot/drone/remove_robot_verbs() - src.verbs -= silicon_verbs_subsystems + src.verbs -= silicon_subsystems + +/mob/living/silicon/robot/drone/construction + law_type = /datum/ai_laws/construction_drone + module_type = /obj/item/weapon/robot_module/drone/construction + can_pull_size = 5 + can_pull_mobs = 1 + +/mob/living/silicon/robot/drone/construction/init() + ..() + flavor_text = "It's a bulky construction drone stamped with a Sol Central glyph." + +/mob/living/silicon/robot/drone/construction/updatename() + real_name = "construction drone ([rand(100,999)])" + name = real_name \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 749d9fea05..c707f85c68 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -19,7 +19,7 @@ return if(!allowed(user)) - user << "\red Access denied." + user << "Access denied." return user.set_machine(src) @@ -27,6 +27,8 @@ dat += "Maintenance Units
        " for(var/mob/living/silicon/robot/drone/D in world) + if(D.z != src.z) + continue dat += "
        [D.real_name] ([D.stat == 2 ? "INACTIVE" : "ACTIVE"])" dat += "
        Cell charge: [D.cell.charge]/[D.cell.maxcharge]." dat += "
        Currently located in: [get_area(D)]." @@ -46,7 +48,7 @@ return if(!allowed(usr)) - usr << "\red Access denied." + usr << "Access denied." return if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) @@ -61,11 +63,11 @@ return drone_call_area = t_area - usr << "\blue You set the area selector to [drone_call_area]." + usr << "You set the area selector to [drone_call_area]." else if (href_list["ping"]) - usr << "\blue You issue a maintenance request for all active drones, highlighting [drone_call_area]." + usr << "You issue a maintenance request for all active drones, highlighting [drone_call_area]." for(var/mob/living/silicon/robot/drone/D in world) if(D.client && D.stat == 0) D << "-- Maintenance drone presence requested in: [drone_call_area]." @@ -75,7 +77,7 @@ var/mob/living/silicon/robot/drone/D = locate(href_list["resync"]) if(D.stat != 2) - usr << "\red You issue a law synchronization directive for the drone." + usr << "You issue a law synchronization directive for the drone." D.law_resync() else if (href_list["shutdown"]) @@ -83,7 +85,7 @@ var/mob/living/silicon/robot/drone/D = locate(href_list["shutdown"]) if(D.stat != 2) - usr << "\red You issue a kill command for the unfortunate drone." + usr << "You issue a kill command for the unfortunate drone." message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.") log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.") D.shut_down() @@ -98,10 +100,10 @@ continue dronefab = fab - usr << "\blue Drone fabricator located." + usr << "Drone fabricator located." return - usr << "\red Unable to locate drone fabricator." + usr << "Unable to locate drone fabricator." else if (href_list["toggle_fab"]) @@ -110,10 +112,10 @@ if(get_dist(src,dronefab) > 3) dronefab = null - usr << "\red Unable to locate drone fabricator." + usr << "Unable to locate drone fabricator." return dronefab.produce_drones = !dronefab.produce_drones - usr << "\blue You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator." + usr << "You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator." src.updateUsrDialog() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 68df16d020..1864e0171b 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -2,10 +2,12 @@ //Limited use. /obj/item/weapon/gripper name = "magnetic gripper" - desc = "A simple grasping tool for synthetic assets." + desc = "A simple grasping tool specialized in construction and engineering work." icon = 'icons/obj/device.dmi' icon_state = "gripper" + flags = NOBLUDGEON + //Has a list of items that it can hold. var/list/can_hold = list( /obj/item/weapon/cell, @@ -28,8 +30,14 @@ var/obj/item/wrapped = null // Item currently being held. + var/force_holder = null // + // VEEEEERY limited version for mining borgs. Basically only for swapping cells and upgrading the drills. /obj/item/weapon/gripper/miner + name = "drill maintenance gripper" + desc = "A simple grasping tool for the maintenance of heavy drilling machines." + icon_state = "gripper-mining" + can_hold = list( /obj/item/weapon/cell, /obj/item/weapon/stock_parts @@ -38,14 +46,58 @@ /obj/item/weapon/gripper/paperwork name = "paperwork gripper" desc = "A simple grasping tool for clerical work." - icon = 'icons/obj/device.dmi' - icon_state = "gripper" can_hold = list( /obj/item/weapon/clipboard, /obj/item/weapon/paper, /obj/item/weapon/paper_bundle, - /obj/item/weapon/card/id + /obj/item/weapon/card/id, + /obj/item/weapon/book, + /obj/item/weapon/newspaper + ) + +/obj/item/weapon/gripper/research //A general usage gripper, used for toxins/robotics/xenobio/etc + name = "scientific gripper" + icon_state = "gripper-sci" + desc = "A simple grasping tool suited to assist in a wide array of research applications." + + can_hold = list( + /obj/item/weapon/cell, + /obj/item/weapon/stock_parts, + /obj/item/device/mmi, + /obj/item/robot_parts, + /obj/item/borg/upgrade, + /obj/item/device/flash, //to build borgs + /obj/item/organ/brain, //to insert into MMIs. + /obj/item/stack/cable_coil, //again, for borg building + /obj/item/weapon/circuitboard, + /obj/item/slime_extract, + /obj/item/weapon/reagent_containers/glass, + /obj/item/weapon/reagent_containers/food/snacks/monkeycube + + ) + +/obj/item/weapon/gripper/service //Used to handle food, drinks, and seeds. + name = "service gripper" + icon_state = "gripper" + desc = "A simple grasping tool used to perform tasks in the service sector, such as handling food, drinks, and seeds." + + can_hold = list( + /obj/item/weapon/reagent_containers/glass, + /obj/item/weapon/reagent_containers/food, + /obj/item/seeds, + /obj/item/weapon/grown + ) + +/obj/item/weapon/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item + +/obj/item/weapon/gripper/no_use/loader //This is used to disallow building with metal. + name = "sheet loader" + desc = "A specialized loading device, designed to pick up and insert sheets of materials inside machines." + icon_state = "gripper-sheet" + + can_hold = list( + /obj/item/stack/sheet ) /obj/item/weapon/gripper/attack_self(mob/user as mob) @@ -53,6 +105,9 @@ return wrapped.attack_self(user) return ..() +/obj/item/weapon/gripper/no_use/attack_self(mob/user as mob) + return + /obj/item/weapon/gripper/verb/drop_item() set name = "Drop Item" @@ -75,7 +130,12 @@ //update_icon() /obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - return (wrapped ? wrapped.attack(M,user) : 0) + if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack(). + force_holder = wrapped.force + wrapped.force = 0.0 + wrapped.attack(M,user) + return 1 + return 0 /obj/item/weapon/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params) @@ -97,6 +157,9 @@ if(!resolved && wrapped && target) wrapped.afterattack(target,user,1) + //wrapped's force was set to zero. This resets it to the value it had before. + wrapped.force = force_holder + force_holder = null //If wrapped was neither deleted nor put into target, put it back into the gripper. if(wrapped && user && (wrapped.loc == user)) wrapped.loc = src @@ -145,6 +208,21 @@ user.visible_message("[user] removes the power cell from [A]!", "You remove the power cell.") + else if(istype(target,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/A = target + if(A.opened) + if(A.cell) + + wrapped = A.cell + + A.cell.add_fingerprint(user) + A.cell.updateicon() + A.updateicon() + A.cell.loc = src + A.cell = null + + user.visible_message("[user] removes the power cell from [A]!", "You remove the power cell.") + //TODO: Matter decompiler. /obj/item/weapon/matter_decompiler @@ -178,7 +256,7 @@ if(istype(M,/mob/living/simple_animal/lizard) || istype(M,/mob/living/simple_animal/mouse)) src.loc.visible_message("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - del(M) + qdel(M) if(wood) wood.add_charge(2000) if(plastic) @@ -201,7 +279,7 @@ if(!M || !D) return D << "You carefully and thoroughly decompile [M], storing as much of its resources as you can within yourself." - del(M) + qdel(M) new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) if(metal) @@ -269,7 +347,7 @@ else continue - del(W) + qdel(W) grabbed_something = 1 if(grabbed_something) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index d8009e6161..247334c2ea 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -1,3 +1,10 @@ +/proc/count_drones() + var/drones = 0 + for(var/mob/living/silicon/robot/drone/D in world) + if(D.key && D.client) + drones++ + return drones + /obj/machinery/drone_fabricator name = "drone fabricator" desc = "A large automated factory for producing maintenance drones." @@ -8,13 +15,20 @@ idle_power_usage = 20 active_power_usage = 5000 + var/fabricator_tag = "Exodus" var/drone_progress = 0 var/produce_drones = 1 var/time_last_drone = 500 + var/drone_type = /mob/living/silicon/robot/drone icon = 'icons/obj/machines/drone_fab.dmi' icon_state = "drone_fab_idle" +/obj/machinery/drone_fabricator/derelict + name = "construction drone fabricator" + fabricator_tag = "Derelict" + drone_type = /mob/living/silicon/robot/drone/construction + /obj/machinery/drone_fabricator/New() ..() @@ -48,13 +62,6 @@ if(produce_drones && drone_progress >= 100 && istype(user,/mob/dead) && config.allow_drone_spawn && count_drones() < config.max_maint_drones) user << "
        A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone." -/obj/machinery/drone_fabricator/proc/count_drones() - var/drones = 0 - for(var/mob/living/silicon/robot/drone/D in world) - if(D.key && D.client) - drones++ - return drones - /obj/machinery/drone_fabricator/proc/create_drone(var/client/player) if(stat & NOPOWER) @@ -71,13 +78,12 @@ flick("h_lathe_leave",src) time_last_drone = world.time - var/mob/living/silicon/robot/drone/new_drone = new(get_turf(src)) + var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src)) new_drone.transfer_personality(player) + new_drone.master_fabricator = src drone_progress = 0 - - /mob/dead/verb/join_as_drone() set category = "Ghost" @@ -86,11 +92,11 @@ if(ticker.current_state < GAME_STATE_PLAYING) - src << "\red The game hasn't started yet!" + src << "The game hasn't started yet!" return if(!(config.allow_drone_spawn)) - src << "\red That verb is not currently permitted." + src << "That verb is not currently permitted." return if (!src.stat) @@ -100,14 +106,14 @@ return 0 //something is terribly wrong if(jobban_isbanned(src,"Cyborg")) - usr << "\red You are banned from playing synthetics and cannot spawn as a drone." + usr << "You are banned from playing synthetics and cannot spawn as a drone." return var/deathtime = world.time - src.timeofdeath if(istype(src,/mob/dead/observer)) var/mob/dead/observer/G = src if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - usr << "\blue Upon using the antagHUD you forfeighted the ability to join the round." + usr << "Upon using the antagHUD you forfeighted the ability to join the round." return var/deathtimeminutes = round(deathtime / 600) @@ -125,16 +131,18 @@ usr << "You must wait 10 minutes to respawn as a drone!" return + var/list/all_fabricators = list() for(var/obj/machinery/drone_fabricator/DF in world) if(DF.stat & NOPOWER || !DF.produce_drones) continue - - if(DF.count_drones() >= config.max_maint_drones) - src << "\red There are too many active drones in the world for you to spawn." - return - if(DF.drone_progress >= 100) - DF.create_drone(src.client) - return + all_fabricators[DF.fabricator_tag] = DF - src << "\red There are no available drone spawn points, sorry." \ No newline at end of file + if(!all_fabricators.len) + src << "There are no available drone spawn points, sorry." + return + + var/choice = input(src,"Which fabricator do you wish to use?") as null|anything in all_fabricators + if(choice) + var/obj/machinery/drone_fabricator/chosen_fabricator = all_fabricators[choice] + chosen_fabricator.create_drone(src.client) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 557bad2a7e..e25bb9ff10 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -130,10 +130,11 @@ if (src.stat != 0) uneq_all() - if(!is_component_functioning("radio")) - radio.on = 0 - else - radio.on = 1 + if(radio) + if(!is_component_functioning("radio")) + radio.on = 0 + else + radio.on = 1 if(is_component_functioning("camera")) src.blinded = 0 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b224175d59..5eeae3f92b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -73,7 +73,6 @@ var/datum/effect/effect/system/ion_trail_follow/ion_trail = null var/datum/effect/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N var/jeton = 0 - var/borgwires = 31 // 0b11111 var/killswitch = 0 var/killswitch_time = 60 var/weapon_lock = 0 @@ -227,14 +226,28 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO //Improved /N -/mob/living/silicon/robot/Del() - if(mmi)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. +/mob/living/silicon/robot/Destroy() + if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. var/turf/T = get_turf(loc)//To hopefully prevent run time errors. if(T) mmi.loc = T - if(mind) mind.transfer_to(mmi.brainmob) + if(mmi.brainmob) + mind.transfer_to(mmi.brainmob) + else + src << "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug." + ghostize() + //ERROR("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].") mmi = null + if(connected_ai) + connected_ai.connected_robots -= src ..() +/mob/living/silicon/robot/proc/set_module_sprites(var/list/new_sprites) + module_sprites = new_sprites + //Custom_sprite check and entry + if (custom_sprite == 1) + module_sprites["Custom"] = "[src.ckey]-[modtype]" + return module_sprites + /mob/living/silicon/robot/proc/pick_module() if(module) return @@ -247,130 +260,17 @@ if(module) return + if(!(modtype in robot_modules)) + return - module_sprites = list() - switch(modtype) - if("Standard") - module = new /obj/item/weapon/robot_module/standard(src) - module_sprites["Basic"] = "robot_old" - module_sprites["Android"] = "droid" - module_sprites["Default"] = "robot" - module_sprites["Drone"] = "drone-standard" - - if("Service") - module = new /obj/item/weapon/robot_module/butler(src) - module.channels = list("Service" = 1) - module_sprites["Waitress"] = "Service" - module_sprites["Kent"] = "toiletbot" - module_sprites["Bro"] = "Brobot" - module_sprites["Rich"] = "maximillion" - module_sprites["Default"] = "Service2" - module_sprites["Drone"] = "drone-service" // How does this even work...? Oh well. - - if("Clerical") - module = new /obj/item/weapon/robot_module/clerical(src) - module.channels = list("Service" = 1) - module_sprites["Waitress"] = "Service" - module_sprites["Kent"] = "toiletbot" - module_sprites["Bro"] = "Brobot" - module_sprites["Rich"] = "maximillion" - module_sprites["Default"] = "Service2" - module_sprites["Drone"] = "drone-service" - - if("Miner") - module = new /obj/item/weapon/robot_module/miner(src) - module.channels = list("Supply" = 1) - if(camera && "Robots" in camera.network) - camera.add_network("MINE") - module_sprites["Basic"] = "Miner_old" - module_sprites["Advanced Droid"] = "droid-miner" - module_sprites["Treadhead"] = "Miner" - module_sprites["Drone"] = "drone-miner" - - if("Crisis") - module = new /obj/item/weapon/robot_module/crisis(src) - module.channels = list("Medical" = 1) - if(camera && "Robots" in camera.network) - camera.add_network("Medical") - module_sprites["Basic"] = "Medbot" - module_sprites["Standard"] = "surgeon" - module_sprites["Advanced Droid"] = "droid-medical" - module_sprites["Needles"] = "medicalrobot" - module_sprites["Drone" ] = "drone-medical" - - if("Surgeon") - module = new /obj/item/weapon/robot_module/surgeon(src) - module.channels = list("Medical" = 1) - if(camera && "Robots" in camera.network) - camera.add_network("Medical") - - module_sprites["Basic"] = "Medbot" - module_sprites["Standard"] = "surgeon" - module_sprites["Advanced Droid"] = "droid-medical" - module_sprites["Needles"] = "medicalrobot" - module_sprites["Drone"] = "drone-surgery" - - if("Security") - module = new /obj/item/weapon/robot_module/security(src) - module.channels = list("Security" = 1) - module_sprites["Basic"] = "secborg" - module_sprites["Red Knight"] = "Security" - module_sprites["Black Knight"] = "securityrobot" - module_sprites["Bloodhound"] = "bloodhound" - module_sprites["Bloodhound - Treaded"] = "secborg+tread" - module_sprites["Drone"] = "drone-sec" - - if("Engineering") - module = new /obj/item/weapon/robot_module/engineering(src) - module.channels = list("Engineering" = 1) - if(camera && "Robots" in camera.network) - camera.add_network("Engineering") - module_sprites["Basic"] = "Engineering" - module_sprites["Antique"] = "engineerrobot" - module_sprites["Landmate"] = "landmate" - module_sprites["Landmate - Treaded"] = "engiborg+tread" - module_sprites["Drone"] = "drone-engineer" - - if("Construction") - module = new /obj/item/weapon/robot_module/construction(src) - module.channels = list("Engineering" = 1) - if(camera && "Robots" in camera.network) - camera.add_network("Engineering") - module_sprites["Basic"] = "Engineering" - module_sprites["Antique"] = "engineerrobot" - module_sprites["Landmate"] = "landmate" - module_sprites["Landmate - Treaded"] = "engiborg+tread" - module_sprites["Drone"] = "drone-engineer" - - if("Janitor") - module = new /obj/item/weapon/robot_module/janitor(src) - module.channels = list("Service" = 1) - module_sprites["Basic"] = "JanBot2" - module_sprites["Mopbot"] = "janitorrobot" - module_sprites["Mop Gear Rex"] = "mopgearrex" - module_sprites["Drone"] = "drone-janitor" - - if("Combat") - module = new /obj/item/weapon/robot_module/combat(src) - module_sprites["Combat Android"] = "droid-combat" - module.channels = list("Security" = 1) - - //languages - module.add_languages(src) - - //Custom_sprite check and entry - if (custom_sprite == 1) - module_sprites["Custom"] = "[src.ckey]-[modtype]" + var/module_type = robot_modules[modtype] + module = new module_type(src) hands.icon_state = lowertext(modtype) feedback_inc("cyborg_[lowertext(modtype)]",1) updatename() - - if(modtype == "Medical" || modtype == "Security" || modtype == "Combat") - status_flags &= ~CANPUSH - - choose_icon(6,module_sprites) - radio.config(module.channels) + set_module_sprites(module.sprites) + choose_icon(module_sprites.len + 1, module_sprites) notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) /mob/living/silicon/robot/proc/updatename(var/prefix as text) @@ -388,10 +288,10 @@ var/changed_name = "" if(custom_name) changed_name = custom_name + notify_ai(ROBOT_NOTIFICATION_NEW_NAME, real_name, changed_name) else changed_name = "[modtype] [braintype]-[num2text(ident)]" - notify_ai(ROBOT_NOTIFICATION_NEW_NAME, real_name, changed_name) real_name = changed_name name = real_name @@ -641,7 +541,7 @@ C.r_arm = new/obj/item/robot_parts/r_arm(C) C.updateicon() new/obj/item/robot_parts/chest(loc) - src.Del() + qdel(src) else // Okay we're not removing the cell or an MMI, but maybe something else? var/list/removable_components = list() @@ -718,7 +618,7 @@ else user << "Unable to locate a radio." - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card + else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)||istype(W, /obj/item/weapon/card/robot)) // trying to unlock the interface with an ID card if(emagged)//still allow them to open the cover user << "The interface seems slightly damaged" if(opened) @@ -782,11 +682,14 @@ src << "Obey these laws:" laws.show_laws(src) src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands." - if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner)) + if(src.module) + var/rebuild = 0 for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules) - del(D) - src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module) - src.module.rebuild() + qdel(D) + rebuild = 1 + if(rebuild) + src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module) + src.module.rebuild() updateicon() else user << "You fail to hack [src]'s interface." @@ -855,6 +758,10 @@ //if they are holding or wearing a card that has access, that works if(check_access(H.get_active_hand()) || check_access(H.wear_id)) return 1 + else if(istype(M, /mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = M + if(check_access(R.get_active_hand()) || istype(R.get_active_hand(), /obj/item/weapon/card/robot)) + return 1 return 0 /mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I) @@ -872,7 +779,6 @@ return 0 /mob/living/silicon/robot/updateicon() - overlays.Cut() if(stat == 0) overlays += "eyes-[module_sprites[icontype]]" @@ -899,7 +805,7 @@ //Call when target overlay should be added/removed /mob/living/silicon/robot/update_targeted() if(!targeted_by && target_locked) - del(target_locked) + qdel(target_locked) updateicon() if (targeted_by && target_locked) overlays += target_locked @@ -1033,7 +939,7 @@ for(var/A in tile) if(istype(A, /obj/effect)) if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) - del(A) + qdel(A) else if(istype(A, /obj/item)) var/obj/item/cleaned_item = A cleaned_item.clean_blood() @@ -1102,7 +1008,6 @@ return /mob/living/silicon/robot/proc/choose_icon(var/triesleft, var/list/module_sprites) - if(triesleft<1 || !module_sprites.len) return else @@ -1111,6 +1016,8 @@ if (custom_sprite == 1) icontype = "Custom" triesleft = 0 + else if(module_sprites.len == 1) + icontype = module_sprites[1] else icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites @@ -1121,13 +1028,13 @@ icon_state = module_sprites[1] return - overlays -= "eyes" updateicon() if (triesleft >= 1) var/choice = input("Look at your icon - is this what you want?") in list("Yes","No") if(choice=="No") choose_icon(triesleft, module_sprites) + return else triesleft = 0 return @@ -1142,11 +1049,11 @@ /mob/living/silicon/robot/proc/add_robot_verbs() src.verbs |= robot_verbs_default - src.verbs |= silicon_verbs_subsystems + src.verbs |= silicon_subsystems /mob/living/silicon/robot/proc/remove_robot_verbs() src.verbs -= robot_verbs_default - src.verbs -= silicon_verbs_subsystems + src.verbs -= silicon_subsystems // Uses power from cyborg's cell. Returns 1 on success or 0 on failure. // Properly converts using CELLRATE now! Amount is in Joules. diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 0d40f0954a..3bc0dd9a15 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -1,3 +1,138 @@ +//A portable analyzer, for research borgs. This is better then giving them a gripper which can hold anything and letting them use the normal analyzer. +/obj/item/weapon/portable_destructive_analyzer + name = "Portable Destructive Analyzer" + icon = 'icons/obj/items.dmi' + icon_state = "portable_analyzer" + desc = "Similar to the stationary version, this rather unwieldy device allows you to break down objects in the name of science." + + var/min_reliability = 90 //Can't upgrade, call it laziness or a drawback + + var/datum/research/techonly/files //The device uses the same datum structure as the R&D computer/server. + //This analyzer can only store tech levels, however. + + var/obj/item/weapon/loaded_item //What is currently inside the analyzer. + +/obj/item/weapon/portable_destructive_analyzer/New() + ..() + files = new /datum/research/techonly(src) //Setup the research data holder. + +/obj/item/weapon/portable_destructive_analyzer/attack_self(user as mob) + var/response = alert(user, "Analyzing the item inside will *DESTROY* the item for good.\n\ + Syncing to the research server will send the data that is stored inside to research.\n\ + Ejecting will place the loaded item onto the floor.", + "What would you like to do?", "Analyze", "Sync", "Eject") + if(response == "Analyze") + if(loaded_item) + var/confirm = alert(user, "This will destroy the item inside forever. Are you sure?","Confirm Analyze","Yes","No") + if(confirm == "Yes") //This is pretty copypasta-y + user << "You activate the analyzer's microlaser, analyzing \the [loaded_item] and breaking it down." + flick("portable_analyzer_scan", src) + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + if(loaded_item.reliability >= min_reliability) + var/list/temp_tech = ConvertReqString2List(loaded_item.origin_tech) + for(var/T in temp_tech) + files.UpdateTech(T, temp_tech[T]) + user << "\The [loaded_item] had level [temp_tech[T]] in [T]." + loaded_item = null + for(var/obj/I in contents) + for(var/mob/M in I.contents) + M.death() + if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack + var/obj/item/stack/sheet/S = I + if(S.get_amount() > 1) + S.use(1) + loaded_item = S + else + qdel(S) + desc = initial(desc) + icon_state = initial(icon_state) + else + qdel(I) + desc = initial(desc) + icon_state = initial(icon_state) + else + return + else + user << "The [src] is empty. Put something inside it first." + if(response == "Sync") + var/success = 0 + for(var/obj/machinery/r_n_d/server/S in machines) + if(S.disabled) + continue + for(var/datum/tech/T in files.known_tech) //Uploading + S.files.AddTech2Known(T) + for(var/datum/tech/T in S.files.known_tech) //Downloading + files.AddTech2Known(T) + success = 1 + files.RefreshResearch() + if(success) + user << "You connect to the research server, push your data upstream to it, then pull the resulting merged data from the master branch." + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + else + user << "Reserch server ping response timed out. Unable to connect. Please contact the system administrator." + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 1) + if(response == "Eject") + if(loaded_item) + loaded_item.loc = get_turf(src) + desc = initial(desc) + icon_state = initial(icon_state) + loaded_item = null + else + user << "The [src] is already empty." + + +/obj/item/weapon/portable_destructive_analyzer/afterattack(var/atom/target, var/mob/living/user, proximity) + if(!target) + return + if(!proximity) + return + if(!isturf(target.loc)) // Don't load up stuff if it's inside a container or mob! + return + if(istype(target,/obj/item)) + if(loaded_item) + user << "Your [src] already has something inside. Analyze or eject it first." + return + var/obj/item/I = target + I.loc = src + loaded_item = I + for(var/mob/M in viewers()) + M.show_message(text("[user] adds the [I] to the [src]."), 1) + desc = initial(desc) + "
        It is holding \the [loaded_item]." + flick("portable_analyzer_load", src) + icon_state = "portable_analyzer_full" + +//This is used to unlock other borg covers. +/obj/item/weapon/card/robot //This is not a child of id cards, as to avoid dumb typechecks on computers. + name = "access code transmission device" + icon_state = "id-robot" + desc = "A circuit grafted onto the bottom of an ID card. It is used to transmit access codes into other robot chassis, \ + allowing you to lock and unlock other robots' panels." + +/obj/item/weapon/card/id/robot/attack_self() //override so borgs can't flash their IDs. + return + +/obj/item/weapon/card/id/robot/read() + usr << "The ID card does not appear to have any writing on it." + return + +//A harvest item for serviceborgs. +/obj/item/weapon/robot_harvester + name = "auto harvester" + desc = "A hand-held harvest tool that resembles a sickle. It uses energy to cut plant matter very efficently." + icon = 'icons/obj/weapons.dmi' + icon_state = "autoharvester" + +/obj/item/weapon/robot_harvester/afterattack(var/atom/target, var/mob/living/user, proximity) + if(!target) + return + if(!proximity) + return + if(istype(target,/obj/machinery/portable_atmospherics/hydroponics)) + var/obj/machinery/portable_atmospherics/hydroponics/T = target + T.harvest(user) + else + user << "Harvesting \a [target] is not the purpose of this tool. The [src] is for plants being grown." + // A special tray for the service droid. Allow droid to pick up and drop items as if they were using the tray normally // Click on table to unload, click on item to load. Otherwise works identically to a tray. // Unlike the base item "tray", robotrays ONLY pick up food, drinks and condiments. diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 7aca17963b..69fa5cb549 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -1,3 +1,18 @@ +var/global/list/robot_modules = list( + "Standard" = /obj/item/weapon/robot_module/standard, + "Service" = /obj/item/weapon/robot_module/clerical/butler, + "Clerical" = /obj/item/weapon/robot_module/clerical/general, + "Research" = /obj/item/weapon/robot_module/research, + "Miner" = /obj/item/weapon/robot_module/miner, + "Crisis" = /obj/item/weapon/robot_module/medical/crisis, + "Surgeon" = /obj/item/weapon/robot_module/medical/surgeon, + "Security" = /obj/item/weapon/robot_module/security/general, + "Combat" = /obj/item/weapon/robot_module/security/combat, + "Engineering" = /obj/item/weapon/robot_module/engineering/general, + "Construction" = /obj/item/weapon/robot_module/engineering/construction, + "Janitor" = /obj/item/weapon/robot_module/janitor + ) + /obj/item/weapon/robot_module name = "robot module" icon = 'icons/obj/module.dmi' @@ -6,10 +21,51 @@ item_state = "electronic" flags = CONDUCT var/channels = list() + var/networks = list() + var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK_TAJR = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0) + var/sprites = list() + var/can_be_pushed = 1 + var/no_slip = 0 var/list/modules = list() var/list/datum/matter_synth/synths = list() var/obj/item/emag = null var/obj/item/borg/upgrade/jetpack = null + var/list/subsystems = list() + var/list/obj/item/borg/upgrade/supported_upgrades = list() + + // Bookkeeping + var/list/added_languages = list() + var/list/added_networks = list() + var/obj/item/device/radio/borg/modified_radio = null + var/list/modified_key = null + var/list/original_radio_channels = list() + +/obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) + ..() + add_camera_networks(R) + add_languages(R) + add_radio_channels(R) + add_subsystems(R) + apply_status_flags(R) + +/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) + ..() + remove_camera_networks(R) + remove_languages(R) + remove_radio_channels(R) + remove_subsystems(R) + remove_status_flags(R) + +/obj/item/weapon/robot_module/Destroy() + qdel(modules) + qdel(synths) + qdel(emag) + qdel(jetpack) + modules = null + synths = null + emag = null + jetpack = null + ..() /obj/item/weapon/robot_module/emp_act(severity) if(modules) @@ -24,7 +80,6 @@ return /obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) - if(!synths || !synths.len) return @@ -39,16 +94,65 @@ modules += O /obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) - //full set of languages - R.add_language("Sol Common", 1) - R.add_language("Tradeband", 1) - R.add_language("Sinta'unathi", 0) - R.add_language("Siik'tajr", 0) - R.add_language("Skrellian", 0) - R.add_language("Gutter", 0) + for(var/language in languages) + if(R.add_language(language, languages[language])) + added_languages |= language + +/obj/item/weapon/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) + for(var/language in added_languages) + R.remove_language(language) + added_languages.Cut() + +/obj/item/weapon/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera && "Robots" in R.camera.network) + for(var/network in networks) + if(!(network in R.camera.network)) + R.camera.add_network(network) + added_networks |= network + +/obj/item/weapon/robot_module/proc/remove_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera) + R.camera.remove_networks(added_networks) + added_networks.Cut() + +/obj/item/weapon/robot_module/proc/add_radio_channels(var/mob/living/silicon/robot/R) + if(!R.radio) + return + + modified_radio = R.radio + modified_key = R.radio.keyslot + original_radio_channels = modified_radio.channels.Copy() + modified_radio.config(channels) + +/obj/item/weapon/robot_module/proc/remove_radio_channels(var/mob/living/silicon/robot/R) + // Only reset if the original radio component hasn't been altered/replaced + if(!(R.radio && R.radio == modified_radio && R.radio.keyslot == modified_key)) + return + + modified_radio.config(original_radio_channels) + original_radio_channels.Cut() + +/obj/item/weapon/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R) + R.verbs |= subsystems + +/obj/item/weapon/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R) + R.verbs -= subsystems + +/obj/item/weapon/robot_module/proc/apply_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags &= ~CANPUSH + +/obj/item/weapon/robot_module/proc/remove_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags |= CANPUSH /obj/item/weapon/robot_module/standard name = "standard robot module" + sprites = list( "Basic" = "robot_old", + "Android" = "droid", + "Default" = "robot", + "Drone" = "drone-standard" + ) /obj/item/weapon/robot_module/standard/New() ..() @@ -61,10 +165,24 @@ src.emag = new /obj/item/weapon/melee/energy/sword(src) return -/obj/item/weapon/robot_module/surgeon - name = "surgeon robot module" +/obj/item/weapon/robot_module/medical + name = "medical robot module" + channels = list("Medical" = 1) + networks = list(NETWORK_MEDICAL) + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) + can_be_pushed = 0 -/obj/item/weapon/robot_module/surgeon/New() +/obj/item/weapon/robot_module/medical/surgeon + name = "surgeon robot module" + sprites = list( + "Basic" = "Medbot", + "Standard" = "surgeon", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Drone" = "drone-surgery" + ) + +/obj/item/weapon/robot_module/medical/surgeon/New() ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/device/healthanalyzer(src) @@ -99,16 +217,24 @@ return -/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) +/obj/item/weapon/robot_module/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) if(src.emag) var/obj/item/weapon/reagent_containers/spray/PS = src.emag PS.reagents.add_reagent("pacid", 2 * amount) ..() -/obj/item/weapon/robot_module/crisis +/obj/item/weapon/robot_module/medical/crisis name = "crisis robot module" + sprites = list( + "Basic" = "Medbot", + "Standard" = "surgeon", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Drone - Medical" = "drone-medical", + "Drone - Chemistry" = "drone-chemistry" + ) -/obj/item/weapon/robot_module/crisis/New() +/obj/item/weapon/robot_module/medical/crisis/New() ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/med(src) @@ -145,7 +271,7 @@ return -/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) +/obj/item/weapon/robot_module/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules if(S.mode == 2) @@ -160,10 +286,25 @@ ..() -/obj/item/weapon/robot_module/construction - name = "construction robot module" -/obj/item/weapon/robot_module/construction/New() +/obj/item/weapon/robot_module/engineering + name = "engineering robot module" + channels = list("Engineering" = 1) + networks = list(NETWORK_ENGINEERING) + subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) + sprites = list( + "Basic" = "Engineering", + "Antique" = "engineerrobot", + "Landmate" = "landmate", + "Landmate - Treaded" = "engiborg+tread", + "Drone" = "drone-engineer" + ) + +/obj/item/weapon/robot_module/engineering/construction + name = "construction robot module" + no_slip = 1 + +/obj/item/weapon/robot_module/engineering/construction/New() ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) @@ -191,17 +332,14 @@ src.modules += R var/obj/item/stack/sheet/plasteel/cyborg/S = new /obj/item/stack/sheet/plasteel/cyborg(src) - S.synths = list(metal) + S.synths = list(plasteel) src.modules += S var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src) RG.synths = list(metal, glass) src.modules += RG -/obj/item/weapon/robot_module/engineering - name = "engineering robot module" - -/obj/item/weapon/robot_module/engineering/New() +/obj/item/weapon/robot_module/engineering/general/New() ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) @@ -259,8 +397,23 @@ /obj/item/weapon/robot_module/security name = "security robot module" + channels = list("Security" = 1) + networks = list(NETWORK_SECURITY) + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) + can_be_pushed = 0 + supported_upgrades = list(/obj/item/borg/upgrade/tasercooler) -/obj/item/weapon/robot_module/security/New() +/obj/item/weapon/robot_module/security/general + sprites = list( + "Basic" = "secborg", + "Red Knight" = "Security", + "Black Knight" = "securityrobot", + "Bloodhound" = "bloodhound", + "Bloodhound - Treaded" = "secborg+tread", + "Drone" = "drone-sec" + ) + +/obj/item/weapon/robot_module/security/general/New() ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/sec(src) @@ -288,6 +441,13 @@ /obj/item/weapon/robot_module/janitor name = "janitorial robot module" + channels = list("Service" = 1) + sprites = list( + "Basic" = "JanBot2", + "Mopbot" = "janitorrobot", + "Mop Gear Rex" = "mopgearrex", + "Drone" = "drone-janitor" + ) /obj/item/weapon/robot_module/janitor/New() ..() @@ -308,14 +468,40 @@ var/obj/item/weapon/reagent_containers/spray/S = src.emag S.reagents.add_reagent("lube", 2 * amount) -/obj/item/weapon/robot_module/butler +/obj/item/weapon/robot_module/clerical name = "service robot module" + channels = list("Service" = 1) + languages = list( + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_UNATHI = 1, + LANGUAGE_SIIK_MAAS = 1, + LANGUAGE_SIIK_TAJR = 0, + LANGUAGE_SKRELLIAN = 1, + LANGUAGE_ROOTSPEAK = 1, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_GUTTER = 1 + ) -/obj/item/weapon/robot_module/butler/New() +/obj/item/weapon/robot_module/clerical/butler + sprites = list( "Waitress" = "Service", + "Kent" = "toiletbot", + "Bro" = "Brobot", + "Rich" = "maximillion", + "Default" = "Service2", + "Drone - Service" = "drone-service", + "Drone - Hydro" = "drone-hydro" + ) + +/obj/item/weapon/robot_module/clerical/butler/New() ..() src.modules += new /obj/item/device/flash(src) - src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) - src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) + src.modules += new /obj/item/weapon/gripper/service(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) + src.modules += new /obj/item/weapon/minihoe(src) + src.modules += new /obj/item/weapon/hatchet(src) + src.modules += new /obj/item/device/analyzer/plant_analyzer(src) + src.modules += new /obj/item/weapon/storage/bag/plants(src) + src.modules += new /obj/item/weapon/robot_harvester(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.stored_matter = 30 @@ -338,39 +524,27 @@ src.emag.name = "Mickey Finn's Special Brew" return -/obj/item/weapon/robot_module/butler/add_languages(var/mob/living/silicon/robot/R) - //full set of languages - R.add_language("Sol Common", 1) - R.add_language("Sinta'unathi", 1) - R.add_language("Siik'maas", 1) - R.add_language("Siik'tajr", 0) - R.add_language("Skrellian", 1) - R.add_language("Rootspeak", 1) - R.add_language("Tradeband", 1) - R.add_language("Gutter", 1) - -/obj/item/weapon/robot_module/clerical +/obj/item/weapon/robot_module/clerical/general name = "clerical robot module" + sprites = list( + "Waitress" = "Service", + "Kent" = "toiletbot", + "Bro" = "Brobot", + "Rich" = "maximillion", + "Default" = "Service2", + "Drone" = "drone-service" + ) -/obj/item/weapon/robot_module/clerical/New() +/obj/item/weapon/robot_module/clerical/general/New() ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/pen/robopen(src) src.modules += new /obj/item/weapon/form_printer(src) src.modules += new /obj/item/weapon/gripper/paperwork(src) + src.modules += new /obj/item/weapon/hand_labeler(src) src.emag = new /obj/item/weapon/stamp/denied(src) -/obj/item/weapon/robot_module/clerical/add_languages(var/mob/living/silicon/robot/R) - R.add_language("Sol Common", 1) - R.add_language("Sinta'unathi", 1) - R.add_language("Siik'maas", 1) - R.add_language("Siik'tajr", 0) - R.add_language("Skrellian", 1) - R.add_language("Rootspeak", 1) - R.add_language("Tradeband", 1) - R.add_language("Gutter", 1) - -/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) +/obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules E.reagents.add_reagent("enzyme", 2 * amount) if(src.emag) @@ -379,6 +553,15 @@ /obj/item/weapon/robot_module/miner name = "miner robot module" + channels = list("Supply" = 1) + networks = list(NETWORK_MINE) + sprites = list( + "Basic" = "Miner_old", + "Advanced Droid" = "droid-miner", + "Treadhead" = "Miner", + "Drone" = "drone-miner" + ) + supported_upgrades = list(/obj/item/borg/upgrade/jetpack) /obj/item/weapon/robot_module/miner/New() ..() @@ -395,8 +578,53 @@ src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) return +/obj/item/weapon/robot_module/research + name = "research module" + channels = list("Science" = 1) + sprites = list( + "Droid" = "droid-science", + "Drone" = "drone-science" + ) + +/obj/item/weapon/robot_module/research/New() + ..() + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) + src.modules += new /obj/item/weapon/gripper/research(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/robotanalyzer(src) + src.modules += new /obj/item/weapon/card/robot(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/weapon/scalpel(src) + src.modules += new /obj/item/weapon/circular_saw(src) + src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + src.emag = new /obj/item/weapon/hand_tele(src) + + var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) + synths += nanite + + var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + N.uses_charge = 1 + N.charge_costs = list(1000) + N.synths = list(nanite) + src.modules += N + + return + /obj/item/weapon/robot_module/syndicate name = "illegal robot module" + languages = list( + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_UNATHI = 0, + LANGUAGE_SIIK_TAJR = 0, + LANGUAGE_SKRELLIAN = 0, + LANGUAGE_GUTTER = 1 + ) /obj/item/weapon/robot_module/syndicate/New(var/mob/living/silicon/robot/R) ..() @@ -410,17 +638,9 @@ R.internals = jetpack return -/obj/item/weapon/robot_module/syndicate/add_languages(var/mob/living/silicon/robot/R) - //full set of languages - R.add_language("Sol Common", 1) - R.add_language("Tradeband", 1) - R.add_language("Sinta'unathi", 0) - R.add_language("Siik'tajr", 0) - R.add_language("Skrellian", 0) - R.add_language("Gutter", 1) - -/obj/item/weapon/robot_module/combat +/obj/item/weapon/robot_module/security/combat name = "combat robot module" + sprites = list("Combat Android" = "droid-combat") /obj/item/weapon/robot_module/combat/New() ..() @@ -435,6 +655,7 @@ /obj/item/weapon/robot_module/drone name = "drone module" + no_slip = 1 /obj/item/weapon/robot_module/drone/New() ..() @@ -446,7 +667,7 @@ src.modules += new /obj/item/device/multitool(src) src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src) + src.modules += new /obj/item/weapon/soap(src) src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) src.emag.name = "Plasma Cutter" @@ -504,16 +725,18 @@ P.synths = list(plastic) src.modules += P -/obj/item/weapon/robot_module/drone/add_languages(var/mob/living/silicon/robot/R) - return //not much ROM to spare in that tiny microprocessor! +/obj/item/weapon/robot_module/drone/construction + name = "construction drone module" + channels = list("Engineering" = 1) + languages = list() + +/obj/item/weapon/robot_module/drone/construction/New() + ..() + src.modules += new /obj/item/weapon/rcd/borg(src) /obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules - C.reagents.add_reagent("cleaner", 3 * amount) - var/obj/item/device/lightreplacer/LR = locate() in src.modules LR.Charge(R, amount) - ..() return @@ -521,7 +744,5 @@ /obj/item/proc/is_robot_module() if (!istype(src.loc, /mob/living/silicon/robot)) return 0 - var/mob/living/silicon/robot/R = src.loc - return (src in R.module.modules) diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index f9265a383f..5ea383aaa6 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/Process_Spaceslipping(var/prob_slip) - if(module && (istype(module,/obj/item/weapon/robot_module/construction) || istype(module,/obj/item/weapon/robot_module/drone))) + if(module && module.no_slip) return 0 ..(prob_slip) diff --git a/code/modules/mob/living/silicon/robot/robot_upgrades.dm b/code/modules/mob/living/silicon/robot/robot_upgrades.dm deleted file mode 100644 index a6d08bd534..0000000000 --- a/code/modules/mob/living/silicon/robot/robot_upgrades.dm +++ /dev/null @@ -1,147 +0,0 @@ -// robot_upgrades.dm -// Contains various borg upgrades. - -/obj/item/borg/upgrade/ - name = "A borg upgrade module." - desc = "Protected by FRM." - icon = 'icons/obj/module.dmi' - icon_state = "cyborg_upgrade" - var/construction_time = 120 - var/construction_cost = list("metal"=10000) - var/locked = 0 - var/require_module = 0 - var/installed = 0 - -/obj/item/borg/upgrade/proc/action() - return - - -/obj/item/borg/upgrade/reset/ - name = "Borg module reset board" - desc = "Used to reset a borg's module. Destroys any other upgrades applied to the borg." - icon_state = "cyborg_upgrade1" - require_module = 1 - -/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R) - R.uneq_all() - del(R.module) - R.module = null - R.modtype = "robot" - R.real_name = "Cyborg [R.ident]" - R.name = R.real_name - R.nopush = 0 - R.hands.icon_state = "nomod" - R.base_icon = "robot" - R.icon_state = "robot" - R.updateicon() - R.languages = list() - R.speech_synthesizer_langs = list() - - return 1 - - - -/obj/item/borg/upgrade/flashproof/ - name = "Borg Flash-Supression" - desc = "A highly advanced, complicated system for supressing incoming flashes directed at the borg's optical processing system." - construction_cost = list("metal"=10000,"gold"=2000,"silver"=3000,"glass"=2000, "diamond"=5000) - icon_state = "cyborg_upgrade4" - require_module = 1 - - -/obj/item/borg/upgrade/flashproof/New() // Why the fuck does the fabricator make a new instance of all the items? - //desc = "Sunglasses with duct tape." // Why? D: - -/obj/item/borg/upgrade/flashproof/action(var/mob/living/silicon/robot/R) - if(R.module) - R.module += src - - return 1 - -/obj/item/borg/upgrade/restart/ - name = "Borg emergancy restart module" - desc = "Used to force a restart of a disabled-but-repaired borg, bringing it back online." - construction_cost = list("metal"=60000 , "glass"=5000) - icon_state = "cyborg_upgrade1" - - -/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) - if(!R.key) - for(var/mob/dead/observer/ghost in world) - if(ghost.corpse == R && ghost.client) - ghost.client.mob = ghost.corpse - - if(R.health < 0) - usr << "You have to repair the borg before using this module!" - return 0 - - R.stat = 0 - return 1 - - -/obj/item/borg/upgrade/vtec/ - name = "Borg VTEC Module" - desc = "Used to kick in a borgs VTEC systems, increasing their speed." - construction_cost = list("metal"=80000 , "glass"=6000 , "gold"= 5000) - icon_state = "cyborg_upgrade2" - require_module = 1 - -/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R) - if(R.speed == -1) - return 0 - - R.speed-- - return 1 - - -/obj/item/borg/upgrade/tasercooler/ - name = "Borg Rapid Taser Cooling Module" - desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate.." - construction_cost = list("metal"=80000 , "glass"=6000 , "gold"= 2000, "diamond" = 500) - icon_state = "cyborg_upgrade3" - require_module = 1 - - -/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R) - if(!istype(R.module, /obj/item/weapon/robot_module/security)) - R << "Upgrade mounting error! No suitable hardpoint detected!" - usr << "There's no mounting point for the module!" - return 0 - - var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - usr << "This cyborg has had its taser removed!" - return 0 - - if(T.recharge_time <= 2) - R << "Maximum cooling achieved for this hardpoint!" - usr << "There's no room for another cooling unit!" - return 0 - - else - T.recharge_time = max(2 , T.recharge_time - 4) - - return 1 - -/obj/item/borg/upgrade/jetpack/ - name = "Mining Borg Jetpack" - desc = "A carbon dioxide jetpack suitable for low-gravity mining operations" - construction_cost = list("metal"=10000,"phoron"=15000,"uranium" = 20000) - icon_state = "cyborg_upgrade3" - require_module = 1 - -/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) - if(!istype(R.module, /obj/item/weapon/robot_module/miner)) - R << "Upgrade mounting error! No suitable hardpoint detected!" - usr << "There's no mounting point for the module!" - return 0 - else - R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide - for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules) - R.internals = src - R.icon_state="Miner+j" - return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 965729b8a8..d2e30953e7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -31,7 +31,7 @@ add_language("Galactic Common") init_subsystems() -/mob/living/silicon/Del() +/mob/living/silicon/Destroy() for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) AH.unregister(src) ..() @@ -210,9 +210,19 @@ var/dat = "Known Languages

        " + if(default_language) + dat += "Current default language: [default_language] - reset

        " + for(var/datum/language/L in languages) if(!(L.flags & NONGLOBAL)) - dat += "[L.name] (:[L.key])
        Speech Synthesizer: [(L in speech_synthesizer_langs)? "YES":"NOT SUPPORTED"]
        [L.desc]

        " + var/default_str + if(L == default_language) + default_str = " - default - reset" + else + default_str = " - set default" + + var/synth = (L in speech_synthesizer_langs) + dat += "[L.name] (:[L.key])[synth ? default_str : null]
        Speech Synthesizer: [synth ? "YES" : "NOT SUPPORTED"]
        [L.desc]

        " src << browse(dat, "window=checklanguage") return @@ -268,14 +278,6 @@ updatehealth() -/mob/living/silicon/proc/init_subsystems() - alarm_monitor = new/obj/nano_module/alarm_monitor/borg(src) - law_manager = new/obj/nano_module/law_manager(src) - - for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) - AH.register(src, /mob/living/silicon/proc/receive_alarm) - queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order - /mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised) if(!next_alarm_notice) next_alarm_notice = world.time + SecondsToTicks(10) diff --git a/code/modules/mob/living/silicon/subystems.dm b/code/modules/mob/living/silicon/subystems.dm index 9f1e07c301..37f9ec8b55 100644 --- a/code/modules/mob/living/silicon/subystems.dm +++ b/code/modules/mob/living/silicon/subystems.dm @@ -1,26 +1,101 @@ /mob/living/silicon - var/list/silicon_verbs_subsystems = list( + var/register_alarms = 1 + var/obj/nano_module/alarm_monitor/alarm_monitor + var/obj/nano_module/atmos_control/atmos_control + var/obj/nano_module/crew_monitor/crew_monitor + var/obj/nano_module/law_manager/law_manager + var/obj/nano_module/power_monitor/power_monitor + var/obj/nano_module/rcon/rcon + + var/alarm_monitor_type = /obj/nano_module/alarm_monitor/borg + +/mob/living/silicon + alarm_monitor_type = /obj/nano_module/alarm_monitor/borg + var/list/silicon_subsystems = list( /mob/living/silicon/proc/subsystem_alarm_monitor, /mob/living/silicon/proc/subsystem_law_manager ) - // Subsystems - var/obj/nano_module/alarm_monitor = null - var/obj/nano_module/law_manager = null - -/mob/living/silicon/robot/syndicate - silicon_verbs_subsystems = list( - /mob/living/silicon/proc/subsystem_law_manager +/mob/living/silicon/ai + alarm_monitor_type = /obj/nano_module/alarm_monitor/ai + silicon_subsystems = list( + /mob/living/silicon/proc/subsystem_alarm_monitor, + /mob/living/silicon/proc/subsystem_atmos_control, + /mob/living/silicon/proc/subsystem_crew_monitor, + /mob/living/silicon/proc/subsystem_law_manager, + /mob/living/silicon/proc/subsystem_power_monitor, + /mob/living/silicon/proc/subsystem_rcon ) +/mob/living/silicon/robot/syndicate + register_alarms = 0 + silicon_subsystems = list(/mob/living/silicon/proc/subsystem_law_manager) + +/mob/living/silicon/proc/init_subsystems() + alarm_monitor = new alarm_monitor_type(src) + atmos_control = new(src) + crew_monitor = new(src) + law_manager = new(src) + power_monitor = new(src) + rcon = new(src) + + if(!register_alarms) + return + + for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) + AH.register(src, /mob/living/silicon/proc/receive_alarm) + queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order + +/******************** +* Alarm Monitor * +********************/ /mob/living/silicon/proc/subsystem_alarm_monitor() set name = "Alarm Monitor" set category = "Subystems" - alarm_monitor.ui_interact(usr) + alarm_monitor.ui_interact(usr, state = self_state) +/******************** +* Atmos Control * +********************/ +/mob/living/silicon/proc/subsystem_atmos_control() + set category = "Subystems" + set name = "Atmospherics Control" + + atmos_control.ui_interact(usr, state = self_state) + +/******************** +* Crew Monitor * +********************/ +/mob/living/silicon/proc/subsystem_crew_monitor() + set category = "Subystems" + set name = "Crew Monitor" + + crew_monitor.ui_interact(usr, state = self_state) + +/**************** +* Law Manager * +****************/ /mob/living/silicon/proc/subsystem_law_manager() set name = "Law Manager" set category = "Subystems" - law_manager.ui_interact(usr) + law_manager.ui_interact(usr, state = self_state) + +/******************** +* Power Monitor * +********************/ +/mob/living/silicon/proc/subsystem_power_monitor() + set category = "Subystems" + set name = "Power Monitor" + + power_monitor.ui_interact(usr, state = self_state) + +/************ +* RCON * +************/ +/mob/living/silicon/proc/subsystem_rcon() + set category = "Subystems" + set name = "RCON" + + rcon.ui_interact(usr, state = self_state) diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 3a5f2f17e5..fc2a1cd72e 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -20,7 +20,7 @@ ..() parent = new_parent -/mob/living/simple_animal/bee/Del() +/mob/living/simple_animal/bee/Destroy() if(parent) parent.owned_bee_swarms.Remove(src) ..() @@ -107,7 +107,7 @@ if(feral > 0) src.strength += B.strength - del(B) + qdel(B) src.icon_state = "bees[src.strength]" if(strength > 5) icon_state = "bees_swarm" @@ -120,7 +120,7 @@ B.icon_state = "bees[B.strength]" if(src.strength <= 0) - del(src) + qdel(src) return src.icon_state = "bees[B.strength]" var/turf/simulated/floor/T = get_turf(get_step(src, pick(1,2,4,8))) @@ -169,7 +169,7 @@ if(!parent && prob(10)) strength -= 1 if(strength <= 0) - del(src) + qdel(src) else if(strength <= 5) icon_state = "bees[strength]" diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index 333ea3540d..9480840d71 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -143,7 +143,7 @@ if(!host.lastKnownIP) host.lastKnownIP = b2h_ip - del(host_brain) + qdel(host_brain) /mob/living/simple_animal/borer/proc/leave_host() diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index 156d362773..c0b2999b2f 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -32,4 +32,31 @@ M << "The captive mind of [src] whispers, \"[message]\"" /mob/living/captive_brain/emote(var/message) - return \ No newline at end of file + return + +/mob/living/captive_brain/can_resist() + return !(stat || next_move > world.time) + +/mob/living/captive_brain/process_resist() + //Resisting control by an alien mind. + if(istype(src.loc,/mob/living/simple_animal/borer)) + var/mob/living/simple_animal/borer/B = src.loc + var/mob/living/captive_brain/H = src + + H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." + B.host << "You feel the captive mind of [src] begin to resist your control." + + spawn(rand(200,250)+B.host.brainloss) + if(!B || !B.controlling) return + + B.host.adjustBrainLoss(rand(5,10)) + H << "With an immense exertion of will, you regain control of your body!" + B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." + B.detatch() + verbs -= /mob/living/carbon/proc/release_control + verbs -= /mob/living/carbon/proc/punish_host + verbs -= /mob/living/carbon/proc/spawn_larvae + + return + + ..() diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index b0fd2a5121..e1b54dc832 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -304,7 +304,7 @@ host.computer_id = null host.lastKnownIP = null - del(host_brain) + qdel(host_brain) host_brain = new(src) host_brain.ckey = host.ckey diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index 12d868e110..1ae5bba479 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -1,4 +1,3 @@ - /mob/living/simple_animal/construct name = "Construct" real_name = "Construct" @@ -6,8 +5,8 @@ speak_emote = list("hisses") emote_hear = list("wails","screeches") response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "punches" + response_disarm = "flailed at" + response_harm = "punched" icon_dead = "shade_dead" speed = -1 a_intent = I_HURT @@ -15,7 +14,7 @@ status_flags = CANPUSH universal_speak = 0 universal_understand = 1 - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = 'sound/weapons/spiderlunge.ogg' min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -25,7 +24,7 @@ min_n2 = 0 max_n2 = 0 minbodytemp = 0 - show_stat_health = 0 + show_stat_health = 1 faction = "cult" supernatural = 1 var/nullblock = 0 @@ -35,6 +34,9 @@ var/list/construct_spells = list() +/mob/living/simple_animal/construct/cultify() + return + /mob/living/simple_animal/construct/New() ..() name = text("[initial(name)] ([rand(1, 1000)])") @@ -42,14 +44,15 @@ add_language("Cult") add_language("Occult") for(var/spell in construct_spells) - spell_list += new spell(src) + src.add_spell(new spell, "const_spell_ready") updateicon() + add_glow() /mob/living/simple_animal/construct/death() new /obj/item/weapon/ectoplasm (src.loc) ..(null,"collapses in a shattered heap.") ghostize() - del src + qdel(src) /mob/living/simple_animal/construct/attack_generic(var/mob/user) if(istype(user, /mob/living/simple_animal/construct/builder)) @@ -97,10 +100,10 @@ mob_size = 20 speed = 3 environment_smash = 2 - attack_sound = 'sound/weapons/punch3.ogg' + attack_sound = 'sound/weapons/heavysmash.ogg' status_flags = 0 resistance = 10 - construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) + construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) /mob/living/simple_animal/construct/armoured/Life() weakened = 0 @@ -148,8 +151,8 @@ speed = -1 environment_smash = 1 see_in_dark = 7 - attack_sound = 'sound/weapons/bladeslice.ogg' - construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) + attack_sound = 'sound/weapons/rapidslice.ogg' + construct_spells = list(/spell/targeted/ethereal_jaunt/shift) /////////////////////////////Artificer///////////////////////// @@ -165,18 +168,20 @@ icon_living = "artificer" maxHealth = 50 health = 50 - response_harm = "viciously beats" + response_harm = "viciously beaten" harm_intent_damage = 5 melee_damage_lower = 5 melee_damage_upper = 5 attacktext = "rammed" speed = 0 - environment_smash = 2 - attack_sound = 'sound/weapons/punch2.ogg' - construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, - /obj/effect/proc_holder/spell/aoe_turf/conjure/wall, - /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, - /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone,) + environment_smash = 1 + attack_sound = 'sound/weapons/rapidslice.ogg' + construct_spells = list(/spell/aoe_turf/conjure/construct/lesser, + /spell/aoe_turf/conjure/wall, + /spell/aoe_turf/conjure/floor, + /spell/aoe_turf/conjure/soulstone, + /spell/aoe_turf/conjure/pylon + ) /////////////////////////////Behemoth///////////////////////// @@ -192,17 +197,18 @@ maxHealth = 750 health = 750 speak_emote = list("rumbles") - response_harm = "harmlessly punches" + response_harm = "harmlessly punched" harm_intent_damage = 0 melee_damage_lower = 50 melee_damage_upper = 50 attacktext = "brutally crushed" speed = 5 environment_smash = 2 - attack_sound = 'sound/weapons/punch4.ogg' + attack_sound = 'sound/weapons/heavysmash.ogg' resistance = 10 var/energy = 0 var/max_energy = 1000 + construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) ////////////////////////Harvester//////////////////////////////// @@ -219,14 +225,110 @@ health = 150 melee_damage_lower = 25 melee_damage_upper = 25 - attacktext = "violently stabs" + attacktext = "violently stabbed" speed = -1 environment_smash = 1 see_in_dark = 7 attack_sound = 'sound/weapons/pierce.ogg' construct_spells = list( - //spell/targeted/harvest, - //spell/aoe_turf/knock/harvester, - //spell/rune_write + /spell/targeted/harvest, + /spell/aoe_turf/knock/harvester, + /spell/rune_write ) + +////////////////Glow////////////////// +/mob/living/simple_animal/construct/proc/add_glow() + overlays = 0 + var/overlay_layer = LIGHTING_LAYER+1 + if(layer != MOB_LAYER) + overlay_layer=TURF_LAYER+0.2 + + overlays += image(icon,"glow-[icon_state]",overlay_layer) + +////////////////HUD////////////////////// + +/mob/living/simple_animal/construct/Life() + . = ..() + if(.) + if(fire) + if(fire_alert) fire.icon_state = "fire1" + else fire.icon_state = "fire0" + if(pullin) + if(pulling) pullin.icon_state = "pull1" + else pullin.icon_state = "pull0" + + if(purged) + if(purge > 0) purged.icon_state = "purge1" + else purged.icon_state = "purge0" + + silence_spells(purge) + +/mob/living/simple_animal/construct/armoured/Life() + ..() + if(healths) + switch(health) + if(250 to INFINITY) healths.icon_state = "juggernaut_health0" + if(208 to 249) healths.icon_state = "juggernaut_health1" + if(167 to 207) healths.icon_state = "juggernaut_health2" + if(125 to 166) healths.icon_state = "juggernaut_health3" + if(84 to 124) healths.icon_state = "juggernaut_health4" + if(42 to 83) healths.icon_state = "juggernaut_health5" + if(1 to 41) healths.icon_state = "juggernaut_health6" + else healths.icon_state = "juggernaut_health7" + + +/mob/living/simple_animal/construct/behemoth/Life() + ..() + if(healths) + switch(health) + if(750 to INFINITY) healths.icon_state = "juggernaut_health0" + if(625 to 749) healths.icon_state = "juggernaut_health1" + if(500 to 624) healths.icon_state = "juggernaut_health2" + if(375 to 499) healths.icon_state = "juggernaut_health3" + if(250 to 374) healths.icon_state = "juggernaut_health4" + if(125 to 249) healths.icon_state = "juggernaut_health5" + if(1 to 124) healths.icon_state = "juggernaut_health6" + else healths.icon_state = "juggernaut_health7" + +/mob/living/simple_animal/construct/builder/Life() + ..() + if(healths) + switch(health) + if(50 to INFINITY) healths.icon_state = "artificer_health0" + if(42 to 49) healths.icon_state = "artificer_health1" + if(34 to 41) healths.icon_state = "artificer_health2" + if(26 to 33) healths.icon_state = "artificer_health3" + if(18 to 25) healths.icon_state = "artificer_health4" + if(10 to 17) healths.icon_state = "artificer_health5" + if(1 to 9) healths.icon_state = "artificer_health6" + else healths.icon_state = "artificer_health7" + + + +/mob/living/simple_animal/construct/wraith/Life() + ..() + if(healths) + switch(health) + if(75 to INFINITY) healths.icon_state = "wraith_health0" + if(62 to 74) healths.icon_state = "wraith_health1" + if(50 to 61) healths.icon_state = "wraith_health2" + if(37 to 49) healths.icon_state = "wraith_health3" + if(25 to 36) healths.icon_state = "wraith_health4" + if(12 to 24) healths.icon_state = "wraith_health5" + if(1 to 11) healths.icon_state = "wraith_health6" + else healths.icon_state = "wraith_health7" + + +/mob/living/simple_animal/construct/harvester/Life() + ..() + if(healths) + switch(health) + if(150 to INFINITY) healths.icon_state = "harvester_health0" + if(125 to 149) healths.icon_state = "harvester_health1" + if(100 to 124) healths.icon_state = "harvester_health2" + if(75 to 99) healths.icon_state = "harvester_health3" + if(50 to 74) healths.icon_state = "harvester_health4" + if(25 to 49) healths.icon_state = "harvester_health5" + if(1 to 24) healths.icon_state = "harvester_health6" + else healths.icon_state = "harvester_health7" diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 339654558b..2fa81f08c8 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -1,3 +1,6 @@ +/obj/item/device/soulstone/cultify() + return + /obj/item/device/soulstone name = "Soul Stone Shard" icon = 'icons/obj/wizard.dmi' @@ -9,7 +12,6 @@ origin_tech = "bluespace=4;materials=4" var/imprinted = "empty" - //////////////////////////////Capturing//////////////////////////////////////////////////////// attack(mob/living/carbon/human/M as mob, mob/user as mob) @@ -86,7 +88,14 @@ name = "empty shell" icon = 'icons/obj/wizard.dmi' icon_state = "construct" - desc = "A wicked machine used by those skilled in magical arts. It is inactive" + desc = "A wicked machine used by those skilled in magical arts. It is inactive." + +/obj/structure/constructshell/cultify() + return + +/obj/structure/constructshell/cult + icon_state = "construct-cult" + desc = "This eerie contraption looks like it would come alive if supplied with a missing ingredient." /obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob) if(istype(O, /obj/item/device/soulstone)) @@ -122,7 +131,7 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = T flick("dust-h", animation) - del(animation) + qdel(animation) var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc ) S.loc = C //put shade in stone S.status_flags |= GODMODE //So they won't die inside the stone somehow @@ -143,7 +152,7 @@ U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone." U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." C.imprinted = "[S.name]" - del T + qdel(T) if("SHADE") var/mob/living/simple_animal/shade/T = target var/obj/item/device/soulstone/C = src @@ -175,33 +184,33 @@ Z.key = A.key if(iscultist(U)) cult.add_antagonist(Z.mind) - del(T) + qdel(T) Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike." Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." Z.cancel_camera() - del(C) + qdel(C) if("Wraith") var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) Z.key = A.key if(iscultist(U)) cult.add_antagonist(Z.mind) - del(T) + qdel(T) Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." Z.cancel_camera() - del(C) + qdel(C) if("Artificer") var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) Z.key = A.key if(iscultist(U)) cult.add_antagonist(Z.mind) - del(T) + qdel(T) Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs" Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." Z.cancel_camera() - del(C) + qdel(C) else U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" return diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 4f26dacdb6..93b79423ce 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -78,7 +78,7 @@ W.assignment = corpseidjob W.registered_name = M.real_name M.equip_to_slot_or_del(W, slot_wear_id) - del(src) + qdel(src) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 43b6c42cee..a1284503e1 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -59,7 +59,7 @@ health = min(maxHealth, health + MED.heal_brute) MED.amount -= 1 if(MED.amount <= 0) - del(MED) + qdel(MED) for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) M.show_message("\blue [user] applies the [MED] on [src]") diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index b7e72da0c6..433a46efb7 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -177,7 +177,7 @@ amount_grown += rand(1,2) if(amount_grown >= 100) new /mob/living/simple_animal/chicken(src.loc) - del(src) + qdel(src) var/const/MAX_CHICKENS = 50 var/global/chicken_count = 0 @@ -228,7 +228,7 @@ var/global/chicken_count = 0 if(!stat && eggsleft < 8) user.visible_message("\blue [user] feeds [O] to [name]! It clucks happily.","\blue You feed [O] to [name]! It clucks happily.") user.drop_item() - del(O) + qdel(O) eggsleft += rand(1, 4) else user << "\blue [name] doesn't seem hungry!" @@ -258,6 +258,6 @@ var/global/chicken_count = 0 visible_message("[src] hatches with a quiet cracking sound.") new /mob/living/simple_animal/chick(get_turf(src)) processing_objects.Remove(src) - del(src) + qdel(src) else processing_objects.Remove(src) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 5b207ce2a7..ad41fc28aa 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -56,7 +56,10 @@ verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide - name = "[name] ([rand(1, 1000)])" + if(name == initial(name)) + name = "[name] ([rand(1, 1000)])" + real_name = name + if(!body_color) body_color = pick( list("brown","gray","white") ) icon_state = "mouse_[body_color]" @@ -112,5 +115,10 @@ name = "Tom" desc = "Jerry the cat is not amused." +/mob/living/simple_animal/mouse/brown/Tom/New() + ..() + // Change my name back, don't want to be named Tom (666) + name = initial(name) + /mob/living/simple_animal/mouse/can_use_vents() - return \ No newline at end of file + return diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index dab2d2e2d9..d0a8e09207 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -45,4 +45,4 @@ S2.icon_living = "[src.colour] baby slime" S2.icon_dead = "[src.colour] baby slime dead" S2.colour = "[src.colour]" - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index ab4f7b2269..af59941b1f 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -185,7 +185,7 @@ src.name = "Spider-bot" update_icon() -/mob/living/simple_animal/spiderbot/Del() +/mob/living/simple_animal/spiderbot/Destroy() eject_brain() ..() @@ -210,7 +210,7 @@ held_item = null gibs(loc, viruses, null, null, /obj/effect/gibspawner/robot) //TODO: use gib() or refactor spiderbots into synthetics. - src.Del() + qdel(src) return //Cannibalized from the parrot mob. ~Zuhayr diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm new file mode 100644 index 0000000000..2bd3c8984a --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -0,0 +1,76 @@ +/mob/living/simple_animal/hostile/scarybat + name = "space bats" + desc = "A swarm of cute little blood sucking bats that looks pretty upset." + icon = 'icons/mob/bats.dmi' + icon_state = "bat" + icon_living = "bat" + icon_dead = "bat_dead" + icon_gib = "bat_dead" + speak_chance = 0 + turns_per_move = 3 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "hits the" + speed = 4 + maxHealth = 20 + health = 20 + + harm_intent_damage = 8 + melee_damage_lower = 10 + melee_damage_upper = 10 + attacktext = "bites" + attack_sound = 'sound/weapons/bite.ogg' + + //Space carp aren't affected by atmos. + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + environment_smash = 1 + + faction = "scarybat" + var/mob/living/owner + +/mob/living/simple_animal/hostile/scarybat/New(loc, mob/living/L as mob) + ..() + if(istype(L)) + owner = L + +/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(var/check_drift = 0) + return ..() //No drifting in space for space carp! //original comments do not steal + +/mob/living/simple_animal/hostile/scarybat/FindTarget() + . = ..() + if(.) + emote("flutters towards [.]") + +/mob/living/simple_animal/hostile/scarybat/Found(var/atom/A)//This is here as a potential override to pick a specific target if available + if(istype(A) && A == owner) + return 0 + return ..() + +/mob/living/simple_animal/hostile/scarybat/AttackingTarget() + . =..() + var/mob/living/L = . + if(istype(L)) + if(prob(15)) + L.Stun(1) + L.visible_message("\the [src] scares \the [L]!") + +/mob/living/simple_animal/hostile/scarybat/cult + faction = "cult" + supernatural = 1 + +/mob/living/simple_animal/hostile/scarybat/cult/cultify() + return + +/mob/living/simple_animal/hostile/scarybat/cult/Life() + ..() + check_horde() diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 07ad06619a..3ae0876903 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -13,4 +13,26 @@ attacktext = "chomped" attack_sound = 'sound/weapons/bite.ogg' faction = "creature" - speed = 4 \ No newline at end of file + speed = 4 + +/mob/living/simple_animal/hostile/creature/cult + faction = "cult" + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + supernatural = 1 + +/mob/living/simple_animal/hostile/creature/cult/cultify() + return + +/mob/living/simple_animal/hostile/creature/cult/Life() + ..() + check_horde() diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 14b069a6a1..44d9c5d1ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -46,4 +46,14 @@ if(istype(L)) if(prob(12)) L.Weaken(3) - L.visible_message("\the [src] knocks down \the [L]!") \ No newline at end of file + L.visible_message("\the [src] knocks down \the [L]!") + +/mob/living/simple_animal/hostile/faithless/cult + faction = "cult" + +/mob/living/simple_animal/hostile/faithless/cult/cultify() + return + +/mob/living/simple_animal/hostile/faithless/cult/Life() + ..() + check_horde() diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 26d69933e8..e358f3e69a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -51,7 +51,7 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - del src + qdel(src) return /mob/living/simple_animal/hostile/hivebot/tele//this still needs work @@ -95,7 +95,7 @@ if("rapid") new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src)) spawn(100) - del(src) + qdel(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 73ff6eab5d..cc58a7ce1c 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -14,6 +14,9 @@ stop_automated_movement_when_pulled = 0 var/destroy_surroundings = 1 + var/shuttletarget = null + var/enroute = 0 + /mob/living/simple_animal/hostile/proc/FindTarget() var/atom/T = null @@ -113,11 +116,11 @@ /mob/living/simple_animal/hostile/proc/ListTargets(var/dist = 7) var/list/L = hearers(src, dist) - + for (var/obj/mecha/M in mechas_list) if (get_dist(src, M) <= dist) L += M - + return L /mob/living/simple_animal/hostile/death() @@ -185,7 +188,7 @@ if(!A) return if (!istype(target, /turf)) - del(A) + qdel(A) return A.current = target A.starting = get_turf(src) @@ -206,3 +209,40 @@ var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir)) if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille)) obstacle.attack_generic(src,rand(melee_damage_lower,melee_damage_upper),attacktext) + + +/mob/living/simple_animal/hostile/proc/check_horde() + if(emergency_shuttle.shuttle.location) + if(!enroute && !target_mob) //The shuttle docked, all monsters rush for the escape hallway + if(!shuttletarget || (get_dist(src, shuttletarget) >= 2)) + shuttletarget = pick(escape_list) + enroute = 1 + stop_automated_movement = 1 + spawn() + if(!src.stat) + horde() + + if(get_dist(src, shuttletarget) <= 2) //The monster reached the escape hallway + enroute = 0 + stop_automated_movement = 0 + +/mob/living/simple_animal/hostile/proc/horde() + var/turf/T = get_step_to(src, shuttletarget) + for(var/atom/A in T) + if(istype(A,/obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/D = A + D.open(1) + else if(istype(A,/obj/structure/mineral_door)) + var/obj/structure/mineral_door/D = A + if(D.density) + D.Open() + else if(istype(A,/obj/structure/cult/pylon)) + A.attack_generic(src, rand(melee_damage_lower, melee_damage_upper)) + else if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/table/rack)) + A.attack_generic(src, rand(melee_damage_lower, melee_damage_upper)) + Move(T) + FindTarget() + if(!target_mob || enroute) + spawn(10) + if(!src.stat) + horde() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 4cd203ee08..4764dcd547 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -43,7 +43,7 @@ /mob/living/simple_animal/hostile/mimic/death() ..() - del(src) + qdel(src) // // Crate Mimic diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index e3a4ce4667..cddaadfccd 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -53,5 +53,5 @@ new corpse (src.loc) if(weapon1) new weapon1 (src.loc) - del src + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 872eb95b61..a2e9e21f75 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -159,9 +159,9 @@ /mob/living/simple_animal/hostile/retaliate/malf_drone/death() ..(null,"suddenly breaks apart.") - del(src) + qdel(src) -/mob/living/simple_animal/hostile/retaliate/malf_drone/Del() +/mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //some random debris left behind if(has_loot) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -183,16 +183,16 @@ step_to(O, get_turf(pick(view(7, src)))) //rods - O = new /obj/item/stack/rods(src.loc) + O = PoolOrNew(/obj/item/stack/rods, src.loc) step_to(O, get_turf(pick(view(7, src)))) if(prob(75)) - O = new /obj/item/stack/rods(src.loc) + O = PoolOrNew(/obj/item/stack/rods, src.loc) step_to(O, get_turf(pick(view(7, src)))) if(prob(50)) - O = new /obj/item/stack/rods(src.loc) + O = PoolOrNew(/obj/item/stack/rods, src.loc) step_to(O, get_turf(pick(view(7, src)))) if(prob(25)) - O = new /obj/item/stack/rods(src.loc) + O = PoolOrNew(/obj/item/stack/rods, src.loc) step_to(O, get_turf(pick(view(7, src)))) //plasteel diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 84f1c6f27a..ab044a02f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -51,5 +51,5 @@ new corpse (src.loc) if(weapon1) new weapon1 (src.loc) - del src + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 12f175cfef..e0845a399d 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -43,7 +43,7 @@ new weapon1 (src.loc) if(weapon2) new weapon2 (src.loc) - del src + qdel(src) return ///////////////Sword and shield//////////// @@ -159,4 +159,4 @@ /mob/living/simple_animal/hostile/viscerator/death() ..(null,"is smashed into pieces!") - del src + qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 50b2191d3e..56bcafd6f5 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -53,4 +53,4 @@ /mob/living/simple_animal/hostile/tree/death() ..(null,"is hacked into pieces!") new /obj/item/stack/sheet/wood(loc) - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 729bb3ff05..a05f394177 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -714,7 +714,7 @@ if(message_mode) if(message_mode in radiochannels) if(ears && istype(ears,/obj/item/device/radio)) - ears.talk_into(src,message, message_mode, verb, null) + ears.talk_into(src,sanitize(message), message_mode, verb, null) ..(message) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 98db91e7cc..359db24c63 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -28,20 +28,24 @@ faction = "cult" status_flags = CANPUSH +/mob/living/simple_animal/shade/cultify() + return + /mob/living/simple_animal/shade/Life() ..() + OnDeathInLife() + +/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri + if(istype(O, /obj/item/device/soulstone)) + O.transfer_soul("SHADE", src, user) + return + +/mob/living/simple_animal/shade/proc/OnDeathInLife() if(stat == 2) new /obj/item/weapon/ectoplasm (src.loc) for(var/mob/M in viewers(src, null)) if((M.client && !( M.blinded ))) M.show_message("\red [src] lets out a contented sigh as their form unwinds. ") ghostize() - del src + qdel(src) return - - -/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - if(istype(O, /obj/item/device/soulstone)) - O.transfer_soul("SHADE", src, user) - return - return ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 595ad0b672..881cb2d76a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -39,6 +39,7 @@ var/maxbodytemp = 350 var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp + var/fire_alert = 0 //Atmos effect - Yes, you can make creatures that require phoron or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage var/min_oxy = 5 @@ -78,6 +79,7 @@ return /mob/living/simple_animal/Life() + ..() //Health if(stat == DEAD) @@ -191,9 +193,13 @@ //Atmos effect if(bodytemperature < minbodytemp) + fire_alert = 2 adjustBruteLoss(cold_damage_per_tick) else if(bodytemperature > maxbodytemp) + fire_alert = 1 adjustBruteLoss(heat_damage_per_tick) + else + fire_alert = 0 if(!atmos_suitable) adjustBruteLoss(unsuitable_atoms_damage) @@ -268,7 +274,7 @@ adjustBruteLoss(-MED.heal_brute) MED.amount -= 1 if(MED.amount <= 0) - del(MED) + qdel(MED) for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) M.show_message("[user] chops up \the [src]!") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - del(src) + qdel(src) else user.visible_message("[user] butchers \the [src] messily!") gib() diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm index fe76fa87b4..6342c66576 100644 --- a/code/modules/mob/living/simple_animal/worm.dm +++ b/code/modules/mob/living/simple_animal/worm.dm @@ -98,7 +98,7 @@ return - Del() //if a chunk a destroyed, make a new worm out of the split halves + Destroy() //if a chunk a destroyed, make a new worm out of the split halves if(previous) previous.Detach() ..() @@ -170,7 +170,7 @@ if(die) newHead.death() - del(src) + qdel(src) proc/ProcessStomach() for(var/atom/movable/stomachContent in contents) @@ -179,16 +179,16 @@ if(!istype(stomachContent,/obj/item/stack/sheet/mineral/phoron)) var/obj/item/stack/oldStack = stomachContent new /obj/item/stack/sheet/mineral/phoron(src, oldStack.get_amount()) - del(oldStack) + qdel(oldStack) continue else if(istype(stomachContent,/obj/item)) //converts to plasma, keeping the w_class var/obj/item/oldItem = stomachContent new /obj/item/stack/sheet/mineral/phoron(src, oldItem.w_class) - del(oldItem) + qdel(oldItem) continue else new /obj/item/stack/sheet/mineral/phoron(src, flatPlasmaValue) //just flat amount - del(stomachContent) + qdel(stomachContent) continue if(previous) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index d34a309ee3..f1bb76c85d 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -31,7 +31,7 @@ client.images = null //remove the images such as AIs being unable to see runes client.screen = null //remove hud items just in case - if(hud_used) del(hud_used) //remove the hud objects + if(hud_used) qdel(hud_used) //remove the hud objects hud_used = new /datum/hud(src) next_move = 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 482ec2e3a1..e9cae30755 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1,7 +1,12 @@ -/mob/Del()//This makes sure that mobs with clients/keys are not just deleted from the game. +/mob/Destroy()//This makes sure that mobs with clients/keys are not just deleted from the game. mob_list -= src dead_mob_list -= src living_mob_list -= src + qdel(hud_used) + if(mind && mind.current == src) + spellremove(src) + for(var/infection in viruses) + qdel(infection) ghostize() ..() @@ -179,7 +184,7 @@ P.invisibility = invisibility spawn (20) if(P) - del(P) // qdel + qdel(P) // qdel face_atom(A) return 1 @@ -213,7 +218,7 @@ var/list/temp = list( ) temp += L.container //L = null - del(L) + qdel(L) return temp else return L.container @@ -263,7 +268,6 @@ set name = "Add Note" set category = "IC" - msg = copytext(msg, 1, MAX_MESSAGE_LEN) msg = sanitize(msg) if(mind) @@ -305,7 +309,7 @@ if(lentext(msg) <= 40) return "\blue [msg]" else - return "\blue [copytext(msg, 1, 37)]... More..." + return "\blue [copytext_preserve_html(msg, 1, 37)]... More..." /* /mob/verb/help() @@ -368,7 +372,7 @@ var/mob/new_player/M = new /mob/new_player() if(!client) log_game("[usr.key] AM failed due to disconnect.") - del(M) + qdel(M) return M.key = key @@ -379,8 +383,6 @@ set name = "Changelog" set category = "OOC" getFiles( - 'html/postcardsmall.jpg', - 'html/somerights20.png', 'html/88x31.png', 'html/bug-minus.png', 'html/cross-circle.png', @@ -436,7 +438,7 @@ namecounts[name] = 1 creatures[name] = O - if(istype(O, /obj/machinery/singularity)) + if(istype(O, /obj/singularity)) var/name = "Singularity" if (names.Find(name)) namecounts[name]++ @@ -718,60 +720,19 @@ note dizziness decrements automatically in the mob's Life() proc. //reset the pixel offsets to zero is_floating = 0 -/proc/getStatName(var/datum/controller/process/process) - return uppertext(copytext(process.name, 1, 4)) - /mob/Stat() ..() if(client && client.holder) if(statpanel("Status")) - stat(null,"Location:\t([x], [y], [z])") - stat(null,"CPU:\t[world.cpu]") - stat(null,"Instances:\t[world.contents.len]") + statpanel("Status","Location:","([x], [y], [z])") + statpanel("Status","CPU:","[world.cpu]") + statpanel("Status","Instances:","[world.contents.len]") if(statpanel("Status") && processScheduler && processScheduler.getIsRunning()) - var/datum/controller/process/process - - process = processScheduler.getProcess("ticker") - stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("air") - stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("lighting") - stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("alarm") - var/list/alarms = alarm_manager.active_alarms() - stat(null, "[getStatName(process)]([alarms.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("mob") - stat(null, "[getStatName(process)]([mob_list.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("machinery") - stat(null, "[getStatName(process)]([machines.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("obj") - stat(null, "[getStatName(process)]([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("pipenet") - stat(null, "[getStatName(process)]([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("powernet") - stat(null, "[getStatName(process)]([powernets.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("nanoui") - stat(null, "[getStatName(process)]([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("disease") - stat(null, "[getStatName(process)]([active_diseases.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - - process = processScheduler.getProcess("sun") - stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - + for(var/datum/controller/process/P in processScheduler.processes) + statpanel("Status",P.getStatName(), P.getTickTime()) else - stat(null, "processScheduler is not running.") - + statpanel("Status","processScheduler is not running.") if(listed_turf && client) if(!TurfAdjacent(listed_turf)) @@ -779,25 +740,14 @@ note dizziness decrements automatically in the mob's Life() proc. else statpanel(listed_turf.name, null, listed_turf) for(var/atom/A in listed_turf) + if(!A.mouse_opacity) + continue if(A.invisibility > see_invisible) continue if(is_type_in_list(A, shouldnt_see)) continue statpanel(listed_turf.name, null, A) - if(spell_list && spell_list.len) - for(var/obj/effect/proc_holder/spell/S in spell_list) - switch(S.charge_type) - if("recharge") - statpanel("Spells","[S.charge_counter/10.0]/[S.charge_max/10]",S) - if("charges") - statpanel("Spells","[S.charge_counter]/[S.charge_max]",S) - if("holdervar") - statpanel("Spells","[S.holder_var_type] [S.holder_var_amount]",S) - - - - // facing verbs /mob/proc/canface() if(!canmove) return 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 9b17a182aa..792517c6d0 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -29,10 +29,14 @@ var/obj/screen/damageoverlay = null var/obj/screen/pain = null var/obj/screen/gun/item/item_use_icon = null + var/obj/screen/gun/radio/radio_use_icon = null var/obj/screen/gun/move/gun_move_icon = null var/obj/screen/gun/run/gun_run_icon = null var/obj/screen/gun/mode/gun_setting_icon = null + //spells hud icons - this interacts with add_spell and remove_spell + var/list/obj/screen/movable/spell_master/spell_masters = null + /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. The current method unnecessarily clusters up the variable list, especially for humans (although rearranging won't really clean it up a lot but the difference will be noticable for other mobs). @@ -83,6 +87,8 @@ var/lying = 0 var/lying_prev = 0 var/canmove = 1 + //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. + var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas. var/lastpuke = 0 var/unacidable = 0 var/small = 0 @@ -182,7 +188,7 @@ var/mob/living/carbon/LAssailant = null //Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button - var/obj/effect/proc_holder/spell/list/spell_list = list() + var/spell/list/spell_list = list() //Changlings, but can be used in other modes // var/obj/effect/proc_holder/changpower/list/power_list = list() diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 39895f22b2..73c5ee1de7 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -25,7 +25,7 @@ affecting = victim if(affecting.anchored) - del(src) + qdel(src) return affecting.grabbed_by += src @@ -35,9 +35,16 @@ hud.name = "reinforce grab" hud.master = src -/obj/item/weapon/grab/Del() +/obj/item/weapon/grab/Destroy() //make sure the grabbed_by list doesn't fill up with nulls - if(affecting) affecting.grabbed_by -= src + if(affecting) + affecting.grabbed_by -= src + affecting = null + if(assailant) + if(assailant.client) + assailant.client.screen -= hud + assailant = null + qdel(hud) ..() //Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code. @@ -96,7 +103,7 @@ affecting.loc = assailant.loc if(state >= GRAB_NECK) - affecting.Stun(1) + affecting.Stun(3) if(isliving(affecting)) var/mob/living/L = affecting L.adjustOxyLoss(1) @@ -118,7 +125,7 @@ if(world.time < (last_upgrade + UPGRADE_COOLDOWN)) return if(!assailant.canmove || assailant.lying) - del(src) + qdel(src) return last_upgrade = world.time @@ -152,10 +159,10 @@ if(state == GRAB_KILL) return if(!affecting) - del(src) + qdel(src) return if(!assailant.canmove || assailant.lying) - del(src) + qdel(src) return state = GRAB_KILL assailant.visible_message("[assailant] has tightened \his grip on [affecting]'s neck!") @@ -174,12 +181,12 @@ //This is used to make sure the victim hasn't managed to yackety sax away before using the grab. /obj/item/weapon/grab/proc/confirm() if(!assailant || !affecting) - del(src) + qdel(src) return 0 if(affecting) if(!isturf(assailant.loc) || ( !isturf(affecting.loc) || assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1) ) - del(src) + qdel(src) return 0 return 1 @@ -216,12 +223,12 @@ user.visible_message("[user] devours [affecting]!") affecting.loc = user attacker.stomach_contents.Add(affecting) - del(src) + qdel(src) /obj/item/weapon/grab/dropped() - del(src) + qdel(src) -/obj/item/weapon/grab/Del() - del(hud) +/obj/item/weapon/grab/Destroy() + qdel(hud) ..() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 370a921d3c..4138c1454b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -92,8 +92,8 @@ /mob/living/silicon/ai/isAI() return 1 - -/mob/proc/isRobot() + +/mob/proc/isRobot() return 0 /mob/living/silicon/robot/isRobot() @@ -108,6 +108,15 @@ /mob/living/silicon/isSynthetic() return 1 +/mob/living/carbon/human/isMonkey() + return istype(species, /datum/species/monkey) + +/mob/proc/isMonkey() + return 0 + +/mob/living/carbon/human/isMonkey() + return istype(species, /datum/species/monkey) + /proc/ispAI(A) if(istype(A, /mob/living/silicon/pai)) return 1 @@ -606,3 +615,7 @@ proc/is_blind(A) eyeobj.setLoc(C) return 1 + +// Returns true if the mob has a client which has been active in the last given X minutes. +/mob/proc/is_client_active(var/active = 1) + return client && client.inactivity < active MINUTES diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index baf1d29968..b894bac182 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -170,23 +170,27 @@ /client/Move(n, direct) + if(!mob) + return // Moved here to avoid nullrefs below if(mob.control_object) Move_object(direct) - if(isobserver(mob)) return mob.Move(n,direct) + if(mob.incorporeal_move && isobserver(mob)) + Process_Incorpmove(direct) + return if(moving) return 0 if(world.time < move_delay) return - if(!mob) return - if(locate(/obj/effect/stop/, mob.loc)) for(var/obj/effect/stop/S in mob.loc) if(S.victim == mob) return - if(mob.stat==2) return + if(mob.stat==DEAD && isliving(mob)) + mob.ghostize() + return // handle possible Eye movement if(mob.eyeobj) @@ -364,13 +368,16 @@ ///Allows mobs to run though walls /client/proc/Process_Incorpmove(direct) var/turf/mobloc = get_turf(mob) - if(!isliving(mob)) - return - var/mob/living/L = mob - switch(L.incorporeal_move) + + switch(mob.incorporeal_move) if(1) - L.loc = get_step(L, direct) - L.dir = direct + var/turf/T = get_step(mob, direct) + if(mob.check_holy(T)) + mob << "You cannot get past holy grounds while you are in this plane of existence!" + return + else + mob.loc = get_step(mob, direct) + mob.dir = direct if(2) if(prob(50)) var/locx @@ -398,21 +405,35 @@ return else return - L.loc = locate(locx,locy,mobloc.z) + mob.loc = locate(locx,locy,mobloc.z) spawn(0) var/limit = 2//For only two trailing shadows. - for(var/turf/T in getline(mobloc, L.loc)) + for(var/turf/T in getline(mobloc, mob.loc)) spawn(0) - anim(T,L,'icons/mob/mob.dmi',,"shadow",,L.dir) + anim(T,mob,'icons/mob/mob.dmi',,"shadow",,mob.dir) limit-- if(limit<=0) break else spawn(0) - anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir) - L.loc = get_step(L, direct) - L.dir = direct + anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,mob.dir) + mob.loc = get_step(mob, direct) + mob.dir = direct + // Crossed is always a bit iffy + for(var/obj/S in mob.loc) + if(istype(S,/obj/effect/step_trigger) || istype(S,/obj/effect/beam)) + S.Crossed(mob) + + var/area/A = get_area_master(mob) + if(A) + A.Entered(mob) + if(isturf(mob.loc)) + var/turf/T = mob.loc + T.Entered(mob) + mob.Post_Incorpmove() return 1 +/mob/proc/Post_Incorpmove() + return ///Process_Spacemove ///Called by /client/Move() diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index f07cadb9e8..da68dfc0cc 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -1,58 +1,58 @@ - -//This proc is the most basic of the procs. All it does is make a new mob on the same tile and transfer over a few variables. -//Returns the new mob -//Note that this proc does NOT do MMI related stuff! -/mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/subspecies) - - if(istype(src,/mob/new_player)) - usr << "\red cannot convert players who have not entered yet." - return - - if(!new_type) - new_type = input("Mob type path:", "Mob type") as text|null - - if(istext(new_type)) - new_type = text2path(new_type) - - if( !ispath(new_type) ) - usr << "Invalid type path (new_type = [new_type]) in change_mob_type(). Contact a coder." - return - - if( new_type == /mob/new_player ) - usr << "\red cannot convert into a new_player mob type." - return - - var/mob/M - if(isturf(location)) - M = new new_type( location ) - else - M = new new_type( src.loc ) - - if(!M || !ismob(M)) - usr << "Type path is not a mob (new_type = [new_type]) in change_mob_type(). Contact a coder." - del(M) - return - - if( istext(new_name) ) - M.name = new_name - M.real_name = new_name - else - M.name = src.name - M.real_name = src.real_name - - if(src.dna) - M.dna = src.dna.Clone() - - if(mind) - mind.transfer_to(M) - else - M.key = key - - if(subspecies && istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - H.set_species(subspecies) - - if(delete_old_mob) - spawn(1) - del(src) - return M + +//This proc is the most basic of the procs. All it does is make a new mob on the same tile and transfer over a few variables. +//Returns the new mob +//Note that this proc does NOT do MMI related stuff! +/mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/subspecies) + + if(istype(src,/mob/new_player)) + usr << "\red cannot convert players who have not entered yet." + return + + if(!new_type) + new_type = input("Mob type path:", "Mob type") as text|null + + if(istext(new_type)) + new_type = text2path(new_type) + + if( !ispath(new_type) ) + usr << "Invalid type path (new_type = [new_type]) in change_mob_type(). Contact a coder." + return + + if( new_type == /mob/new_player ) + usr << "\red cannot convert into a new_player mob type." + return + + var/mob/M + if(isturf(location)) + M = new new_type( location ) + else + M = new new_type( src.loc ) + + if(!M || !ismob(M)) + usr << "Type path is not a mob (new_type = [new_type]) in change_mob_type(). Contact a coder." + qdel(M) + return + + if( istext(new_name) ) + M.name = new_name + M.real_name = new_name + else + M.name = src.name + M.real_name = src.real_name + + if(src.dna) + M.dna = src.dna.Clone() + + if(mind) + mind.transfer_to(M) + else + M.key = key + + if(subspecies && istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + H.set_species(subspecies) + + if(delete_old_mob) + spawn(1) + qdel(src) + return M diff --git a/code/modules/mob/new_player/logout.dm b/code/modules/mob/new_player/logout.dm index 9f064a99cd..ad1c9b3098 100644 --- a/code/modules/mob/new_player/logout.dm +++ b/code/modules/mob/new_player/logout.dm @@ -3,5 +3,5 @@ ..() if(!spawning)//Here so that if they are spawning and log out, the other procs can play out and they will have a mob to come back to. key = null//We null their key before deleting the mob, so they are properly kicked out. - del(src) + qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 1d67b712f5..360699b991 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -135,7 +135,7 @@ if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. observer.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! observer.key = key - del(src) + qdel(src) return 1 @@ -327,8 +327,8 @@ AnnounceCyborg(character, rank, "has been downloaded to the empty core in \the [character.loc.loc]") ticker.mode.latespawn(character) - del(C) - del(src) + qdel(C) + qdel(src) return //Find our spawning point. @@ -368,7 +368,7 @@ else AnnounceCyborg(character, rank, join_message) - del(src) + qdel(src) proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) if (ticker.current_state == GAME_STATE_PLAYING) @@ -474,6 +474,7 @@ // Do the initial caching of the player's body icons. new_character.force_update_limbs() + new_character.update_eyes() new_character.regenerate_icons() new_character.key = key //Manually transfer the key to log them in diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 6330504e3c..00b6a3b8e4 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -179,9 +179,9 @@ datum/preferences proc/update_preview_icon() //seriously. This is horrendous. - del(preview_icon_front) - del(preview_icon_side) - del(preview_icon) + qdel(preview_icon_front) + qdel(preview_icon_side) + qdel(preview_icon) var/g = "m" if(gender == FEMALE) g = "f" @@ -690,7 +690,7 @@ datum/preferences preview_icon_front = new(preview_icon, dir = SOUTH) preview_icon_side = new(preview_icon, dir = WEST) - del(eyes_s) - del(underwear_s) - del(undershirt_s) - del(clothes_s) + qdel(eyes_s) + qdel(underwear_s) + qdel(undershirt_s) + qdel(clothes_s) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 958f0b982a..c0a7fbce3c 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -12,7 +12,7 @@ icon = null invisibility = 101 for(var/t in organs) - del(t) + qdel(t) var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' @@ -37,7 +37,7 @@ dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) src << "You are now [species.name]. " - del(animation) + qdel(animation) return src @@ -49,7 +49,7 @@ if (monkeyizing) return for(var/t in organs) - del(t) + qdel(t) return ..(move) @@ -106,8 +106,7 @@ O.add_ai_verbs() O.rename_self("ai",1) - spawn(0) - del(src) + qdel(src) return O //human -> robot @@ -122,7 +121,7 @@ icon = null invisibility = 101 for(var/t in organs) - del(t) + qdel(t) var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc ) @@ -159,8 +158,7 @@ callHook("borgify", list(O)) O.Namepick() - spawn(0)//To prevent the proc from returning null. - del(src) + qdel(src) return O //human -> alien @@ -175,7 +173,7 @@ icon = null invisibility = 101 for(var/t in organs) - del(t) + qdel(t) var/alien_caste = pick("Hunter","Sentinel","Drone") var/mob/living/carbon/human/new_xeno = create_new_xenomorph(alien_caste,loc) @@ -184,8 +182,7 @@ new_xeno.key = key new_xeno << "You are now an alien." - spawn(0)//To prevent the proc from returning null. - del(src) + qdel(src) return /mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num) @@ -199,7 +196,7 @@ icon = null invisibility = 101 for(var/t in organs) - del(t) + qdel(t) var/mob/living/carbon/slime/new_slime if(reproduce) @@ -219,8 +216,7 @@ new_slime.key = key new_slime << "You are now a slime. Skreee!" - spawn(0)//To prevent the proc from returning null. - del(src) + qdel(src) return /mob/living/carbon/human/proc/corgize() @@ -234,15 +230,14 @@ icon = null invisibility = 101 for(var/t in organs) //this really should not be necessary - del(t) + qdel(t) var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) new_corgi.a_intent = I_HURT new_corgi.key = key new_corgi << "You are now a Corgi. Yap Yap!" - spawn(0)//To prevent the proc from returning null. - del(src) + qdel(src) return /mob/living/carbon/human/Animalize() @@ -266,7 +261,7 @@ invisibility = 101 for(var/t in organs) - del(t) + qdel(t) var/mob/new_mob = new mobpath(src.loc) @@ -276,7 +271,7 @@ new_mob << "You suddenly feel more... animalistic." spawn() - del(src) + qdel(src) return /mob/proc/Animalize() @@ -294,7 +289,7 @@ new_mob.a_intent = I_HURT new_mob << "You feel more... animalistic" - del(src) + qdel(src) /* Certain mob types have problems and should not be allowed to be controlled by players. * diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 480c4be322..33c54cf63b 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -2,8 +2,11 @@ //Having them here also makes for a nice reference list of the various overlay-updating procs available //default item on-mob icons +#define INV_BACK_DEF_ICON 'icons/mob/back.dmi' #define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi' #define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi' +#define INV_W_UNIFORM_DEF_ICON 'icons/mob/uniform.dmi' +#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi' /mob/proc/regenerate_icons() //TODO: phase this out completely if possible diff --git a/code/modules/nano/interaction/admin.dm b/code/modules/nano/interaction/admin.dm new file mode 100644 index 0000000000..59de0ce22e --- /dev/null +++ b/code/modules/nano/interaction/admin.dm @@ -0,0 +1,7 @@ +/* + This state checks that the user is an admin, end of story +*/ +/var/global/datum/topic_state/admin_state/admin_state = new() + +/datum/topic_state/admin_state/can_use_topic(var/src_object, var/mob/user) + return check_rights(R_ADMIN, 0, user) ? STATUS_INTERACTIVE : STATUS_CLOSE diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm new file mode 100644 index 0000000000..10cda75162 --- /dev/null +++ b/code/modules/nano/interaction/base.dm @@ -0,0 +1,34 @@ +/atom/proc/nano_host() + return src + +/atom/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state) + var/src_object = nano_host() + return state.can_use_topic(src_object, user) + +/datum/topic_state/proc/href_list(var/mob/user) + return list() + +/datum/topic_state/proc/can_use_topic(var/src_object, var/mob/user) + return STATUS_CLOSE + +/mob/proc/shared_nano_interaction() + if (src.stat || !client) + return STATUS_CLOSE // no updates, close the interface + else if (restrained() || lying || stat || stunned || weakened) + return STATUS_UPDATE // update only (orange visibility) + return STATUS_INTERACTIVE + +/mob/living/silicon/ai/shared_nano_interaction() + if(lacks_power()) + return STATUS_CLOSE + if (check_unable(1)) + return STATUS_CLOSE + return ..() + +/mob/living/silicon/robot/shared_nano_interaction() + . = STATUS_INTERACTIVE + if(cell.charge <= 0) + return STATUS_CLOSE + if(lockcharge) + . = STATUS_DISABLED + return min(., ..()) diff --git a/code/modules/nano/interaction/contained.dm b/code/modules/nano/interaction/contained.dm new file mode 100644 index 0000000000..9ef595d020 --- /dev/null +++ b/code/modules/nano/interaction/contained.dm @@ -0,0 +1,18 @@ +/* + This state checks if user is somewhere within src_object, as well as the default NanoUI interaction. +*/ +/var/global/datum/topic_state/contained_state/contained_state = new() + +/datum/topic_state/contained_state/can_use_topic(var/atom/src_object, var/mob/user) + if(!src_object.contains(user)) + return STATUS_CLOSE + + return user.shared_nano_interaction() + +/atom/proc/contains(var/atom/location) + if(!location) + return 0 + if(location == src) + return 1 + + return contains(location.loc) diff --git a/code/modules/nano/nanointeraction.dm b/code/modules/nano/interaction/default.dm similarity index 55% rename from code/modules/nano/nanointeraction.dm rename to code/modules/nano/interaction/default.dm index d929cfe2b5..aa692e0a23 100644 --- a/code/modules/nano/nanointeraction.dm +++ b/code/modules/nano/interaction/default.dm @@ -1,41 +1,36 @@ -/atom/proc/nano_host() - return src +/var/global/datum/topic_state/default/default_state = new() -/obj/nano_module/nano_host() - return loc +/datum/topic_state/default/href_list(var/mob/user) + return list() +/datum/topic_state/default/can_use_topic(var/src_object, var/mob/user) + return user.default_can_use_topic(src_object) -/atom/proc/CanUseTopic(var/mob/user, href_list, var/datum/topic_state/custom_state) - return user.can_use_topic(nano_host(), custom_state) - - -/mob/proc/can_use_topic(var/mob/user, var/datum/topic_state/custom_state) +/mob/proc/default_can_use_topic(var/src_object) return STATUS_CLOSE // By default no mob can do anything with NanoUI -/mob/dead/observer/can_use_topic() +/mob/dead/observer/default_can_use_topic() if(check_rights(R_ADMIN, 0, src)) return STATUS_INTERACTIVE // Admins are more equal return STATUS_UPDATE // Ghosts can view updates -/mob/living/silicon/pai/can_use_topic(var/src_object) +/mob/living/silicon/pai/default_can_use_topic(var/src_object) if(src_object == src && !stat) return STATUS_INTERACTIVE else return ..() -/mob/living/silicon/robot/can_use_topic(var/src_object, var/datum/topic_state/custom_state) - if(stat || !client) - return STATUS_CLOSE - if(lockcharge || stunned || weakened) - return STATUS_DISABLED - if(custom_state.flags & NANO_IGNORE_DISTANCE) - return STATUS_INTERACTIVE +/mob/living/silicon/robot/default_can_use_topic(var/src_object) + . = shared_nano_interaction() + if(. <= STATUS_DISABLED) + return + // robots can interact with things they can see within their view range if((src_object in view(src)) && get_dist(src_object, src) <= src.client.view) return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility) -/mob/living/silicon/robot/syndicate/can_use_topic(var/src_object) +/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object) . = ..() if(. != STATUS_INTERACTIVE) return @@ -50,9 +45,11 @@ return STATUS_INTERACTIVE return STATUS_UPDATE -/mob/living/silicon/ai/can_use_topic(var/src_object) - if(!client || check_unable(1)) - return STATUS_CLOSE +/mob/living/silicon/ai/default_can_use_topic(var/src_object) + . = shared_nano_interaction() + if(. != STATUS_INTERACTIVE) + return + // Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras) // unless it's on the same level as the object it's interacting with. var/turf/T = get_turf(src_object) @@ -66,31 +63,19 @@ // If we're installed in a chassi, rather than transfered to an inteliCard or other container, then check if we have camera view if(is_in_chassis()) //stop AIs from leaving windows open and using then after they lose vision - //apc_override is needed here because AIs use their own APC when powerless if(cameranet && !cameranet.checkTurfVis(get_turf(src_object))) - return apc_override ? STATUS_INTERACTIVE : STATUS_CLOSE + return STATUS_CLOSE + return STATUS_INTERACTIVE + else if(get_dist(src_object, src) <= client.view) // View does not return what one would expect while installed in an inteliCard return STATUS_INTERACTIVE - return STATUS_CLOSE - -/mob/living/proc/shared_living_nano_interaction(var/src_object) - if (src.stat != CONSCIOUS) - return STATUS_CLOSE // no updates, close the interface - else if (restrained() || lying || stat || stunned || weakened) - return STATUS_UPDATE // update only (orange visibility) - return STATUS_INTERACTIVE + return STATUS_CLOSE //Some atoms such as vehicles might have special rules for how mobs inside them interact with NanoUI. /atom/proc/contents_nano_distance(var/src_object, var/mob/living/user) return user.shared_living_nano_distance(src_object) /mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object) - if(!isturf(src_object.loc)) - if(src_object.loc == src) // Item in the inventory - return STATUS_INTERACTIVE - if(src.contents.Find(src_object.loc)) // A hidden uplink inside an item - return STATUS_INTERACTIVE - if (!(src_object in view(4, src))) // If the src object is not in visable, disable updates return STATUS_CLOSE @@ -103,27 +88,17 @@ return STATUS_DISABLED // no updates, completely disabled (red visibility) return STATUS_CLOSE -/mob/living/can_use_topic(var/src_object, var/datum/topic_state/custom_state) - . = shared_living_nano_interaction(src_object) - if(. == STATUS_INTERACTIVE && !(custom_state.flags & NANO_IGNORE_DISTANCE)) +/mob/living/default_can_use_topic(var/src_object) + . = shared_nano_interaction(src_object) + if(. != STATUS_CLOSE) if(loc) - . = loc.contents_nano_distance(src_object, src) - else - . = shared_living_nano_distance(src_object) + . = min(., loc.contents_nano_distance(src_object, src)) if(STATUS_INTERACTIVE) return STATUS_UPDATE -/mob/living/carbon/human/can_use_topic(var/src_object, var/datum/topic_state/custom_state) - . = shared_living_nano_interaction(src_object) - if(. == STATUS_INTERACTIVE && !(custom_state.flags & NANO_IGNORE_DISTANCE)) - . = shared_living_nano_distance(src_object) +/mob/living/carbon/human/default_can_use_topic(var/src_object) + . = shared_nano_interaction(src_object) + if(. != STATUS_CLOSE) + . = min(., shared_living_nano_distance(src_object)) if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction. return STATUS_INTERACTIVE - -/var/global/datum/topic_state/default_state = new() - -/datum/topic_state - var/flags = 0 - -/datum/topic_state/proc/href_list(var/mob/user) - return list() \ No newline at end of file diff --git a/code/modules/nano/interaction/inventory.dm b/code/modules/nano/interaction/inventory.dm new file mode 100644 index 0000000000..dd320f2bb2 --- /dev/null +++ b/code/modules/nano/interaction/inventory.dm @@ -0,0 +1,11 @@ +/* + This state checks that the src_object is somewhere in the user's first-level inventory (in hands, on ear, etc.), but not further down (such as in bags). +*/ +/var/global/datum/topic_state/inventory_state/inventory_state = new() + +/datum/topic_state/inventory_state/can_use_topic(var/src_object, var/mob/user) + if(!(src_object in user)) + return STATUS_CLOSE + + + return user.shared_nano_interaction() diff --git a/code/modules/nano/interaction/physical.dm b/code/modules/nano/interaction/physical.dm new file mode 100644 index 0000000000..36f9a20971 --- /dev/null +++ b/code/modules/nano/interaction/physical.dm @@ -0,0 +1,18 @@ +/var/global/datum/topic_state/physical/physical_state = new() + +/datum/topic_state/physical/can_use_topic(var/src_object, var/mob/user) + . = user.shared_nano_interaction(src_object) + if(. > STATUS_CLOSE) + return min(., user.check_physical_distance(src_object)) + +/mob/proc/check_physical_distance(var/src_object) + return STATUS_CLOSE + +/mob/dead/observer/check_physical_distance(var/src_object) + return default_can_use_topic(src_object) + +/mob/living/check_physical_distance(var/src_object) + return shared_living_nano_distance(src_object) + +/mob/living/silicon/check_physical_distance(var/src_object) + return max(STATUS_UPDATE, shared_living_nano_distance(src_object)) diff --git a/code/modules/nano/interaction/self.dm b/code/modules/nano/interaction/self.dm new file mode 100644 index 0000000000..639e50e161 --- /dev/null +++ b/code/modules/nano/interaction/self.dm @@ -0,0 +1,9 @@ +/* + This state checks that the src_object is the same the as user +*/ +/var/global/datum/topic_state/self_state/self_state = new() + +/datum/topic_state/self_state/can_use_topic(var/src_object, var/mob/user) + if(src_object != user) + return STATUS_CLOSE + return user.shared_nano_interaction() diff --git a/code/modules/nano/interaction/zlevel.dm b/code/modules/nano/interaction/zlevel.dm new file mode 100644 index 0000000000..80d4c2e601 --- /dev/null +++ b/code/modules/nano/interaction/zlevel.dm @@ -0,0 +1,13 @@ +/* + This state checks that the user is on the same Z-level as src_object +*/ + +/var/global/datum/topic_state/z_state/z_state = new() + +/datum/topic_state/z_state/can_use_topic(var/src_object, var/mob/user) + var/turf/turf_obj = get_turf(src_object) + var/turf/turf_usr = get_turf(user) + if(!turf_obj || !turf_usr) + return STATUS_CLOSE + + return turf_obj.z == turf_usr.z ? STATUS_INTERACTIVE : STATUS_CLOSE diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index 9047023bf1..88c5d6bbef 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -63,7 +63,7 @@ usr.switch_to_camera(C) return 1 -/obj/nano_module/alarm_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/nano_module/alarm_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/data[0] var/categories[0] @@ -85,12 +85,12 @@ "origin_lost" = A.origin == null, "has_cameras" = cameras.len, "cameras" = cameras, - "lost_sources" = sanitize(english_list(lost_sources, nothing_text = "", and_text = ", ")))) + "lost_sources" = lost_sources.len ? sanitize(english_list(lost_sources, nothing_text = "", and_text = ", ")) : "")) data["categories"] = categories ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "alarm_monitor.tmpl", "Alarm Monitoring Console", 800, 800) + ui = new(user, src, ui_key, "alarm_monitor.tmpl", "Alarm Monitoring Console", 800, 800, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm new file mode 100644 index 0000000000..3897526865 --- /dev/null +++ b/code/modules/nano/modules/atmos_control.dm @@ -0,0 +1,74 @@ +/obj/nano_module/atmos_control + name = "Atmospherics Control" + var/ui_ref + var/emagged = 0 + var/list/monitored_alarms = list() + var/datum/topic_state/atmos_state + +/obj/nano_module/atmos_control/New(atmos_computer, req_access, req_one_access, monitored_alarm_ids) + ..() + loc = atmos_computer + src.req_access = req_access + src.req_one_access = req_one_access + atmos_state = default_state + + if(monitored_alarm_ids) + for(var/obj/machinery/alarm/alarm in machines) + if(alarm.alarm_id && alarm.alarm_id in monitored_alarm_ids) + monitored_alarms += alarm + // machines may not yet be ordered at this point + monitored_alarms = dd_sortedObjectList(monitored_alarms) + +/obj/nano_module/atmos_control/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["alarm"]) + if(ui_ref) + var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms.len ? monitored_alarms : machines) + if(alarm) + var/datum/topic_state/TS = generate_state(alarm) + alarm.ui_interact(usr, master_ui = ui_ref, state = TS) + return 1 + +/obj/nano_module/atmos_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state) + var/data[0] + var/alarms[0] + + // TODO: Move these to a cache, similar to cameras + for(var/obj/machinery/alarm/alarm in (monitored_alarms.len ? monitored_alarms : machines)) + alarms[++alarms.len] = list("name" = sanitize(alarm.name), "ref"= "\ref[alarm]", "danger" = max(alarm.danger_level, alarm.alarm_area.atmosalm)) + data["alarms"] = alarms + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "atmos_control.tmpl", src.name, 625, 625, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + ui_ref = ui + +/obj/nano_module/atmos_control/proc/generate_state(air_alarm) + var/datum/topic_state/air_alarm/state = new() + state.atmos_control = src + state.air_alarm = air_alarm + return state + +/datum/topic_state/air_alarm + var/obj/nano_module/atmos_control/atmos_control = null + var/obj/machinery/alarm/air_alarm = null + +/datum/topic_state/air_alarm/can_use_topic(var/src_object, var/mob/user) + if(has_access(user)) + return STATUS_INTERACTIVE + return STATUS_UPDATE + +/datum/topic_state/air_alarm/href_list(var/mob/user) + var/list/extra_href = list() + extra_href["remote_connection"] = 1 + extra_href["remote_access"] = has_access(user) + + return extra_href + +/datum/topic_state/air_alarm/proc/has_access(var/mob/user) + return user && (user.isAI() || atmos_control.allowed(user) || atmos_control.emagged || air_alarm.rcon_setting == RCON_YES || (air_alarm.alarm_area.atmosalm && air_alarm.rcon_setting == RCON_AUTO)) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index bb60182a1b..2758b859d7 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -25,7 +25,7 @@ AI.ai_actual_track(H) return 1 -/obj/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/nano_module/crew_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) user.set_machine(src) src.scan() @@ -74,7 +74,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 800) + ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 800, state = state) // adding a template with the key "mapContent" enables the map ui functionality ui.add_template("mapContent", "crew_monitor_map_content.tmpl") diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index be2259d618..47324c47b0 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -18,7 +18,7 @@ src.whitelist = species_whitelist src.blacklist = species_blacklist -/obj/nano_module/appearance_changer/Topic(ref, href_list) +/obj/nano_module/appearance_changer/Topic(ref, href_list, var/nowindow, var/datum/topic_state/state = default_state) if(..()) return 1 @@ -35,13 +35,13 @@ if(href_list["skin_tone"]) if(can_change_skin_tone()) var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", owner.s_tone) as num|null - if(isnum(new_s_tone) && CanUseTopic(usr) == STATUS_INTERACTIVE) + if(isnum(new_s_tone) && can_still_topic(state)) new_s_tone = 35 - max(min( round(new_s_tone), 220),1) return owner.change_skin_tone(new_s_tone) if(href_list["skin_color"]) if(can_change_skin_color()) var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null - if(new_skin && can_still_topic()) + if(new_skin && can_still_topic(state)) var/r_skin = hex2num(copytext(new_skin, 2, 4)) var/g_skin = hex2num(copytext(new_skin, 4, 6)) var/b_skin = hex2num(copytext(new_skin, 6, 8)) @@ -56,7 +56,7 @@ if(href_list["hair_color"]) if(can_change(APPEARANCE_HAIR_COLOR)) var/new_hair = input("Please select hair color.", "Hair Color", rgb(owner.r_hair, owner.g_hair, owner.b_hair)) as color|null - if(new_hair && can_still_topic()) + if(new_hair && can_still_topic(state)) var/r_hair = hex2num(copytext(new_hair, 2, 4)) var/g_hair = hex2num(copytext(new_hair, 4, 6)) var/b_hair = hex2num(copytext(new_hair, 6, 8)) @@ -71,7 +71,7 @@ if(href_list["facial_hair_color"]) if(can_change(APPEARANCE_FACIAL_HAIR_COLOR)) var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(owner.r_facial, owner.g_facial, owner.b_facial)) as color|null - if(new_facial && can_still_topic()) + if(new_facial && can_still_topic(state)) var/r_facial = hex2num(copytext(new_facial, 2, 4)) var/g_facial = hex2num(copytext(new_facial, 4, 6)) var/b_facial = hex2num(copytext(new_facial, 6, 8)) @@ -81,7 +81,7 @@ if(href_list["eye_color"]) if(can_change(APPEARANCE_EYE_COLOR)) var/new_eyes = input("Please select eye color.", "Eye Color", rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes)) as color|null - if(new_eyes && can_still_topic()) + if(new_eyes && can_still_topic(state)) var/r_eyes = hex2num(copytext(new_eyes, 2, 4)) var/g_eyes = hex2num(copytext(new_eyes, 4, 6)) var/b_eyes = hex2num(copytext(new_eyes, 6, 8)) @@ -91,7 +91,7 @@ return 0 -/obj/nano_module/appearance_changer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/nano_module/appearance_changer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) generate_data(check_whitelist, whitelist, blacklist) var/data[0] @@ -128,7 +128,7 @@ data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src.name]", 800, 450) + ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src.name]", 800, 450, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index 4f81585a04..7cdd93b4dc 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -152,7 +152,7 @@ return 0 -/obj/nano_module/law_manager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/nano_module/law_manager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/data[0] owner.lawsync() @@ -189,7 +189,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_malf(user) ? 600 : 400) + ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner]"), 800, is_malf(user) ? 600 : 400, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/nano/modules/nano_module.dm b/code/modules/nano/modules/nano_module.dm index 3787639c9d..3fa8275099 100644 --- a/code/modules/nano/modules/nano_module.dm +++ b/code/modules/nano/modules/nano_module.dm @@ -1,2 +1,5 @@ -/obj/nano_module/proc/can_still_topic() - return CanUseTopic(usr, list(), default_state) == STATUS_INTERACTIVE +/obj/nano_module/nano_host() + return loc + +/obj/nano_module/proc/can_still_topic(var/datum/topic_state/state = default_state) + return CanUseTopic(usr, state) == STATUS_INTERACTIVE diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index 03d9263a80..ed7c64aa94 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -7,7 +7,7 @@ ..() refresh_sensors() -/obj/nano_module/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/nano_module/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) var/list/data = list() var/list/sensors = list() // Focus: If it remains null if no sensor is selected and UI will display sensor list, otherwise it will display sensor reading. @@ -28,14 +28,12 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 500) + ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 500, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) -// Proc: refresh_sensors() -// Parameters: None -// Description: Refreshes list of active sensors kept on this computer. +// Refreshes list of active sensors kept on this computer. /obj/nano_module/power_monitor/proc/refresh_sensors() grid_sensors = list() var/turf/T = get_turf(src) @@ -46,13 +44,13 @@ else grid_sensors += S -// Proc: Topic() -// Parameters: 2 (href, href_list - allows us to process UI clicks) -// Description: Allows us to process UI clicks, which are relayed in form of hrefs. +// Allows us to process UI clicks, which are relayed in form of hrefs. /obj/nano_module/power_monitor/Topic(href, href_list) if(..()) return if( href_list["clear"] ) active_sensor = null + if( href_list["refresh"] ) + refresh_sensors() else if( href_list["setsensor"] ) active_sensor = href_list["setsensor"] diff --git a/code/modules/nano/modules/rcon.dm b/code/modules/nano/modules/rcon.dm index abdae311d0..58e55894c1 100644 --- a/code/modules/nano/modules/rcon.dm +++ b/code/modules/nano/modules/rcon.dm @@ -8,7 +8,7 @@ var/hide_SMES_details = 0 var/hide_breakers = 0 -/obj/nano_module/rcon/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1) +/obj/nano_module/rcon/ui_interact(mob/user, ui_key = "rcon", datum/nanoui/ui=null, force_open=1, var/datum/topic_state/state = default_state) FindDevices() // Update our devices list var/data[0] @@ -41,7 +41,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "rcon.tmpl", "RCON Console", 600, 400) + ui = new(user, src, ui_key, "rcon.tmpl", "RCON Console", 600, 400, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index b029019f1a..bb283accf5 100644 --- a/code/modules/nano/nanoexternal.dm +++ b/code/modules/nano/nanoexternal.dm @@ -37,7 +37,7 @@ * * @return nothing */ -/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/custom_state = null) +/atom/movable/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/state = default_state) return // Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 2c86343515..ffc6208f39 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -55,7 +55,7 @@ nanoui is used to open and update nano browser uis // Relationship between a master interface and its children. Used in update_status var/datum/nanoui/master_ui var/list/datum/nanoui/children = list() - var/datum/topic_state/custom_state = null + var/datum/topic_state/state = null var/cached_data = null @@ -73,7 +73,7 @@ nanoui is used to open and update nano browser uis * * @return /nanoui new nanoui object */ -/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate_filename, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null, var/datum/nanoui/master_ui = null, var/datum/topic_state/custom_state = default_state) +/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate_filename, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null, var/datum/nanoui/master_ui = null, var/datum/topic_state/state = default_state) user = nuser src_object = nsrc_object ui_key = nui_key @@ -82,7 +82,7 @@ nanoui is used to open and update nano browser uis src.master_ui = master_ui if(master_ui) master_ui.children += src - src.custom_state = custom_state + src.state = state // add the passed template filename as the "main" template, this is required add_template("main", ntemplate_filename) @@ -142,8 +142,7 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) - var/atom/movable/host = src_object.nano_host() - var/new_status = host.CanUseTopic(user, list(), custom_state) + var/new_status = src_object.CanUseTopic(user, state) if(master_ui) new_status = min(new_status, master_ui.status) @@ -483,7 +482,7 @@ nanoui is used to open and update nano browser uis set_map_z_level(text2num(href_list["mapZLevel"])) map_update = 1 - if ((src_object && src_object.Topic(href, href_list, 0, custom_state)) || map_update) + if ((src_object && src_object.Topic(href, href_list, 0, state)) || map_update) nanomanager.update_uis(src_object) // update all UIs attached to src_object /** @@ -510,4 +509,4 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update(var/force_open = 0) - src_object.ui_interact(user, ui_key, src, force_open, master_ui, custom_state) + src_object.ui_interact(user, ui_key, src, force_open, master_ui, state) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 1eab38904c..6cd162b50a 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -288,7 +288,7 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) // Only a certain number of drips (or one large splatter) can be on a given turf. for(var/obj/effect/decal/cleanable/blood/drip/drop in T) drips |= drop.drips - del(drop) + qdel(drop) if(!large && drips.len < 3) decal_type = /obj/effect/decal/cleanable/blood/drip diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index f97df89080..06dd521f64 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -3,7 +3,7 @@ var/list/organ_cache = list() /obj/item/organ name = "organ" icon = 'icons/obj/surgery.dmi' - + var/dead_icon var/mob/living/carbon/human/owner = null var/status = 0 var/vital //Lose a vital limb, die immediately. @@ -50,11 +50,12 @@ var/list/organ_cache = list() holder.internal_organs |= src /obj/item/organ/proc/die() - name = "dead [initial(name)]" - health = 0 + if(status & ORGAN_ROBOT) + return + damage = max_damage processing_objects -= src - //TODO: Grey out the icon state. - //TODO: Inject an organ with peridaxon to make it alive again. + if(dead_icon) + icon_state = dead_icon /obj/item/organ/process() @@ -75,10 +76,10 @@ var/list/organ_cache = list() if(B && prob(40)) reagents.remove_reagent("blood",0.1) blood_splatter(src,B,1) - - health -= rand(1,3) - if(health <= 0) + damage += rand(1,3) + if(damage >= max_damage) die() + else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs //** Handle antibiotics and curing infections handle_antibiotics() @@ -145,7 +146,7 @@ var/list/organ_cache = list() return damage >= min_bruised_damage /obj/item/organ/proc/is_broken() - return (damage >= min_broken_damage || (status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))) + return (damage >= min_broken_damage || (status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN)) //Germs /obj/item/organ/proc/handle_antibiotics() @@ -179,9 +180,10 @@ var/list/organ_cache = list() else src.damage += amount - var/obj/item/organ/external/parent = owner.get_organ(parent_organ) - if (!silent) - owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1) + if(owner && parent_organ) + var/obj/item/organ/external/parent = owner.get_organ(parent_organ) + if(parent && !silent) + owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1) /obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc robotic = 2 @@ -241,7 +243,7 @@ var/list/organ_cache = list() var/obj/item/organ/external/affected = owner.get_organ(parent_organ) if(affected) affected.internal_organs -= src - loc = owner.loc + loc = get_turf(owner) processing_objects |= src rejecting = null var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list @@ -255,6 +257,8 @@ var/list/organ_cache = list() msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)") owner.death() + owner = null + /obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) if(!istype(target)) return @@ -271,13 +275,13 @@ var/list/organ_cache = list() transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"] owner = target + loc = owner processing_objects -= src target.internal_organs |= src affected.internal_organs |= src target.internal_organs_by_name[organ_tag] = src - status |= ORGAN_CUT_AWAY - - del(src) + if(robotic) + status |= ORGAN_ROBOT /obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target) @@ -286,7 +290,7 @@ var/list/organ_cache = list() target.r_eyes = eye_colour[1] target.g_eyes = eye_colour[2] target.b_eyes = eye_colour[3] - target.update_body() + target.update_eyes() ..() /obj/item/organ/proc/bitten(mob/user) @@ -298,7 +302,6 @@ var/list/organ_cache = list() var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list blood_splatter(src,B,1) - user.drop_from_inventory(src) var/obj/item/weapon/reagent_containers/food/snacks/organ/O = new(get_turf(src)) O.name = name @@ -312,7 +315,7 @@ var/list/organ_cache = list() if(fingerprintslast) O.fingerprintslast = fingerprintslast user.put_in_active_hand(O) - del(src) + qdel(src) /obj/item/organ/attack_self(mob/user as mob) diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index d326e2ade4..4e2610f584 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -5,12 +5,12 @@ //This is a terrible hack and I should be ashamed. var/datum/seed/diona = plant_controller.seeds["diona"] if(!diona) - del(src) + qdel(src) spawn(1) // So it has time to be thrown about by the gib() proc. var/mob/living/carbon/alien/diona/D = new(get_turf(organ)) diona.request_player(D) - del(organ) + qdel(organ) /obj/item/organ/external/diona name = "tendril" @@ -130,7 +130,7 @@ /obj/item/organ/external/diona/removed() ..() if(!istype(owner)) - del(src) + qdel(src) if(!owner.organs.len) owner.death() @@ -175,7 +175,7 @@ ..() if(!istype(owner)) - del(src) + qdel(src) if(!owner.internal_organs.len) owner.death() @@ -247,7 +247,7 @@ B.ckey = owner.ckey spawn(0) - del(src) + qdel(src) //XENOMORPH ORGANS /obj/item/organ/xenos/eggsac diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index d8ba25d750..4bf7b9c99e 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -96,9 +96,14 @@ dislocated = 0 if(children && children.len) for(var/obj/item/organ/external/child in children) - child.undislocate() + if(child.dislocated == 1) + child.undislocate() if(owner) owner.shock_stage += 20 + for(var/obj/item/organ/external/limb in owner.organs) + if(limb.dislocated == 2) + return + owner.verbs -= /mob/living/carbon/human/proc/undislocate /obj/item/organ/external/update_health() damage = min(max_damage, (brute_dam + burn_dam)) @@ -110,6 +115,8 @@ if(owner) replaced(owner) sync_colour_to_human(owner) + spawn(1) + get_icon() /obj/item/organ/external/replaced(var/mob/living/carbon/human/target) owner = target @@ -203,25 +210,29 @@ // sync the organ's damage with its wounds src.update_damages() + owner.updatehealth() //droplimb will call updatehealth() again if it does end up being called //If limb took enough damage, try to cut or tear it off if(owner && loc == owner) if(!cannot_amputate && config.limbs_can_break && (brute_dam + burn_dam) >= (max_damage * config.organ_health_multiplier)) - var/threshold = max_damage/3 + var/threshold = max_damage var/dropped if((burn >= threshold) && prob(burn/3)) dropped = 1 droplimb(0,DROPLIMB_BURN) if(!dropped && prob(brute)) - if(brute >= threshold) - if((sharp || edge) && istype(used_weapon,/obj/item)) - var/obj/item/W = used_weapon - if(W.w_class >= 3) - droplimb(0,DROPLIMB_EDGE) + var/edge_eligible = 0 + if(edge && istype(used_weapon,/obj/item)) + var/obj/item/W = used_weapon + if(W.w_class >= 3) + edge_eligible = 1 + + if(brute >= threshold || (edge_eligible && brute >= threshold/3)) + if((sharp || edge)) + droplimb(0,DROPLIMB_EDGE) else droplimb(0,DROPLIMB_BLUNT) - owner.updatehealth() return update_icon() /obj/item/organ/external/proc/heal_damage(brute, burn, internal = 0, robo_repair = 0) @@ -243,10 +254,10 @@ status &= ~ORGAN_BROKEN perma_injury = 0 - if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS)) + /*if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS)) var/obj/item/organ/external/stump/S = locate() in children if(S) - world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb." + world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb."*/ //Sync the organ's damage with its wounds src.update_damages() @@ -333,8 +344,12 @@ This function completely restores a damaged organ to perfect condition. PROCESSING & UPDATING ****************************************************/ -//Determines if we even need to process this organ. +//external organs handle brokenness a bit differently when it comes to damage. Instead brute_dam is checked inside process() +//this also ensures that an external organ cannot be "broken" without broken_description being set. +/obj/item/organ/external/is_broken() + return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))) +//Determines if we even need to process this organ. /obj/item/organ/external/proc/need_process() if(status && status != ORGAN_ROBOT) // If it's robotic, that's fine it will have a status. return 1 @@ -634,8 +649,9 @@ Note that amputating the affected organ does in fact remove the infection from t "Your [src.name] explodes in a shower of gore!",\ "You hear the sickening splatter of gore.") - src.removed(null, ignore_children) - owner.traumatic_shock += 60 + var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed(). + removed(null, ignore_children) + victim.traumatic_shock += 60 wounds.Cut() if(parent) @@ -649,22 +665,22 @@ Note that amputating the affected organ does in fact remove the infection from t parent.wounds |= W parent.update_damages() else - var/obj/item/organ/external/stump/stump = new (owner, 0, src) + var/obj/item/organ/external/stump/stump = new (victim, 0, src) stump.wounds |= W - owner.organs |= stump + victim.organs |= stump stump.update_damages() parent = null spawn(1) - owner.update_body() - owner.updatehealth() - owner.UpdateDamageIcon() + victim.updatehealth() + victim.UpdateDamageIcon() + victim.regenerate_icons() dir = 2 switch(disintegrate) if(DROPLIMB_EDGE) compile_icon() - add_blood(owner) + add_blood(victim) var/matrix/M = matrix() M.Turn(rand(180)) src.transform = M @@ -673,15 +689,15 @@ Note that amputating the affected organ does in fact remove the infection from t if(src && istype(loc,/turf)) throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) dir = 2 - return if(DROPLIMB_BURN) - new /obj/effect/decal/cleanable/ash(get_turf(owner)) + new /obj/effect/decal/cleanable/ash(get_turf(victim)) + qdel(src) if(DROPLIMB_BLUNT) - var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(owner)) - if(owner.species.flesh_color) - gore.fleshcolor = owner.species.flesh_color - if(owner.species.blood_color) - gore.basecolor = owner.species.blood_color + var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(victim)) + if(victim.species.flesh_color) + gore.fleshcolor = victim.species.flesh_color + if(victim.species.blood_color) + gore.basecolor = victim.species.blood_color gore.update_icon() gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) @@ -689,8 +705,7 @@ Note that amputating the affected organ does in fact remove the infection from t I.removed() if(istype(loc,/turf)) I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) - - del(src) + qdel(src) /**************************************************** HELPERS @@ -699,25 +714,21 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/is_stump() return 0 -/obj/item/organ/external/replaced() - get_icon() - icon = mob_icon - return ..() - -/obj/item/organ/external/proc/release_restraints() - if (owner.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT)) - owner.visible_message(\ - "\The [owner.handcuffed.name] falls off of [owner.name].",\ - "\The [owner.handcuffed.name] falls off you.") - - owner.drop_from_inventory(owner.handcuffed) - - if (owner.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT)) - owner.visible_message(\ - "\The [owner.legcuffed.name] falls off of [owner.name].",\ - "\The [owner.legcuffed.name] falls off you.") - - owner.drop_from_inventory(owner.legcuffed) +/obj/item/organ/external/proc/release_restraints(var/mob/living/carbon/human/holder) + if(!holder) + holder = owner + if(!holder) + return + if (holder.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT)) + holder.visible_message(\ + "\The [holder.handcuffed.name] falls off of [holder.name].",\ + "\The [holder.handcuffed.name] falls off you.") + holder.drop_from_inventory(holder.handcuffed) + if (holder.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT)) + holder.visible_message(\ + "\The [holder.legcuffed.name] falls off of [holder.name].",\ + "\The [holder.legcuffed.name] falls off you.") + holder.drop_from_inventory(holder.legcuffed) /obj/item/organ/external/proc/bandage() var/rval = 0 @@ -813,7 +824,7 @@ Note that amputating the affected organ does in fact remove the infection from t name = "[R.company] [initial(name)]" desc = "[R.desc]" - dislocated = -1 + dislocated = -1 //TODO, make robotic limbs a separate type, remove snowflake cannot_break = 1 get_icon() for (var/obj/item/organ/external/T in children) @@ -838,7 +849,7 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 /obj/item/organ/external/proc/is_usable() - return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) + return !is_dislocated() && !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/external/proc/is_malfunctioning() return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) @@ -859,14 +870,18 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/removed(var/mob/living/user, var/ignore_children) + if(!owner) + return var/is_robotic = status & ORGAN_ROBOT + var/mob/living/carbon/human/victim = owner + ..() status |= ORGAN_DESTROYED - owner.bad_external_organs -= src + victim.bad_external_organs -= src for(var/implant in implants) //todo: check if this can be left alone - del(implant) + qdel(implant) // Attached organs also fly off. if(!ignore_children) @@ -880,24 +895,24 @@ Note that amputating the affected organ does in fact remove the infection from t organ.removed() organ.loc = src - release_restraints() - owner.organs -= src - owner.organs_by_name[limb_name] = null // Remove from owner's vars. + release_restraints(victim) + victim.organs -= src + victim.organs_by_name[limb_name] = null // Remove from owner's vars. //Robotic limbs explode if sabotaged. if(is_robotic && sabotaged) - owner.visible_message( - "\The [owner]'s [src.name] explodes violently!",\ + victim.visible_message( + "\The [victim]'s [src.name] explodes violently!",\ "Your [src.name] explodes!",\ "You hear an explosion!") explosion(get_turf(owner),-1,-1,2,3) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, owner) + spark_system.set_up(5, 0, victim) spark_system.attach(owner) spark_system.start() spawn(10) - del(spark_system) - del(src) + qdel(spark_system) + qdel(src) /obj/item/organ/external/proc/disfigure(var/type = "brute") if (disfigured) diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index b0e23df3d2..d05a269f28 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -5,13 +5,12 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/compile_icon() overlays.Cut() - get_icon() // This is a kludge, only one icon has more than one generation of children though. for(var/obj/item/organ/external/organ in contents) if(organ.children && organ.children.len) for(var/obj/item/organ/external/child in organ.children) - overlays += child.get_icon() - overlays += organ.get_icon() + overlays += child.mob_icon + overlays += organ.mob_icon /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) s_tone = null @@ -23,6 +22,49 @@ var/global/list/limb_icon_cache = list() if(human.species.flags & HAS_SKIN_COLOR) s_col = list(human.r_skin, human.g_skin, human.b_skin) +/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) + ..() + var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] + if(eyes) eyes.update_colour() + +/obj/item/organ/external/head/removed() + get_icon() + ..() + +/obj/item/organ/external/head/get_icon() + + ..() + if(owner.species.has_organ["eyes"]) + var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] + if(owner.species.eyes) + var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes) + if(eyes) + eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + else + eyes_icon.Blend(rgb(128,0,0), ICON_ADD) + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + + if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS))) + mob_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s"), ICON_OVERLAY) + + if(owner.f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] + if(facial_hair_style && facial_hair_style.species_allowed && (owner.species.name in facial_hair_style.species_allowed)) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) + overlays |= facial_s + + if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) + var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] + if(hair_style && (owner.species.name in hair_style.species_allowed)) + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration) + hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD) + overlays |= hair_s + + return mob_icon + /obj/item/organ/external/proc/get_icon(var/skeletal) var/gender @@ -66,43 +108,6 @@ var/global/list/limb_icon_cache = list() return mob_icon -/obj/item/organ/external/head/get_icon(var/skeletal) - - if(skeletal || !owner) - return - - ..() - - if(owner.species.has_organ["eyes"]) - var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] - if(eyes && owner.species.eyes) - var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) - mob_icon.Blend(eyes_icon, ICON_OVERLAY) - - if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS))) - mob_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s"), ICON_OVERLAY) - - if(owner.f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] - if(facial_hair_style) - var/icon/facial = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) - facial.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) - mob_icon.Blend(facial, ICON_OVERLAY) - - if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] - if(hair_style) - var/icon/hair = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) - hair.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD) - - mob_icon.Blend(hair, ICON_OVERLAY) - - icon = mob_icon - return mob_icon - // new damage icon system // adjusted to set damage_state to brute/burn code only (without r_name0 as before) /obj/item/organ/external/update_icon() diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 46e22e1e5f..f7875a1e25 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -11,6 +11,7 @@ icon_state = "heart-on" organ_tag = "heart" parent_organ = "chest" + dead_icon = "heart-off" /obj/item/organ/lungs name = "lungs" @@ -69,6 +70,15 @@ parent_organ = "head" var/list/eye_colour = list(0,0,0) +/obj/item/organ/eyes/proc/update_colour() + if(!owner) + return + eye_colour = list( + owner.r_eyes ? owner.r_eyes : 0, + owner.g_eyes ? owner.g_eyes : 0, + owner.b_eyes ? owner.b_eyes : 0 + ) + /obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var. ..() if(!owner) @@ -78,36 +88,6 @@ if(is_broken()) owner.eye_blind = 20 -/obj/item/organ/eyes/New() - ..() - if(owner) - eye_colour = list( - owner.r_eyes ? owner.r_eyes : 0, - owner.g_eyes ? owner.g_eyes : 0, - owner.b_eyes ? owner.b_eyes : 0 - ) - -/obj/item/organ/eyes/removed(var/mob/living/target,var/mob/living/user) - - if(!eye_colour) - eye_colour = list(0,0,0) - - ..() //Make sure target is set so we can steal their eye colour for later. - var/mob/living/carbon/human/H = target - if(istype(H)) - eye_colour = list( - H.r_eyes ? H.r_eyes : 0, - H.g_eyes ? H.g_eyes : 0, - H.b_eyes ? H.b_eyes : 0 - ) - - // Leave bloody red pits behind! - H.r_eyes = 128 - H.g_eyes = 0 - H.b_eyes = 0 - H.update_body() - - /obj/item/organ/liver name = "liver" icon_state = "liver" @@ -178,14 +158,13 @@ /obj/item/organ/appendix/removed() - ..() - - var/inflamed = 0 - for(var/datum/disease/appendicitis/appendicitis in owner.viruses) - inflamed = 1 - appendicitis.cure() - owner.resistances += appendicitis - - if(inflamed) - icon_state = "appendixinflamed" - name = "inflamed appendix" \ No newline at end of file + if(owner) + var/inflamed = 0 + for(var/datum/disease/appendicitis/appendicitis in owner.viruses) + inflamed = 1 + appendicitis.cure() + owner.resistances += appendicitis + if(inflamed) + icon_state = "appendixinflamed" + name = "inflamed appendix" + ..() \ No newline at end of file diff --git a/code/modules/organs/organ_stump.dm b/code/modules/organs/organ_stump.dm index c08363e10b..728f9cd1bc 100644 --- a/code/modules/organs/organ_stump.dm +++ b/code/modules/organs/organ_stump.dm @@ -21,4 +21,4 @@ /obj/item/organ/external/stump/removed() ..() - del(src) + qdel(src) diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index 9d4a5364ae..1d34ed7284 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -209,9 +209,9 @@ /** WOUND DEFINITIONS **/ -//Note that the MINIMUM damage before a wound can be applied should correspond to +//Note that the MINIMUM damage before a wound can be applied should correspond to //the damage amount for the stage with the same name as the wound. -//e.g. /datum/wound/cut/deep should only be applied for 15 damage and up, +//e.g. /datum/wound/cut/deep should only be applied for 15 damage and up, //because in it's stages list, "deep cut" = 15. /proc/get_wound_type(var/type = CUT, var/damage) switch(type) @@ -323,4 +323,4 @@ datum/wound/cut/massive return 0 //cannot be merged /datum/wound/lost_limb/small - stages = list("ripped stump" = 40, "bloody stump" = 30, "clotted stump" = 15, "scarred stump" = 0) + stages = list("ripped hole" = 40, "bloody hole" = 30, "clotted hole" = 15, "scarred hole" = 0) diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index 7f0b8548c9..5309b05096 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -108,7 +108,7 @@ var/global/list/map_sectors = list() map_sectors["[map_z]"] = src testing("Temporary sector at [x],[y] was created, corresponding zlevel is [map_z].") -/obj/effect/map/sector/temporary/Del() +/obj/effect/map/sector/temporary/Destroy() map_sectors["[map_z]"] = null testing("Temporary sector at [x],[y] was deleted.") if (can_die()) diff --git a/code/modules/overmap/ships/engines/engine.dm b/code/modules/overmap/ships/engines/engine.dm index 80690aa84d..6e927e6431 100644 --- a/code/modules/overmap/ships/engines/engine.dm +++ b/code/modules/overmap/ships/engines/engine.dm @@ -57,4 +57,4 @@ var/list/ship_engines = list() if (E.z == zlevel) E.engines -= src break - del(src) \ No newline at end of file + qdel(src) \ No newline at end of file diff --git a/code/modules/overmap/ships/engines/thermal.dm b/code/modules/overmap/ships/engines/thermal.dm index 44a7dcb84f..b2f537bb96 100644 --- a/code/modules/overmap/ships/engines/thermal.dm +++ b/code/modules/overmap/ships/engines/thermal.dm @@ -57,7 +57,7 @@ ..() controller = new(src) -/obj/machinery/atmospherics/unary/engine/Del() +/obj/machinery/atmospherics/unary/engine/Destroy() ..() controller.die() diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 1dd7a17e46..9b8557363d 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -8,6 +8,7 @@ var/last_burn = 0 var/list/last_movement = list(0,0) var/fore_dir = NORTH + var/rotate = 1 //For proc rotate var/obj/effect/map/current_sector var/obj/machinery/computer/helm/nav_control @@ -70,7 +71,7 @@ /obj/effect/map/ship/proc/get_brake_path() if(!get_acceleration()) return INFINITY - return max(abs(speed[1]),abs(speed[2]))/get_acceleration() + return get_speed()/get_acceleration() #define SIGN(X) (X == 0 ? 0 : (X > 0 ? 1 : -1)) /obj/effect/map/ship/proc/decelerate() @@ -94,13 +95,21 @@ if(direction & SOUTH) adjust_speed(0, -get_acceleration()) + +/obj/effect/map/ship/proc/rotate(var/direction) + var/matrix/M = matrix() + M.Turn(dir2angle(direction)) + src.transform = M //Rotate ship + /obj/effect/map/ship/process() if(!is_still()) var/list/deltas = list(0,0) for(var/i=1, i<=2, i++) - if(speed[i] && world.time > last_movement[i] + default_delay - speed[i]) + if(speed[i] && world.time > last_movement[i] + default_delay - abs(speed[i])) deltas[i] = speed[i] > 0 ? 1 : -1 last_movement[i] = world.time var/turf/newloc = locate(x + deltas[1], y + deltas[2], z) if(newloc) - Move(newloc) \ No newline at end of file + Move(newloc) + if(rotate) + rotate(get_heading()) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 9598800312..2253e049a5 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -68,14 +68,14 @@ //The topmost paper. I don't think there's any way to organise contents in byond, so this is what we're stuck with. -Pete if(toppaper) var/obj/item/weapon/paper/P = toppaper - dat += "Write Remove - [P.name]

        " + dat += "Write Remove Rename - [P.name]

        " for(var/obj/item/weapon/paper/P in src) if(P==toppaper) continue - dat += "Remove - [P.name]
        " + dat += "Remove Rename - [P.name]
        " for(var/obj/item/weapon/photo/Ph in src) - dat += "Remove - [Ph.name]
        " + dat += "Remove Rename - [Ph.name]
        " user << browse(dat, "window=clipboard") onclose(user, "clipboard") @@ -129,6 +129,18 @@ toppaper = newtop else toppaper = null + + else if(href_list["rename"]) + var/obj/item/weapon/O = locate(href_list["rename"]) + + if(O && (O.loc == src)) + if(istype(O, /obj/item/weapon/paper)) + var/obj/item/weapon/paper/to_rename = O + to_rename.rename() + + else if(istype(O, /obj/item/weapon/photo)) + var/obj/item/weapon/photo/to_rename = O + to_rename.rename() else if(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"]) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 33d0bb31c6..7cd104870f 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -189,7 +189,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins else if (istype(copyitem, /obj/item/weapon/photo)) rcvdcopy = photocopy(copyitem) else if (istype(copyitem, /obj/item/weapon/paper_bundle)) - rcvdcopy = bundlecopy(copyitem) + rcvdcopy = bundlecopy(copyitem, 0) else visible_message("[src] beeps, \"Error transmitting message.\"") return diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index ddc211cc7c..c10b940c1e 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -44,11 +44,11 @@ var/dat = "[name]" for(var/obj/item/weapon/paper/P in src) - dat += "Remove - [P.name]
        " + dat += "Remove Rename - [P.name]
        " for(var/obj/item/weapon/photo/Ph in src) - dat += "Remove - [Ph.name]
        " + dat += "Remove Rename - [Ph.name]
        " for(var/obj/item/weapon/paper_bundle/Pb in src) - dat += "Remove - [Pb.name]
        " + dat += "Remove Rename - [Pb.name]
        " user << browse(dat, "window=folder") onclose(user, "folder") add_fingerprint(usr) @@ -85,7 +85,22 @@ if(P && (P.loc == src) && istype(P)) P.attack_self(usr) onclose(usr, "[P.name]") - + else if(href_list["rename"]) + var/obj/item/weapon/O = locate(href_list["rename"]) + + if(O && (O.loc == src)) + if(istype(O, /obj/item/weapon/paper)) + var/obj/item/weapon/paper/to_rename = O + to_rename.rename() + + else if(istype(O, /obj/item/weapon/photo)) + var/obj/item/weapon/photo/to_rename = O + to_rename.rename() + + else if(istype(O, /obj/item/weapon/paper_bundle)) + var/obj/item/weapon/paper_bundle/to_rename = O + to_rename.rename() + //Update everything attack_self(usr) update_icon() diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 5006af6cc3..ea5488152d 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -58,7 +58,7 @@ if(mode) user << "You turn on \the [src]." //Now let them chose the text. - var/str = copytext(reject_bad_text(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) + var/str = sanitizeSafe(input(user,"Label text?","Set label",""), MAX_NAME_LEN) if(!str || !length(str)) user << "Invalid text." return diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 758cd78f20..ef90f7aaff 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -22,6 +22,7 @@ var/info_links //A different version of the paper which includes html links at fields and EOF var/stamps //The (text for the) stamps on the paper. var/fields //Amount of user created fields + var/free_space = MAX_PAPER_MESSAGE_LEN var/list/stamped var/list/ico[0] //Icons and var/list/offset_x[0] //offsets stored for later @@ -51,6 +52,7 @@ spawn(2) update_icon() + update_space(info) updateinfolinks() return @@ -62,6 +64,12 @@ return icon_state = "paper" +/obj/item/weapon/paper/proc/update_space(var/new_text) + if(!new_text) + return + + free_space -= length(strip_html_properly(new_text)) + /obj/item/weapon/paper/examine(mob/user) ..() if(in_range(user, src) || istype(user, /mob/dead/observer)) @@ -87,11 +95,14 @@ usr << "You cut yourself on the paper." return var/n_name = sanitizeSafe(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text, MAX_NAME_LEN) - if((loc == usr && usr.stat == 0)) - name = "[(n_name ? text("[n_name]") : initial(name))]" - if(name != "paper") - desc = "This is a paper titled '" + name + "'." - add_fingerprint(usr) + + // We check loc one level up, so we can rename in clipboards and such. See also: /obj/item/weapon/photo/rename() + if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0 && n_name) + name = n_name + if(n_name != "paper") + desc = "This is a paper titled '" + name + "'." + + add_fingerprint(usr) return /obj/item/weapon/paper/attack_self(mob/living/user as mob) @@ -188,13 +199,14 @@ /obj/item/weapon/paper/proc/clearpaper() info = null stamps = null + free_space = MAX_PAPER_MESSAGE_LEN stamped = list() overlays.Cut() updateinfolinks() update_icon() /obj/item/weapon/paper/proc/get_signature(var/obj/item/weapon/pen/P, mob/user as mob) - if(P) + if(P && istype(P, /obj/item/weapon/pen)) return P.get_signature(user) return (user && user.real_name) ? user.real_name : "Anonymous" @@ -210,6 +222,8 @@ t = replacetext(t, "\[/i\]", "") t = replacetext(t, "\[u\]", "") t = replacetext(t, "\[/u\]", "") + t = replacetext(t, "\[time\]", "[worldtime2text()]") + t = replacetext(t, "\[date\]", "[worlddate2text()]") t = replacetext(t, "\[large\]", "") t = replacetext(t, "\[/large\]", "") t = replacetext(t, "\[sign\]", "[get_signature(P, user)]") @@ -310,7 +324,7 @@ user.drop_from_inventory(src) new /obj/effect/decal/cleanable/ash(src.loc) - del(src) + qdel(src) else user << "\red You must hold \the [P] steady to burn \the [src]." @@ -324,7 +338,16 @@ if(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 = sanitize(input("Enter what you want to write:", "Write", null, null) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) + + if(free_space <= 0) + usr << "There isn't enough space left on \the [src] to write anything." + return + + var/t = sanitize(input("Enter what you want to write:", "Write", null, null) as message, free_space, extra = 0) + + if(!t) + return + 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 if(!istype(i, /obj/item/weapon/pen)) @@ -347,16 +370,27 @@ message_admins("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].") return */ + + var last_fields_value = fields + //t = html_encode(t) t = replacetext(t, "\n", "
        ") t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html + + if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield() + usr << "Too many fields. Sorry, you can't do this." + fields = last_fields_value + return + if(id!="end") addtofield(text2num(id), t) // He wants to edit a field, let him. else info += t // Oh, he wants to edit to the end of the file, let him. updateinfolinks() + update_space(t) + usr << browse("[name][info_links][stamps]", "window=[name]") // Update the window update_icon() @@ -416,7 +450,9 @@ user << "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name]." src.loc = B P.loc = B - B.amount++ + + B.pages.Add(src) + B.pages.Add(P) B.update_icon() else if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon)) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index dfa5103ec2..28f535a2ff 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -11,66 +11,63 @@ layer = 4 pressure_resistance = 1 attack_verb = list("bapped") - var/amount = 0 //Amount of items clipped to the paper - var/page = 1 - var/screen = 0 + var/page = 1 // current page + var/list/pages = list() // Ordered list of pages as they are to be displayed. Can be different order than src.contents. /obj/item/weapon/paper_bundle/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() - var/obj/item/weapon/paper/P - if(istype(W, /obj/item/weapon/paper)) - P = W - if (istype(P, /obj/item/weapon/paper/carbon)) - var/obj/item/weapon/paper/carbon/C = P - if (!C.iscopy && !C.copied) - user << "Take off the carbon copy first." - add_fingerprint(user) - return - amount++ - if(screen == 2) - screen = 1 - user << "You add [(P.name == "paper") ? "the paper" : P.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." - user.drop_from_inventory(P) - P.loc = src - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - else if(istype(W, /obj/item/weapon/photo)) - amount++ - if(screen == 2) - screen = 1 - user << "You add [(W.name == "photo") ? "the photo" : W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." - user.drop_from_inventory(W) - W.loc = src + if (istype(W, /obj/item/weapon/paper/carbon)) + var/obj/item/weapon/paper/carbon/C = W + if (!C.iscopy && !C.copied) + user << "Take off the carbon copy first." + add_fingerprint(user) + return + // adding sheets + if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo)) + insert_sheet_at(user, pages.len+1, W) + + // burning else if(istype(W, /obj/item/weapon/flame)) burnpaper(W, user) + + // merging bundles else if(istype(W, /obj/item/weapon/paper_bundle)) user.drop_from_inventory(W) for(var/obj/O in W) O.loc = src O.add_fingerprint(usr) - src.amount++ - if(screen == 2) - screen = 1 + pages.Add(O) + user << "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." - del(W) + qdel(W) else if(istype(W, /obj/item/weapon/tape_roll)) return 0 if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/toy/crayon)) usr << browse("", "window=[name]") //Closes the dialog - P = src[page] + var/obj/P = pages[page] P.attackby(W, user) - update_icon() attack_self(usr) //Update the browsed page. add_fingerprint(usr) return +/obj/item/weapon/paper_bundle/proc/insert_sheet_at(mob/user, var/index, obj/item/weapon/sheet) + if(istype(sheet, /obj/item/weapon/paper)) + user << "You add [(sheet.name == "paper") ? "the paper" : sheet.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." + else if(istype(sheet, /obj/item/weapon/photo)) + user << "You add [(sheet.name == "photo") ? "the photo" : sheet.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." + + user.drop_from_inventory(sheet) + sheet.loc = src + + pages.Insert(index, sheet) + + if(index <= page) + page++ /obj/item/weapon/paper_bundle/proc/burnpaper(obj/item/weapon/flame/P, mob/user) var/class = "" @@ -91,7 +88,7 @@ user.drop_from_inventory(src) new /obj/effect/decal/cleanable/ash(src.loc) - del(src) + qdel(src) else user << "\red You must hold \the [P] steady to burn \the [src]." @@ -105,28 +102,32 @@ /obj/item/weapon/paper_bundle/proc/show_content(mob/user as mob) var/dat - var/obj/item/weapon/W = src[page] - switch(screen) - if(0) - dat+= "
        " - dat+= "" - dat+= "

        " - if(1) - dat+= "" - dat+= "" - dat+= "

        " - if(2) - dat+= "" - dat+= "

        " - dat+= "
        " - if(istype(src[page], /obj/item/weapon/paper)) + var/obj/item/weapon/W = pages[page] + + // first + if(page == 1) + dat+= "" + dat+= "" + dat+= "

        " + // last + else if(page == pages.len) + dat+= "" + dat+= "" + dat+= "

        " + // middle pages + else + dat+= "" + dat+= "" + dat+= "

        " + + if(istype(pages[page], /obj/item/weapon/paper)) var/obj/item/weapon/paper/P = W if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon))) dat+= "[P.name][stars(P.info)][P.stamps]" else dat+= "[P.name][P.info][P.stamps]" user << browse(dat, "window=[name]") - else if(istype(src[page], /obj/item/weapon/photo)) + else if(istype(pages[page], /obj/item/weapon/photo)) var/obj/item/weapon/photo/P = W user << browse_rsc(P.img, "tmp_photo.png") user << browse(dat + "[P.name]" \ @@ -145,55 +146,51 @@ ..() if((src in usr.contents) || (istype(src.loc, /obj/item/weapon/folder) && (src.loc in usr.contents))) usr.set_machine(src) + var/obj/item/weapon/in_hand = usr.get_active_hand() if(href_list["next_page"]) - if(page == amount) - screen = 2 - else if(page == 1) - screen = 1 - else if(page == amount+1) - return - page++ - playsound(src.loc, "pageturn", 50, 1) + if(in_hand && (istype(in_hand, /obj/item/weapon/paper) || istype(in_hand, /obj/item/weapon/photo))) + insert_sheet_at(usr, page+1, in_hand) + else if(page != pages.len) + page++ + playsound(src.loc, "pageturn", 50, 1) if(href_list["prev_page"]) - if(page == 1) - return - else if(page == 2) - screen = 0 - else if(page == amount+1) - screen = 1 - page-- - playsound(src.loc, "pageturn", 50, 1) + if(in_hand && (istype(in_hand, /obj/item/weapon/paper) || istype(in_hand, /obj/item/weapon/photo))) + insert_sheet_at(usr, page, in_hand) + else if(page > 1) + page-- + playsound(src.loc, "pageturn", 50, 1) if(href_list["remove"]) - var/obj/item/weapon/W = src[page] + var/obj/item/weapon/W = pages[page] usr.put_in_hands(W) + pages.Remove(pages[page]) + usr << "You remove the [W.name] from the bundle." - if(amount == 1) + + if(pages.len <= 1) var/obj/item/weapon/paper/P = src[1] usr.drop_from_inventory(src) usr.put_in_hands(P) - del(src) - else if(page == amount) - screen = 2 - else if(page == amount+1) - page-- - - amount-- + qdel(src) + + return + + if(page > pages.len) + page = pages.len + update_icon() else usr << "You need to hold it in hands!" if (istype(src.loc, /mob) ||istype(src.loc.loc, /mob)) - src.attack_self(src.loc) + src.attack_self(usr) updateUsrDialog() - - /obj/item/weapon/paper_bundle/verb/rename() set name = "Rename bundle" set category = "Object" set src in usr var/n_name = sanitizeSafe(input(usr, "What would you like to label the bundle?", "Bundle Labelling", null) as text, MAX_NAME_LEN) - if((loc == usr && usr.stat == 0)) + if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0) name = "[(n_name ? text("[n_name]") : "paper")]" add_fingerprint(usr) return @@ -210,12 +207,12 @@ O.layer = initial(O.layer) O.add_fingerprint(usr) usr.drop_from_inventory(src) - del(src) + qdel(src) return /obj/item/weapon/paper_bundle/update_icon() - var/obj/item/weapon/paper/P = src[1] + var/obj/item/weapon/paper/P = pages[1] icon_state = P.icon_state overlays = P.overlays underlays = 0 diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 7f0ed21c78..2ae10e1c35 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -56,7 +56,7 @@ sleep(15) else if (istype(copyitem, /obj/item/weapon/paper_bundle)) var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem) - sleep(15*B.amount) + sleep(15*B.pages.len) else usr << "\The [copyitem] can't be copied by \the [src]." break @@ -118,7 +118,7 @@ user << "You insert the toner cartridge into \the [src]." var/obj/item/device/toner/T = O toner += T.toner_amount - del(O) + qdel(O) updateUsrDialog() else user << "This cartridge is not yet ready for replacement! Use up the rest of the toner." @@ -131,10 +131,10 @@ /obj/machinery/photocopier/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) if(2.0) if(prob(50)) - del(src) + qdel(src) else if(toner > 0) new /obj/effect/decal/cleanable/blood/oil(get_turf(src)) @@ -148,7 +148,7 @@ /obj/machinery/photocopier/blob_act() if(prob(50)) - del(src) + qdel(src) else if(toner > 0) new /obj/effect/decal/cleanable/blood/oil(get_turf(src)) @@ -216,7 +216,7 @@ //If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner /obj/machinery/photocopier/proc/bundlecopy(var/obj/item/weapon/paper_bundle/bundle, var/need_toner=1) var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src) - for(var/obj/item/weapon/W in bundle) + for(var/obj/item/weapon/W in bundle.pages) if(toner <= 0 && need_toner) toner = 0 visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") @@ -227,8 +227,8 @@ else if(istype(W, /obj/item/weapon/photo)) W = photocopy(W) W.loc = p - p.amount++ - //p.amount-- + p.pages += W + p.loc = src.loc p.update_icon() p.icon_state = "paper_words" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 24a321ac87..2fb1f52137 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -159,7 +159,7 @@ var/global/photo_count = 0 return user << "You insert [I] into [src]." user.drop_item() - del(I) + qdel(I) pictures_left = pictures_max return ..() diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index f2767ca0e8..c200ff86cc 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -9,59 +9,48 @@ throw_speed = 7 throw_range = 15 matter = list("metal" = 60) - item_color = "cargo" pressure_resistance = 2 attack_verb = list("stamped") /obj/item/weapon/stamp/captain name = "captain's rubber stamp" icon_state = "stamp-cap" - item_color = "captain" /obj/item/weapon/stamp/hop name = "head of personnel's rubber stamp" icon_state = "stamp-hop" - item_color = "hop" /obj/item/weapon/stamp/hos name = "head of security's rubber stamp" icon_state = "stamp-hos" - item_color = "hosred" /obj/item/weapon/stamp/ce name = "chief engineer's rubber stamp" icon_state = "stamp-ce" - item_color = "chief" /obj/item/weapon/stamp/rd name = "research director's rubber stamp" icon_state = "stamp-rd" - item_color = "director" /obj/item/weapon/stamp/cmo name = "chief medical officer's rubber stamp" icon_state = "stamp-cmo" - item_color = "cmo" /obj/item/weapon/stamp/denied name = "\improper DENIED rubber stamp" icon_state = "stamp-deny" - item_color = "redcoat" /obj/item/weapon/stamp/clown name = "clown's rubber stamp" icon_state = "stamp-clown" - item_color = "clown" /obj/item/weapon/stamp/internalaffairs name = "internal affairs rubber stamp" icon_state = "stamp-intaff" - item_color = "intaff" /obj/item/weapon/stamp/centcomm name = "centcomm rubber stamp" icon_state = "stamp-cent" - item_color = "centcomm" // Syndicate stamp to forge documents. /obj/item/weapon/stamp/chameleon/attack_self(mob/user as mob) @@ -85,4 +74,3 @@ if(chosen_stamp) name = chosen_stamp.name icon_state = chosen_stamp.icon_state - item_color = chosen_stamp.item_color \ No newline at end of file diff --git a/code/modules/power/antimatter/containment_jar.dm b/code/modules/power/antimatter/containment_jar.dm index 8cb372b0c1..dd0e503bd4 100644 --- a/code/modules/power/antimatter/containment_jar.dm +++ b/code/modules/power/antimatter/containment_jar.dm @@ -20,13 +20,13 @@ if(1.0) explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess if(src) - del(src) + qdel(src) return if(2.0) if(prob((fuel/10)-stability)) explosion(get_turf(src), 1, 2, 3, 5) if(src) - del(src) + qdel(src) return stability -= 40 if(3.0) diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index b9f1075fa1..9fd35c2c26 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -35,16 +35,16 @@ linked_cores = list() -/obj/machinery/power/am_control_unit/Del()//Perhaps damage and run stability checks rather than just del on the others +/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just qdel on the others for(var/obj/machinery/am_shielding/AMS in linked_shielding) - del(AMS) + qdel(AMS) ..() /obj/machinery/power/am_control_unit/process() if(exploding) explosion(get_turf(src),8,12,18,12) - if(src) del(src) + if(src) qdel(src) if(update_shield_icons && !shield_icon_delay) check_shield_icons() @@ -108,7 +108,7 @@ AMS.blob_act() spawn(0) //Likely explode - del(src) + qdel(src) return check_stability() return @@ -211,7 +211,7 @@ /obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced if(stability <= 0) - del(src) + qdel(src) return diff --git a/code/modules/power/antimatter/engine.dm b/code/modules/power/antimatter/engine.dm index 77512fb5b0..a2d4a38ca0 100644 --- a/code/modules/power/antimatter/engine.dm +++ b/code/modules/power/antimatter/engine.dm @@ -47,7 +47,7 @@ user << "You insert the rod into the injector" injecting = 1 var/fuel = F.fuel - del(F) + qdel(F) spawn( 300 ) injecting = 0 new/obj/item/weapon/fuel(src.loc) @@ -60,7 +60,7 @@ user << "You insert the rod into the injector" injecting = 1 var/fuel = F.fuel - del(F) + qdel(F) spawn( 300 ) injecting = 0 new /obj/item/weapon/fuel(src.loc) diff --git a/code/modules/power/antimatter/fuel.dm b/code/modules/power/antimatter/fuel.dm index 3c0a32586d..56098a0b56 100644 --- a/code/modules/power/antimatter/fuel.dm +++ b/code/modules/power/antimatter/fuel.dm @@ -29,7 +29,7 @@ user << "You have added the anti-Hydrogen to the storage ring, it now contains [src.fuel]kg" if(istype(F, /obj/item/weapon/fuel/H)) src.fuel += F.fuel - del(F) + qdel(F) src:annihilation(src.fuel) if(istype(src, /obj/item/weapon/fuel/H)) if(istype(F, /obj/item/weapon/fuel/H)) @@ -38,7 +38,7 @@ user << "You have added the Hydrogen to the storage ring, it now contains [src.fuel]kg" if(istype(F, /obj/item/weapon/fuel/antiH)) src.fuel += F.fuel - del(src) + qdel(src) F:annihilation(F.fuel) /obj/item/weapon/fuel/antiH/proc/annihilation(var/mass) @@ -54,7 +54,7 @@ if (strength > (300+T0C)) explosion(T, 0, 0, 2, 3) - del(src) + qdel(src) return var/turf/ground_zero = get_turf(loc) @@ -63,7 +63,7 @@ explosion(ground_zero, ground_zero_range, ground_zero_range*2, ground_zero_range*3, ground_zero_range*4) //SN src = null - del(src) + qdel(src) return @@ -77,7 +77,7 @@ M.gib() if("Hydrogen") M << "\blue You feel very light, as if you might just float away..." - del(src) + qdel(src) return /obj/item/weapon/fuel/attack(mob/M as mob, mob/user as mob) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 5085fb6c85..281f6a1117 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -36,12 +36,12 @@ proc/cardinalrange(var/center) /obj/machinery/am_shielding/proc/controllerscan(var/priorscan = 0) //Make sure we are the only one here if(!istype(src.loc, /turf)) - del(src) + qdel(src) return for(var/obj/machinery/am_shielding/AMS in loc.contents) if(AMS == src) continue spawn(0) - del(src) + qdel(src) return //Search for shielding first @@ -61,11 +61,11 @@ proc/cardinalrange(var/center) controllerscan(1)//Last chance return spawn(0) - del(src) + qdel(src) return -/obj/machinery/am_shielding/Del() +/obj/machinery/am_shielding/Destroy() if(control_unit) control_unit.remove_shielding(src) if(processing) shutdown_core() visible_message("\red The [src.name] melts!") @@ -98,7 +98,7 @@ proc/cardinalrange(var/center) else new /obj/effect/blob(src.loc,60) spawn(0) - del(src) + qdel(src) return check_stability() return @@ -185,7 +185,7 @@ proc/cardinalrange(var/center) if(injecting_fuel && control_unit) control_unit.exploding = 1 if(src) - del(src) + qdel(src) return @@ -215,7 +215,7 @@ proc/cardinalrange(var/center) /obj/item/device/am_shielding_container/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) new/obj/machinery/am_shielding(src.loc) - del(src) + qdel(src) return ..() return \ No newline at end of file diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ede8d81129..a127c5ebc0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -96,7 +96,6 @@ var/update_overlay = -1 var/global/status_overlays = 0 var/updating_icon = 0 - var/standard_max_charge var/global/list/status_overlays_lock var/global/list/status_overlays_charging var/global/list/status_overlays_equipment @@ -139,9 +138,6 @@ /obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0) ..() wires = new(src) - var/tmp/obj/item/weapon/cell/tmp_cell = new - standard_max_charge = tmp_cell.maxcharge - del(tmp_cell) // offset 24 pixels in direction of dir // this allows the APC to be embedded in a wall, yet still inside an area @@ -165,14 +161,18 @@ spawn(5) src.update() -/obj/machinery/power/apc/Del() + +/obj/machinery/power/apc/Destroy() area.power_light = 0 area.power_equip = 0 area.power_environ = 0 area.power_change() - del(wires) + if(wires) + wires.Destroy() + wires = null if(cell) - del(cell) // qdel + cell.loc = loc + cell = null if(terminal) disconnect_terminal() @@ -559,7 +559,7 @@ return new /obj/item/stack/cable_coil(loc,10) user << "You cut the cables and dismantle the power terminal." - del(terminal) // qdel + qdel(terminal) else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN))) user.visible_message("[user.name] inserts the power control board into [src].", \ "You start to insert the power control board into the frame...") @@ -568,7 +568,7 @@ if(has_electronics==0) has_electronics = 1 user << "You place the power control board inside the frame." - del(W) // qdel + qdel(W) // qdel else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN))) user << "You cannot put the board inside, the frame is damaged." return @@ -595,7 +595,7 @@ "[src] has been cut from the wall by [user.name] with the weldingtool.",\ "You cut the APC frame from the wall.",\ "You hear welding.") - del(src) // qdel + qdel(src) return else if (istype(W, /obj/item/apc_frame) && opened && emagged) emagged = 0 @@ -604,7 +604,7 @@ user.visible_message(\ "[user.name] has replaced the damaged APC frontal panel with a new one.",\ "You replace the damaged APC frontal panel with a new one.") - del(W) // qdel + qdel(W) update_icon() else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || hacker)) if (has_electronics) @@ -616,7 +616,7 @@ user.visible_message(\ "[user.name] has replaced the damaged APC frame with new one.",\ "You replace the damaged APC frame with new one.") - del(W) // qdel + qdel(W) stat &= ~BROKEN hacker = null if (opened==2) @@ -1166,10 +1166,12 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on) equipment = 0 environ = 0 update() + update_icon() spawn(600) update_channels() update() + update_icon() ..() /obj/machinery/power/apc/ex_act(severity) @@ -1179,7 +1181,7 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on) //set_broken() //now Del() do what we need if (cell) cell.ex_act(1.0) // more lags woohoo - del(src) // qdel + qdel(src) return if(2.0) if (prob(50)) diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm index ad47a4eb28..ca5326e010 100644 --- a/code/modules/power/batteryrack.dm +++ b/code/modules/power/batteryrack.dm @@ -78,7 +78,7 @@ if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = src.loc - del(src) + qdel(src) return 1 else user << "Turn off the [src] before dismantling it." diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 869e654e6e..2faa50a4e6 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -117,7 +117,7 @@ else icon_state = icon_state_off for(var/obj/structure/cable/C in src.loc) - del(C) + qdel(C) // Used by RCON to toggle the breaker box. /obj/machinery/power/breakerbox/proc/auto_toggle() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index f652ebe9ec..abf5f0e199 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -85,7 +85,7 @@ By design, d1 is the smallest direction and d2 is the highest cable_list += src //add it to the global cable list -/obj/structure/cable/Del() // called when a cable is deleted +/obj/structure/cable/Destroy() // called when a cable is deleted if(powernet) cut_cable_from_powernet() // update the powernets cable_list -= src //remove it from global cable list @@ -154,11 +154,11 @@ By design, d1 is the smallest direction and d2 is the highest var/turf/below = locate(src.x, src.y, controller.down_target) for(var/obj/structure/cable/c in below) if(c.d1 == 12 || c.d2 == 12) - c.Del() + qdel(c) ///// Z-Level Stuff investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") - del(src) // qdel + qdel(src) return @@ -201,16 +201,16 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/ex_act(severity) switch(severity) if(1.0) - del(src) // qdel + qdel(src) if(2.0) if (prob(50)) new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color) - del(src) // qdel + qdel(src) if(3.0) if (prob(25)) new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color) - del(src) // qdel + qdel(src) return obj/structure/cable/proc/cableColor(var/colorC) @@ -418,7 +418,7 @@ obj/structure/cable/proc/cableColor(var/colorC) propagate_network(powerlist[1],PN) //propagates the new powernet beginning at the source cable if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables - del(PN) // qdel + qdel(PN) // cut the cable's powernet at this cable and updates the powergrid /obj/structure/cable/proc/cut_cable_from_powernet() @@ -470,7 +470,6 @@ obj/structure/cable/proc/cableColor(var/colorC) amount = MAXCOIL max_amount = MAXCOIL color = COLOR_RED - //item_color = COLOR_RED Use regular "color" var instead. No need to have it duplicate in two vars. Causes confusion. desc = "A coil of power cable." throwforce = 10 w_class = 2.0 @@ -770,7 +769,7 @@ obj/structure/cable/proc/cableColor(var/colorC) if (C.shock(user, 50)) if (prob(50)) //fail new/obj/item/stack/cable_coil(C.loc, 1, C.color) - del(C) // qdel + qdel(C) // called when cable_coil is click on an installed obj/cable // or click on a turf that already contains a "node" cable @@ -834,7 +833,7 @@ obj/structure/cable/proc/cableColor(var/colorC) if (NC.shock(user, 50)) if (prob(50)) //fail new/obj/item/stack/cable_coil(NC.loc, 1, NC.color) - del(NC) // qdel + qdel(NC) return @@ -882,7 +881,7 @@ obj/structure/cable/proc/cableColor(var/colorC) if (C.shock(user, 50)) if (prob(50)) //fail new/obj/item/stack/cable_coil(C.loc, 2, C.color) - del(C) // qdel + qdel(C) return C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. diff --git a/code/modules/power/cable.dm.orig b/code/modules/power/cable.dm.orig deleted file mode 100644 index 8a4d25ae20..0000000000 --- a/code/modules/power/cable.dm.orig +++ /dev/null @@ -1,934 +0,0 @@ -/////////////////////////////// -//CABLE STRUCTURE -/////////////////////////////// - - -//////////////////////////////// -// Definitions -//////////////////////////////// - -/* Cable directions (d1 and d2) - - - 9 1 5 - \ | / - 8 - 0 - 4 - / | \ - 10 2 6 - -If d1 = 0 and d2 = 0, there's no cable -If d1 = 0 and d2 = dir, it's a O-X cable, getting from the center of the tile to dir (knot cable) -If d1 = dir1 and d2 = dir2, it's a full X-X cable, getting from dir1 to dir2 -By design, d1 is the smallest direction and d2 is the highest -*/ - -/obj/structure/cable - level = 1 - anchored =1 - var/datum/powernet/powernet - name = "power cable" - desc = "A flexible superconducting cable for heavy-duty power transfer" - icon = 'icons/obj/power_cond_white.dmi' - icon_state = "0-1" - var/d1 = 0 - var/d2 = 1 - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 - color = COLOR_RED - var/obj/machinery/power/breakerbox/breaker_box - -/obj/structure/cable/drain_power(var/drain_check, var/surge, var/amount = 0) - - if(drain_check) - return 1 - - var/datum/powernet/PN = get_powernet() - if(!PN) return 0 - - return PN.draw_power(amount) - -/obj/structure/cable/yellow - color = COLOR_YELLOW - -/obj/structure/cable/green - color = COLOR_GREEN - -/obj/structure/cable/blue - color = COLOR_BLUE - -/obj/structure/cable/pink - color = COLOR_PINK - -/obj/structure/cable/orange - color = COLOR_ORANGE - -/obj/structure/cable/cyan - color = COLOR_CYAN - -/obj/structure/cable/white - color = COLOR_WHITE - -/obj/structure/cable/New() - ..() - - - // ensure d1 & d2 reflect the icon_state for entering and exiting cable - - var/dash = findtext(icon_state, "-") - - d1 = text2num( copytext( icon_state, 1, dash ) ) - - d2 = text2num( copytext( icon_state, dash+1 ) ) - - var/turf/T = src.loc // hide if turf is not intact - - if(level==1) hide(T.intact) - cable_list += src //add it to the global cable list - - -/obj/structure/cable/Del() // called when a cable is deleted - if(powernet) - cut_cable_from_powernet() // update the powernets - cable_list -= src //remove it from global cable list - ..() // then go ahead and delete the cable - -/////////////////////////////////// -// General procedures -/////////////////////////////////// - -//If underfloor, hide the cable -/obj/structure/cable/hide(var/i) - - if(level == 1 && istype(loc, /turf)) - invisibility = i ? 101 : 0 - updateicon() - -/obj/structure/cable/proc/updateicon() - icon_state = "[d1]-[d2]" - alpha = invisibility ? 127 : 255 - -// returns the powernet this cable belongs to -/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete - return powernet - -//Telekinesis has no effect on a cable -/obj/structure/cable/attack_tk(mob/user) - return - -// Items usable on a cable : -// - Wirecutters : cut it duh ! -// - Cable coil : merge cables -// - Multitool : get the power currently passing through the cable -// -/obj/structure/cable/attackby(obj/item/W, mob/user) - - var/turf/T = src.loc - if(T.intact) - return - - if(istype(W, /obj/item/weapon/wirecutters)) -///// Z-Level Stuff - if(src.d1 == 12 || src.d2 == 12) - user << "You must cut this cable from above." - return -///// Z-Level Stuff - if(breaker_box) - user << "\red This cable is connected to nearby breaker box. Use breaker box to interact with it." - return - - if (shock(user, 50)) - return - - if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long - new/obj/item/stack/cable_coil(T, 2, color) - else - new/obj/item/stack/cable_coil(T, 1, color) - - for(var/mob/O in viewers(src, null)) - O.show_message("[user] cuts the cable.", 1) - -///// Z-Level Stuff - if(src.d1 == 11 || src.d2 == 11) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - var/turf/below = locate(src.x, src.y, controller.down_target) - for(var/obj/structure/cable/c in below) - if(c.d1 == 12 || c.d2 == 12) - c.Del() -///// Z-Level Stuff - investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") - - del(src) // qdel - return - - - else if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = W - if (coil.get_amount() < 1) - user << "Not enough cable" - return - coil.cable_join(src, user) - - else if(istype(W, /obj/item/device/multitool)) - - if(powernet && (powernet.avail > 0)) // is it powered? - user << "[powernet.avail]W in power network." - - else - user << "The cable is not powered." - - shock(user, 5, 0.2) - - else - if (W.flags & CONDUCT) - shock(user, 50, 0.7) - - src.add_fingerprint(user) - -// shock the user with probability prb -/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) - if(!prob(prb)) - return 0 - if (electrocute_mob(user, powernet, src, siemens_coeff)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if(usr.stunned) - return 1 - return 0 - -//explosion handling -/obj/structure/cable/ex_act(severity) - switch(severity) - if(1.0) - del(src) // qdel - if(2.0) - if (prob(50)) - new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color) - del(src) // qdel - - if(3.0) - if (prob(25)) - new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color) - del(src) // qdel - return - -obj/structure/cable/proc/cableColor(var/colorC) - var/color_n = "#DD0000" - if(colorC) - color_n = colorC - color = color_n - -///////////////////////////////////////////////// -// Cable laying helpers -//////////////////////////////////////////////// - -//handles merging diagonally matching cables -//for info : direction^3 is flipping horizontally, direction^12 is flipping vertically -/obj/structure/cable/proc/mergeDiagonalsNetworks(var/direction) - - //search for and merge diagonally matching cables from the first direction component (north/south) - var/turf/T = get_step(src, direction&3)//go north/south - - for(var/obj/structure/cable/C in T) - - if(!C) - continue - - if(src == C) - continue - - if(C.d1 == (direction^3) || C.d2 == (direction^3)) //we've got a diagonally matching cable - if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables) - var/datum/powernet/newPN = new() - newPN.add_cable(C) - - if(powernet) //if we already have a powernet, then merge the two powernets - merge_powernets(powernet,C.powernet) - else - C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet - - //the same from the second direction component (east/west) - T = get_step(src, direction&12)//go east/west - - for(var/obj/structure/cable/C in T) - - if(!C) - continue - - if(src == C) - continue - if(C.d1 == (direction^12) || C.d2 == (direction^12)) //we've got a diagonally matching cable - if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables) - var/datum/powernet/newPN = new() - newPN.add_cable(C) - - if(powernet) //if we already have a powernet, then merge the two powernets - merge_powernets(powernet,C.powernet) - else - C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet - -// merge with the powernets of power objects in the given direction -/obj/structure/cable/proc/mergeConnectedNetworks(var/direction) - - var/fdir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf - - if(!(d1 == direction || d2 == direction)) //if the cable is not pointed in this direction, do nothing - return - - var/turf/TB = get_step(src, direction) - - for(var/obj/structure/cable/C in TB) - - if(!C) - continue - - if(src == C) - continue - - if(C.d1 == fdir || C.d2 == fdir) //we've got a matching cable in the neighbor turf - if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables) - var/datum/powernet/newPN = new() - newPN.add_cable(C) - - if(powernet) //if we already have a powernet, then merge the two powernets - merge_powernets(powernet,C.powernet) - else - C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet - -// merge with the powernets of power objects in the source turf -/obj/structure/cable/proc/mergeConnectedNetworksOnTurf() - var/list/to_connect = list() - - if(!powernet) //if we somehow have no powernet, make one (should not happen for cables) - var/datum/powernet/newPN = new() - newPN.add_cable(src) - - //first let's add turf cables to our powernet - //then we'll connect machines on turf with a node cable is present - for(var/AM in loc) - if(istype(AM,/obj/structure/cable)) - var/obj/structure/cable/C = AM - if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction - if(C.powernet == powernet) continue - if(C.powernet) - merge_powernets(powernet, C.powernet) - else - powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet - - else if(istype(AM,/obj/machinery/power/apc)) - var/obj/machinery/power/apc/N = AM - if(!N.terminal) continue // APC are connected through their terminal - - if(N.terminal.powernet == powernet) - continue - - to_connect += N.terminal //we'll connect the machines after all cables are merged - - else if(istype(AM,/obj/machinery/power)) //other power machines - var/obj/machinery/power/M = AM - - if(M.powernet == powernet) - continue - - to_connect += M //we'll connect the machines after all cables are merged - - //now that cables are done, let's connect found machines - for(var/obj/machinery/power/PM in to_connect) - if(!PM.connect_to_network()) - PM.disconnect_from_network() //if we somehow can't connect the machine to the new powernet, remove it from the old nonetheless - -////////////////////////////////////////////// -// Powernets handling helpers -////////////////////////////////////////////// - -//if powernetless_only = 1, will only get connections without powernet -/obj/structure/cable/proc/get_connections(var/powernetless_only = 0) - . = list() // this will be a list of all connected power objects - var/turf/T - -///// Z-Level Stuff - if (d1 == 11 || d1 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d1 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d1 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) -///// Z-Level Stuff - //get matching cables from the first direction - else if(d1) //if not a node cable - T = get_step(src, d1) - if(T) - . += power_list(T, src, turn(d1, 180), powernetless_only) //get adjacents matching cables - - if(d1&(d1-1)) //diagonal direction, must check the 4 possibles adjacents tiles - T = get_step(src,d1&3) // go north/south - if(T) - . += power_list(T, src, d1 ^ 3, powernetless_only) //get diagonally matching cables - T = get_step(src,d1&12) // go east/west - if(T) - . += power_list(T, src, d1 ^ 12, powernetless_only) //get diagonally matching cables - - . += power_list(loc, src, d1, powernetless_only) //get on turf matching cables - -///// Z-Level Stuff - if(d2 == 11 || d2 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && d2 == 12) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && d2 == 11) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) -///// Z-Level Stuff - else - //do the same on the second direction (which can't be 0) - T = get_step(src, d2) - if(T) - . += power_list(T, src, turn(d2, 180), powernetless_only) //get adjacents matching cables - - if(d2&(d2-1)) //diagonal direction, must check the 4 possibles adjacents tiles - T = get_step(src,d2&3) // go north/south - if(T) - . += power_list(T, src, d2 ^ 3, powernetless_only) //get diagonally matching cables - T = get_step(src,d2&12) // go east/west - if(T) - . += power_list(T, src, d2 ^ 12, powernetless_only) //get diagonally matching cables - . += power_list(loc, src, d2, powernetless_only) //get on turf matching cables - - return . - -//should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf. -//needed as this can, unlike other placements, disconnect cables -/obj/structure/cable/proc/denode() - var/turf/T1 = loc - if(!T1) return - - var/list/powerlist = power_list(T1,src,0,0) //find the other cables that ended in the centre of the turf, with or without a powernet - if(powerlist.len>0) - var/datum/powernet/PN = new() - propagate_network(powerlist[1],PN) //propagates the new powernet beginning at the source cable - - if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables - del(PN) // qdel - -// cut the cable's powernet at this cable and updates the powergrid -/obj/structure/cable/proc/cut_cable_from_powernet() - var/turf/T1 = loc - var/list/P_list - if(!T1) return - if(d1) - T1 = get_step(T1, d1) - P_list = power_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable... - - P_list += power_list(loc, src, d1, 0, cable_only = 1)//... and on turf - - - if(P_list.len == 0)//if nothing in both list, then the cable was a lone cable, just delete it and its powernet - powernet.remove_cable(src) - - for(var/obj/machinery/power/P in T1)//check if it was powering a machine - if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to - P.disconnect_from_network() //remove from current network (and delete powernet) - return - - // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist - loc = null - powernet.remove_cable(src) //remove the cut cable from its powernet - - var/datum/powernet/newPN = new()// creates a new powernet... - propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable - - // Disconnect machines connected to nodes - if(d1 == 0) // if we cut a node (O-X) cable - for(var/obj/machinery/power/P in T1) - if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to - P.disconnect_from_network() //remove from current network - -/////////////////////////////////////////////// -// The cable coil object, used for laying cable -/////////////////////////////////////////////// - -//////////////////////////////// -// Definitions -//////////////////////////////// - -#define MAXCOIL 30 - -/obj/item/stack/cable_coil - name = "cable coil" - icon = 'icons/obj/power.dmi' - icon_state = "coil" - amount = MAXCOIL - max_amount = MAXCOIL - color = COLOR_RED - //item_color = COLOR_RED Use regular "color" var instead. No need to have it duplicate in two vars. Causes confusion. - desc = "A coil of power cable." - throwforce = 10 - w_class = 2.0 - throw_speed = 2 - throw_range = 5 - matter = list("metal" = 50, "glass" = 20) - flags = CONDUCT - slot_flags = SLOT_BELT - item_state = "coil" - attack_verb = list("whipped", "lashed", "disciplined", "flogged") - -/obj/item/stack/cable_coil/cyborg - name = "cable coil synthesizer" - desc = "A device that makes cable." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(1) - stacktype = /obj/item/stack/cable_coil - -/obj/item/stack/cable_coil/suicide_act(mob/user) - if(locate(/obj/item/weapon/stool) in user.loc) - user.visible_message("[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide.") - else - user.visible_message("[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") - return(OXYLOSS) - -/obj/item/stack/cable_coil/New(loc, length = MAXCOIL, var/param_color = null) - ..() - src.amount = length - if (param_color) // It should be red by default, so only recolor it if parameter was specified. - color = param_color - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) - update_icon() - update_wclass() - -/////////////////////////////////// -// General procedures -/////////////////////////////////// - -//you can use wires to heal robotics -/obj/item/stack/cable_coil/attack(mob/M as mob, mob/user as mob) - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M -<<<<<<< HEAD - var/datum/organ/external/S = H.get_organ(user.zone_sel.selecting) - if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP) -======= - var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting) - if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help") ->>>>>>> d77010221cbd08f6373edebee25d727b6409413b - return ..() - - if(H.species.flags & IS_SYNTHETIC) - if(M == user) - user << "\red You can't repair damage to your own body - it's against OH&S." - return - - if(S.burn_dam > 0 && use(1)) - S.heal_damage(0,15,0,1) - user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") - return - else - user << "Nothing to fix!" - - else - return ..() - - -/obj/item/stack/cable_coil/update_icon() - if (!color) - color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) - if(amount == 1) - icon_state = "coil1" - name = "cable piece" - else if(amount == 2) - icon_state = "coil2" - name = "cable piece" - else - icon_state = "coil" - name = "cable coil" - -/obj/item/stack/cable_coil/proc/update_wclass() - if(amount == 1) - w_class = 1.0 - else - w_class = 2.0 - -/obj/item/stack/cable_coil/examine(mob/user) - if(get_dist(src, user) > 1) - return - - if(get_amount() == 1) - user << "A short piece of power cable." - else if(get_amount() == 2) - user << "A piece of power cable." - else - user << "A coil of power cable. There are [get_amount()] lengths of cable in the coil." - - -/obj/item/stack/cable_coil/verb/make_restraint() - set name = "Make Cable Restraints" - set category = "Object" - var/mob/M = usr - - if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) - if(!istype(usr.loc,/turf)) return - if(src.amount <= 14) - usr << "\red You need at least 15 lengths to make restraints!" - return - var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc) - B.color = color - usr << "You wind some cable together to make some restraints." - src.use(15) - else - usr << "\blue You cannot do that." - ..() - -/obj/item/stack/cable_coil/cyborg/verb/set_colour() - set name = "Change Colour" - set category = "Object" - - var/list/possible_colours = list ("Yellow", "Green", "Pink", "Blue", "Orange", "Cyan", "Red") - var/selected_type = input("Pick new colour.", "Cable Colour", null, null) as null|anything in possible_colours - - if(selected_type) - switch(selected_type) - if("Yellow") - color = COLOR_YELLOW - if("Green") - color = COLOR_GREEN - if("Pink") - color = COLOR_PINK - if("Blue") - color = COLOR_BLUE - if("Orange") - color = COLOR_ORANGE - if("Cyan") - color = COLOR_CYAN - else - color = COLOR_RED - usr << "You change your cable coil's colour to [selected_type]" - -// Items usable on a cable coil : -// - Wirecutters : cut them duh ! -// - Cable coil : merge cables -/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user) - ..() - if( istype(W, /obj/item/weapon/wirecutters) && src.get_amount() > 1) - src.use(1) - new/obj/item/stack/cable_coil(user.loc, 1,color) - user << "You cut a piece off the cable coil." - src.update_icon() - return - else if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if(C.get_amount() >= get_max_amount()) - user << "The coil is too long, you cannot add any more cable to it." - return - - if( (C.get_amount() + src.get_amount() <= get_max_amount()) ) - user << "You join the cable coils together." - C.give(src.get_amount()) // give it cable - src.use(src.get_amount()) // make sure this one cleans up right - return - - else - var/amt = get_max_amount() - C.get_amount() - user << "You transfer [amt] length\s of cable from one coil to the other." - C.give(amt) - src.use(amt) - return - -//remove cables from the stack -/* This is probably reduntant -/obj/item/stack/cable_coil/use(var/used) - if(src.amount < used) - return 0 - else if (src.amount == used) - if(ismob(loc)) //handle mob icon update - var/mob/M = loc - M.unEquip(src) - qdel(src) - return 1 - else - amount -= used - update_icon() - return 1 -*/ -/obj/item/stack/cable_coil/use(var/used) - . = ..() - update_icon() - return - -//add cables to the stack -/obj/item/stack/cable_coil/proc/give(var/extra) - if(amount + extra > MAXCOIL) - amount = MAXCOIL - else - amount += extra - update_icon() - -/////////////////////////////////////////////// -// Cable laying procedures -////////////////////////////////////////////// - -// called when cable_coil is clicked on a turf/simulated/floor -/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user) - if(!isturf(user.loc)) - return - - if(get_amount() < 1) // Out of cable - user << "There is no cable left." - return - - if(get_dist(F,user) > 1) // Too far - user << "You can't lay cable at a place that far away." - return - - if(F.intact) // Ff floor is intact, complain - user << "You can't lay cable there unless the floor tiles are removed." - return - - else - var/dirn - - if(user.loc == F) - dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing - else - dirn = get_dir(F, user) - - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) - user << "There's already a cable at that position." - return -///// Z-Level Stuff - // check if the target is open space - if(istype(F, /turf/simulated/floor/open)) - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 11 ) || ( LC.d2 == dirn && LC.d1 == 11)) - user << "There's already a cable at that position." - return - - var/turf/simulated/floor/open/temp = F - var/obj/structure/cable/C = new(F) - var/obj/structure/cable/D = new(temp.floorbelow) - - C.cableColor(color) - - C.d1 = 11 - C.d2 = dirn - C.add_fingerprint(user) - C.updateicon() - - var/datum/powernet/PN = new() - PN.add_cable(C) - - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() - - D.cableColor(color) - - D.d1 = 12 - D.d2 = 0 - D.add_fingerprint(user) - D.updateicon() - - PN.add_cable(D) - D.mergeConnectedNetworksOnTurf() - - // do the normal stuff - else -///// Z-Level Stuff - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) - user << "There's already a cable at that position." - return - - var/obj/structure/cable/C = new(F) - - C.cableColor(color) - - //set up the new cable - C.d1 = 0 //it's a O-X node cable - C.d2 = dirn - C.add_fingerprint(user) - C.updateicon() - - //create a new powernet with the cable, if needed it will be merged later - var/datum/powernet/PN = new() - PN.add_cable(C) - - C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets - C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets - - if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions - C.mergeDiagonalsNetworks(C.d2) - - - use(1) - if (C.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(C.loc, 1, C.color) - del(C) // qdel - -// called when cable_coil is click on an installed obj/cable -// or click on a turf that already contains a "node" cable -/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user) - var/turf/U = user.loc - if(!isturf(U)) - return - - var/turf/T = C.loc - - if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable - return - - if(get_dist(C, user) > 1) // make sure it's close enough - user << "You can't lay cable at a place that far away." - return - - - if(U == T) //if clicked on the turf we're standing on, try to put a cable in the direction we're facing - turf_place(T,user) - return - - var/dirn = get_dir(C, user) - - // one end of the clicked cable is pointing towards us - if(C.d1 == dirn || C.d2 == dirn) - if(U.intact) // can't place a cable if the floor is complete - user << "You can't lay cable there unless the floor tiles are removed." - return - else - // cable is pointing at us, we're standing on an open tile - // so create a stub pointing at the clicked cable on our tile - - var/fdirn = turn(dirn, 180) // the opposite direction - - for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already - if(LC.d1 == fdirn || LC.d2 == fdirn) - user << "There's already a cable at that position." - return - - var/obj/structure/cable/NC = new(U) - NC.cableColor(color) - - NC.d1 = 0 - NC.d2 = fdirn - NC.add_fingerprint() - NC.updateicon() - - //create a new powernet with the cable, if needed it will be merged later - var/datum/powernet/newPN = new() - newPN.add_cable(NC) - - NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets - NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets - - if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions - NC.mergeDiagonalsNetworks(NC.d2) - - use(1) - - if (NC.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(NC.loc, 1, NC.color) - del(NC) // qdel - - return - - // exisiting cable doesn't point at our position, so see if it's a stub - else if(C.d1 == 0) - // if so, make it a full cable pointing from it's old direction to our dirn - var/nd1 = C.d2 // these will be the new directions - var/nd2 = dirn - - - if(nd1 > nd2) // swap directions to match icons/states - nd1 = dirn - nd2 = C.d2 - - - for(var/obj/structure/cable/LC in T) // check to make sure there's no matching cable - if(LC == C) // skip the cable we're interacting with - continue - if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - user << "There's already a cable at that position." - return - - - C.cableColor(color) - - C.d1 = nd1 - C.d2 = nd2 - - C.add_fingerprint() - C.updateicon() - - - C.mergeConnectedNetworks(C.d1) //merge the powernets... - C.mergeConnectedNetworks(C.d2) //...in the two new cable directions - C.mergeConnectedNetworksOnTurf() - - if(C.d1 & (C.d1 - 1))// if the cable is layed diagonally, check the others 2 possible directions - C.mergeDiagonalsNetworks(C.d1) - - if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions - C.mergeDiagonalsNetworks(C.d2) - - use(1) - - if (C.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(C.loc, 2, C.color) - del(C) // qdel - return - - C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets. - return - -////////////////////////////// -// Misc. -///////////////////////////// - -/obj/item/stack/cable_coil/cut - item_state = "coil2" - -/obj/item/stack/cable_coil/cut/New(loc) - ..() - src.amount = rand(1,2) - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) - update_icon() - update_wclass() - -/obj/item/stack/cable_coil/yellow - color = COLOR_YELLOW - -/obj/item/stack/cable_coil/blue - color = COLOR_BLUE - -/obj/item/stack/cable_coil/green - color = COLOR_GREEN - -/obj/item/stack/cable_coil/pink - color = COLOR_PINK - -/obj/item/stack/cable_coil/orange - color = COLOR_ORANGE - -/obj/item/stack/cable_coil/cyan - color = COLOR_CYAN - -/obj/item/stack/cable_coil/white - color = COLOR_WHITE - -/obj/item/stack/cable_coil/random/New() - color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) - ..() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 55c78538d6..efccd0aa4f 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -118,8 +118,7 @@ explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) - spawn(1) - del(src) + qdel(src) /obj/item/weapon/cell/proc/corrupt() charge /= 2 @@ -144,17 +143,17 @@ switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if (prob(50)) corrupt() if(3.0) if (prob(25)) - del(src) + qdel(src) return if (prob(25)) corrupt() diff --git a/code/modules/power/engine.dm b/code/modules/power/engine.dm index c0f761254e..a9095b3a78 100644 --- a/code/modules/power/engine.dm +++ b/code/modules/power/engine.dm @@ -19,12 +19,12 @@ switch(severity) if(1.0) ChangeTurf(/turf/space) - del(src) + qdel(src) return if(2.0) if (prob(50)) ChangeTurf(/turf/space) - del(src) + qdel(src) return else return @@ -32,6 +32,6 @@ /turf/simulated/floor/engine/blob_act() if (prob(25)) ChangeTurf(/turf/space) - del(src) + qdel(src) return return \ No newline at end of file diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 14bdaa1644..ea390427ce 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -9,7 +9,7 @@ #define LIGHT_BROKEN 2 #define LIGHT_BURNED 3 - +#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb /obj/item/light_fixture_frame name = "light fixture frame" @@ -24,7 +24,7 @@ /obj/item/light_fixture_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) - del(src) + qdel(src) return ..() @@ -56,7 +56,7 @@ usr.visible_message("[usr.name] attaches [src] to the wall.", \ "You attach [src] to the wall.") - del(src) + qdel(src) /obj/item/light_fixture_frame/small name = "small light fixture frame" @@ -111,7 +111,7 @@ user.visible_message("[user.name] deconstructs [src].", \ "You deconstruct [src].", "You hear a noise.") playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) - del(src) + qdel(src) if (src.stage == 2) usr << "You have to remove the wires first." return @@ -169,7 +169,7 @@ newlight.dir = src.dir src.transfer_fingerprints_to(newlight) - del(src) + qdel(src) return ..() @@ -253,7 +253,7 @@ spawn(1) update(0) -/obj/machinery/light/Del() +/obj/machinery/light/Destroy() var/area/A = get_area(src) if(A) on = 0 @@ -370,7 +370,7 @@ update() user.drop_item() //drop the item to update overlays and such - del(L) + qdel(L) if(on && rigged) @@ -424,7 +424,7 @@ newlight.fingerprints = src.fingerprints newlight.fingerprintshidden = src.fingerprintshidden newlight.fingerprintslast = src.fingerprintslast - del(src) + qdel(src) return user << "You stick \the [W] into the light socket!" @@ -487,11 +487,13 @@ var/mob/living/carbon/human/H = user if(istype(H)) - - if(H.gloves) + if(H.species.heat_level_1 > LIGHT_BULB_TEMPERATURE) + prot = 1 + else if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.max_heat_protection_temperature) - prot = (G.max_heat_protection_temperature > 360) + if(G.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) + prot = 1 else prot = 1 @@ -579,7 +581,7 @@ /obj/machinery/light/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(75)) @@ -629,7 +631,7 @@ sleep(2) explosion(T, 0, 0, 2, 2) sleep(1) - del(src) + qdel(src) // the light item // can be tube or bulb subtypes diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm index 017c5997e6..0664c529d2 100644 --- a/code/modules/power/pacman2.dm +++ b/code/modules/power/pacman2.dm @@ -113,7 +113,7 @@ I.loc = src.loc new_frame.state = 2 new_frame.icon_state = "box_1" - del(src) + qdel(src) attack_hand(mob/user as mob) ..() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 4828280e63..bd113ff268 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -76,7 +76,7 @@ /obj/machinery/power/port_gen/proc/explode() explosion(src.loc, -1, 3, 5, -1) - del(src) + qdel(src) #define TEMPERATURE_DIVISOR 40 #define TEMPERATURE_CHANGE_MAX 20 @@ -125,7 +125,7 @@ component_parts += new board_path(src) RefreshParts() -/obj/machinery/power/port_gen/pacman/Del() +/obj/machinery/power/port_gen/pacman/Destroy() DropFuel() ..() @@ -301,7 +301,7 @@ new_frame.state = 2 new_frame.icon_state = "box_1" - del(src) + qdel(src) /obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob) ..() @@ -342,6 +342,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "pacman.tmpl", src.name, 500, 560) + ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -423,7 +424,7 @@ L.apply_effect(max(20, round(rads/get_dist(L,src))), IRRADIATE) explosion(src.loc, 3, 3, 5, 3) - del(src) + qdel(src) /obj/machinery/power/port_gen/pacman/mrs name = "M.R.S.P.A.C.M.A.N.-type Portable Generator" @@ -445,4 +446,4 @@ /obj/machinery/power/port_gen/pacman/mrs/explode() //no special effects, but the explosion is pretty big (same as a supermatter shard). explosion(src.loc, 3, 6, 12, 16, 1) - del(src) + qdel(src) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 7cfcc53246..9c24866b39 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -15,7 +15,7 @@ idle_power_usage = 0 active_power_usage = 0 -/obj/machinery/power/Del() +/obj/machinery/power/Destroy() disconnect_from_network() ..() @@ -235,7 +235,7 @@ // rebuild all power networks from scratch - only called at world creation or by the admin verb /proc/makepowernets() for(var/datum/powernet/PN in powernets) - del(PN) + qdel(PN) powernets.Cut() for(var/obj/structure/cable/PC in cable_list) diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 791b69e949..97d3afe572 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -18,7 +18,7 @@ powernets += src ..() -/datum/powernet/Del() +/datum/powernet/Destroy() powernets -= src ..() @@ -42,7 +42,7 @@ cables -= C C.powernet = null if(is_empty())//the powernet is now empty... - del(src)///... delete it - qdel + qdel(src)///... delete it //add a cable to the current powernet //Warning : this proc DON'T check if the cable exists @@ -62,7 +62,7 @@ nodes -=M M.powernet = null if(is_empty())//the powernet is now empty... - del(src)///... delete it - qdel + qdel(src)///... delete it - qdel //add a power machine to the current powernet diff --git a/code/modules/power/rust/core_field.dm b/code/modules/power/rust/core_field.dm index ad974786b7..587dde3ce5 100644 --- a/code/modules/power/rust/core_field.dm +++ b/code/modules/power/rust/core_field.dm @@ -47,7 +47,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K owned_core = core if(!owned_core) - del(src) + qdel(src) //create the gimmicky things to handle field collisions var/obj/effect/rust_particle_catcher/catcher @@ -118,7 +118,7 @@ Deuterium-tritium fusion: 4.5 x 10^7 K /obj/effect/rust_em_field/process() //make sure the field generator is still intact if(!owned_core) - del(src) + qdel(src) //handle radiation if(!radiator) @@ -427,10 +427,10 @@ Deuterium-tritium fusion: 4.5 x 10^7 K AddParticles(reactant, reactants_reacting_pool[reactant]) //world << "retained: [reactant], [reactants_reacting_pool[reactant]]" -/obj/effect/rust_em_field/Del() +/obj/effect/rust_em_field/Destroy() //radiate everything in one giant burst for(var/obj/effect/rust_particle_catcher/catcher in particle_catchers) - del (catcher) + qdel (catcher) RadiateAll() processing_objects.Remove(src) diff --git a/code/modules/power/rust/core_gen.dm b/code/modules/power/rust/core_gen.dm index 7cf9f9d696..78e0a02b15 100644 --- a/code/modules/power/rust/core_gen.dm +++ b/code/modules/power/rust/core_gen.dm @@ -268,7 +268,7 @@ max volume of phoron storeable by the field = the total volume of a number of ti //todo: safety checks for field status if(owned_field) icon_state = "core0" - del(owned_field) + qdel(owned_field) luminosity = 0 use_power = 1 diff --git a/code/modules/power/rust/fuel_assembly_port_construction.dm b/code/modules/power/rust/fuel_assembly_port_construction.dm index 092805de78..0438249e6d 100644 --- a/code/modules/power/rust/fuel_assembly_port_construction.dm +++ b/code/modules/power/rust/fuel_assembly_port_construction.dm @@ -11,7 +11,7 @@ /obj/item/rust_fuel_assembly_port_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/plasteel( get_turf(src.loc), 12 ) - del(src) + qdel(src) return ..() @@ -30,7 +30,7 @@ usr << "\red Port cannot be placed in this area." return new /obj/machinery/rust_fuel_assembly_port(loc, ndir, 1) - del(src) + qdel(src) //construction steps /obj/machinery/rust_fuel_assembly_port/New(turf/loc, var/ndir, var/building=0) @@ -110,7 +110,7 @@ if(do_after(user, 10)) has_electronics &= 1 user << "You place the port control board inside the frame." - del(W) + qdel(W) return else if (istype(W, /obj/item/weapon/weldingtool) && opened && !has_electronics) @@ -127,7 +127,7 @@ "\red [src] has been cut away from the wall by [user.name].",\ "You detached the port frame.",\ "\red You hear welding.") - del(src) + qdel(src) return ..() diff --git a/code/modules/power/rust/fuel_compressor.dm b/code/modules/power/rust/fuel_compressor.dm index 2abd9f17f8..2a6adfa50f 100644 --- a/code/modules/power/rust/fuel_compressor.dm +++ b/code/modules/power/rust/fuel_compressor.dm @@ -25,7 +25,7 @@ var/const/max_assembly_amount = 300 /obj/machinery/rust_fuel_compressor/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/rcd_ammo)) compressed_matter += 10 - del(W) + qdel(W) return ..() @@ -93,7 +93,7 @@ var/const/max_assembly_amount = 300 break //world << "\blue [reagent]: new_assembly_quantities[reagent]
        " if(fail) - del(F) + qdel(F) compressed_matter = old_matter usr << "\red \icon[src] [src] flashes red: \'Out of matter.\'" else diff --git a/code/modules/power/rust/fuel_compressor_construction.dm b/code/modules/power/rust/fuel_compressor_construction.dm index c9c3895f2b..422a46116b 100644 --- a/code/modules/power/rust/fuel_compressor_construction.dm +++ b/code/modules/power/rust/fuel_compressor_construction.dm @@ -11,7 +11,7 @@ /obj/item/rust_fuel_compressor_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) new /obj/item/stack/sheet/plasteel( get_turf(src.loc), 12 ) - del(src) + qdel(src) return ..() @@ -30,7 +30,7 @@ usr << "\red Compressor cannot be placed in this area." return new /obj/machinery/rust_fuel_assembly_port(loc, ndir, 1) - del(src) + qdel(src) //construction steps /obj/machinery/rust_fuel_compressor/New(turf/loc, var/ndir, var/building=0) @@ -137,7 +137,7 @@ if(do_after(user, 10)) has_electronics &= 1 user << "You place the circuitboard inside the frame." - del(W) + qdel(W) return else if (istype(W, /obj/item/weapon/weldingtool) && opened && !has_electronics) @@ -154,7 +154,7 @@ "\red [src] has been cut away from the wall by [user.name].",\ "You detached the compressor frame.",\ "\red You hear welding.") - del(src) + qdel(src) return ..() diff --git a/code/modules/power/rust/radiation.dm b/code/modules/power/rust/radiation.dm index b94127ffa2..88d8cd05ab 100644 --- a/code/modules/power/rust/radiation.dm +++ b/code/modules/power/rust/radiation.dm @@ -15,7 +15,7 @@ else time_alive -= 0.1 if(time_alive < 0) - del(src) + qdel(src) //radiate mobs nearby here // diff --git a/code/modules/power/rust/virtual_particle_catcher.dm b/code/modules/power/rust/virtual_particle_catcher.dm index 350d9f66fc..8da88e76cb 100644 --- a/code/modules/power/rust/virtual_particle_catcher.dm +++ b/code/modules/power/rust/virtual_particle_catcher.dm @@ -14,11 +14,11 @@ for(var/obj/machinery/rust/em_field/field in range(6)) parent = field if(!parent) - del(src)*/ + qdel(src)*/ /obj/effect/rust_particle_catcher/process() if(!parent) - del(src) + qdel(src) /obj/effect/rust_particle_catcher/proc/SetSize(var/newsize) name = "collector [newsize]" diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm index 54b203a7d4..5f561fcde6 100644 --- a/code/modules/power/sensors/sensor_monitoring.dm +++ b/code/modules/power/sensors/sensor_monitoring.dm @@ -1,7 +1,4 @@ // POWERNET SENSOR MONITORING CONSOLE -// -// Last Change 31.12.2014 by Atlantis -// // Connects to powernet sensors and loads data from them. Shows this data to the user. // Newly supports NanoUI. @@ -22,18 +19,14 @@ active_power_usage = 300 var/obj/nano_module/power_monitor/power_monitor -// Proc: process() -// Parameters: None -// Description: Checks the sensors for alerts. If change (alerts cleared or detected) occurs, calls for icon update. +// Checks the sensors for alerts. If change (alerts cleared or detected) occurs, calls for icon update. /obj/machinery/computer/power_monitor/process() var/alert = check_warnings() if(alert != alerting) alerting = !alerting update_icon() -// Proc: update_icon() -// Parameters: None -// Description: Updates icon of this computer according to current status. +// Updates icon of this computer according to current status. /obj/machinery/computer/power_monitor/update_icon() if(stat & BROKEN) icon_state = "powerb" @@ -46,17 +39,12 @@ return icon_state = "power" -// Proc: New() -// Parameters: None -// Description: On creation automatically connects to active sensors. This is delayed to ensure sensors already exist. +// On creation automatically connects to active sensors. This is delayed to ensure sensors already exist. /obj/machinery/computer/power_monitor/New() ..() - spawn(50) - power_monitor = new(src) + power_monitor = new(src) -// Proc: attack_hand() -// Parameters: None -// Description: On user click opens the UI of this computer. +// On user click opens the UI of this computer. /obj/machinery/computer/power_monitor/attack_hand(mob/user) add_fingerprint(user) @@ -64,16 +52,12 @@ return ui_interact(user) -// Proc: ui_interact() -// Parameters: 4 (standard NanoUI parameters) -// Description: Uses dark magic to operate the NanoUI of this computer. +// Uses dark magic to operate the NanoUI of this computer. /obj/machinery/computer/power_monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) power_monitor.ui_interact(user, ui_key, ui, force_open) -// Proc: check_warnings() -// Parameters: None -// Description: Verifies if any warnings were registered by connected sensors. +// Verifies if any warnings were registered by connected sensors. /obj/machinery/computer/power_monitor/proc/check_warnings() for(var/obj/machinery/power/sensor/S in power_monitor.grid_sensors) if(S.check_grid_warning()) diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm new file mode 100644 index 0000000000..8e505f107f --- /dev/null +++ b/code/modules/power/singularity/act.dm @@ -0,0 +1,138 @@ +#define I_SINGULO "singulo" + +/atom/proc/singularity_act() + return + +/atom/proc/singularity_pull() + return + +/mob/living/singularity_act() + investigate_log("has been consumed by a singularity", I_SINGULO) + gib() + return 20 + +/mob/living/singularity_pull(S) + step_towards(src, S) + +/mob/living/carbon/human/singularity_act() + var/gain = 20 + if(mind) + if((mind.assigned_role == "Station Engineer") || (mind.assigned_role == "Chief Engineer")) + gain = 100 + if(mind.assigned_role == "Assistant") + gain = rand(0, 300) + investigate_log(I_SINGULO,"has been consumed by a singularity", I_SINGULO) + gib() + return gain + +/mob/living/carbon/human/singularity_pull(S, current_size) + if(current_size >= STAGE_THREE) + var/list/handlist = list(l_hand, r_hand) + for(var/obj/item/hand in handlist) + if(prob(current_size*5) && hand.w_class >= ((11-current_size)/2) && u_equip(hand)) + step_towards(hand, src) + src << "The [S] pulls \the [hand] from your grip!" + apply_effect(current_size * 3, IRRADIATE) + if(shoes) + if(shoes.flags & NOSLIP) return 0 + ..() + +/obj/singularity_act() + ex_act(1) + if(src) + qdel(src) + return 2 + +/obj/singularity_pull(S, current_size) + if(anchored) + if(current_size >= STAGE_FIVE) + step_towards(src, S) + else + step_towards(src, S) + +/obj/effect/beam/singularity_pull() + return + +/obj/effect/overlay/singularity_pull() + return + +/obj/item/singularity_pull(S, current_size) + spawn(0) //this is needed or multiple items will be thrown sequentially and not simultaneously + if(current_size >= STAGE_FOUR) + //throw_at(S, 14, 3) + step_towards(src,S) + sleep(1) + step_towards(src,S) + else if(current_size > STAGE_ONE) + step_towards(src,S) + else ..() + +/obj/machinery/atmospherics/pipe/singularity_pull() + return + +/obj/machinery/power/supermatter/shard/singularity_act() + src.loc = null + qdel(src) + return 5000 + +/obj/machinery/power/supermatter/singularity_act() + var/prints = "" + if(src.fingerprintshidden) + prints = ", all touchers : " + src.fingerprintshidden + + SetUniversalState(/datum/universal_state/supermatter_cascade) + log_admin("New super singularity made by eating a SM crystal [prints]. Last touched by [src.fingerprintslast].") + message_admins("New super singularity made by eating a SM crystal [prints]. Last touched by [src.fingerprintslast].") + src.loc = null + qdel(src) + return 50000 + +/obj/item/projectile/beam/emitter/singularity_pull() + return + +/obj/item/weapon/storage/backpack/holding/singularity_act(S, current_size) + var/dist = max((current_size - 2), 1) + explosion(src.loc,(dist),(dist*2),(dist*4)) + return 1000 + +/turf/singularity_act(S, current_size) + if(intact) + for(var/obj/O in contents) + if(O.level != 1) + continue + if(O.invisibility == 101) + O.singularity_act(src, current_size) + ChangeTurf(/turf/space) + return 2 + +/turf/simulated/wall/singularity_pull(S, current_size) + if(current_size >= STAGE_FIVE) + if(prob(75)) + dismantle_wall() + return + if(current_size == STAGE_FOUR) + if(prob(30)) + dismantle_wall() + +/turf/simulated/wall/r_wall/singularity_pull(S, current_size) + if(current_size >= STAGE_FIVE) + if(prob(30)) + dismantle_wall() + +/turf/space/singularity_act() + return + +/******************* +* Nar-Sie Act/Pull * +*******************/ +/atom/proc/singuloCanEat() + return 1 + +/mob/dead/singuloCanEat() + return 0 + +/mob/eye/singuloCanEat() + return 0 + +/mob/new_player/singuloCanEat() + return 0 diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 4dc1fb528e..dee15d9f14 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -21,7 +21,7 @@ var/global/list/rad_collectors = list() ..() rad_collectors += src -/obj/machinery/power/rad_collector/Del() +/obj/machinery/power/rad_collector/Destroy() rad_collectors -= src ..() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 2c24eba108..24758fc27e 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -14,7 +14,7 @@ var/obj/machinery/field_generator/FG2 = null var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second. -/obj/machinery/containment_field/Del() +/obj/machinery/containment_field/Destroy() if(FG1 && !FG1.clean_up) FG1.cleanup() if(FG2 && !FG2.clean_up) @@ -54,7 +54,7 @@ if(hasShocked) return 0 if(!FG1 || !FG2) - del(src) + qdel(src) return 0 if(isliving(user)) hasShocked = 1 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index c85c48e27a..11606b3dc1 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -41,7 +41,7 @@ if(state == 2 && anchored) connect_to_network() -/obj/machinery/power/emitter/Del() +/obj/machinery/power/emitter/Destroy() message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("Emitter deleted at ([x],[y],[z])") investigate_log("deleted at ([x],[y],[z])","singulo") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 501ccd989a..2f38800637 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -31,7 +31,7 @@ field_generator power level display var/list/obj/machinery/containment_field/fields var/list/obj/machinery/field_generator/connected_gens var/clean_up = 0 - + //If keeping field generators powered is hard then increase the emitter active power usage. var/gen_power_draw = 5500 //power needed per generator var/field_power_draw = 2000 //power needed per field object @@ -61,7 +61,6 @@ field_generator power level display connected_gens = list() return - /obj/machinery/field_generator/process() if(Varedit_start == 1) if(active == 0) @@ -177,7 +176,7 @@ field_generator power level display return 0 -/obj/machinery/field_generator/Del() +/obj/machinery/field_generator/Destroy() src.cleanup() ..() @@ -231,22 +230,22 @@ field_generator power level display //Tries to draw the needed power from our own power reserve, or connected generators if we can. Returns the amount of power we were able to get. /obj/machinery/field_generator/proc/draw_power(var/draw = 0, var/list/flood_list = list()) flood_list += src - + if(src.power >= draw)//We have enough power src.power -= draw return draw - + //Need more power var/actual_draw = src.power //already checked that power < draw src.power = 0 - + for(var/obj/machinery/field_generator/FG in connected_gens) if (FG in flood_list) continue actual_draw += FG.draw_power(draw - actual_draw, flood_list) //since the flood list reference is shared this actually works. if (actual_draw >= draw) return actual_draw - + return actual_draw /obj/machinery/field_generator/proc/start_fields() @@ -325,7 +324,7 @@ field_generator power level display for (var/obj/machinery/containment_field/F in fields) if (isnull(F)) continue - del(F) + qdel(F) fields = list() for(var/obj/machinery/field_generator/FG in connected_gens) if (isnull(FG)) @@ -343,7 +342,7 @@ field_generator power level display //I want to avoid using global variables. spawn(1) var/temp = 1 //stops spam - for(var/obj/machinery/singularity/O in machines) + for(var/obj/singularity/O in machines) if(O.last_warning && temp) if((world.time - O.last_warning) > 50) //to stop message-spam temp = 0 diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 8b20fc16ab..1093390b0e 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -12,8 +12,8 @@ /obj/machinery/the_singularitygen/process() var/turf/T = get_turf(src) if(src.energy >= 200) - new /obj/machinery/singularity/(T, 50) - if(src) del(src) + new /obj/singularity/(T, 50) + if(src) qdel(src) /obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/wrench)) diff --git a/code/modules/power/singularity/investigate.dm b/code/modules/power/singularity/investigate.dm index 63c54c0e54..c0c62616ed 100644 --- a/code/modules/power/singularity/investigate.dm +++ b/code/modules/power/singularity/investigate.dm @@ -1,4 +1,4 @@ /area/engineering/power_alert(var/alarming) if (alarming) investigate_log("has a power alarm!","singulo") - ..() \ No newline at end of file + ..() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm new file mode 100644 index 0000000000..50093c440b --- /dev/null +++ b/code/modules/power/singularity/narsie.dm @@ -0,0 +1,367 @@ +var/global/narsie_behaviour = "CultStation13" +var/global/list/narsie_list = list() +/obj/singularity/narsie //Moving narsie to its own file for the sake of being clearer + name = "Nar-Sie" + desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees." + icon = 'icons/obj/narsie.dmi' + icon_state = "narsie-small" + pixel_x = -236 + pixel_y = -256 + + current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO. + contained = 0 // Are we going to move around? + dissipate = 0 // Do we lose energy over time? + grav_pull = 10 //How many tiles out do we pull? + consume_range = 3 //How many tiles out do we eat + + +/obj/singularity/narsie/New() + ..() + narsie_list.Add(src) + +/obj/singularity/narsie/Destroy() + narsie_list.Remove(src) + ..() + +/obj/singularity/narsie/large + name = "Nar-Sie" + icon = 'icons/obj/narsie.dmi' + icon_state = "narsie"//mobs perceive the geometer of blood through their see_narsie proc + + // Pixel stuff centers Narsie. + pixel_x = -236 + pixel_y = -256 + luminosity = 1 + l_color = "#3e0000" + + current_size = 12 + consume_range = 12 // How many tiles out do we eat. + var/announce=1 + var/narnar = 1 + +/obj/singularity/narsie/large/New() + ..() + if(announce) + world << "[uppertext(name)] HAS RISEN" + world << sound('sound/effects/wind/wind_5_1.ogg') + + narsie_spawn_animation() + + if(narnar) + SetUniversalState(/datum/universal_state/hell) + + spawn(10 SECONDS) + if(emergency_shuttle && emergency_shuttle.can_call()) + emergency_shuttle.call_evac() + emergency_shuttle.launch_time = 0 // Cannot recall + +/obj/singularity/narsie/process() + eat() + + if (!target || prob(5)) + pickcultist() + + move() + + if (prob(25)) + mezzer() + +/obj/singularity/narsie/large/eat() + set background = BACKGROUND_ENABLED + + for (var/turf/A in orange(consume_range, src)) + consume(A) + +/obj/singularity/narsie/mezzer() + for(var/mob/living/carbon/M in oviewers(8, src)) + if(M.stat == CONSCIOUS) + if(M.status_flags & GODMODE) + continue + if(!iscultist(M)) + M << " You feel your sanity crumble away in an instant as you gaze upon [src.name]..." + M.apply_effect(3, STUN) + + +/obj/singularity/narsie/large/Bump(atom/A) + if(!narnar) return + if(isturf(A)) + narsiewall(A) + else if(istype(A, /obj/structure/cult)) + qdel(A) + +/obj/singularity/narsie/large/Bumped(atom/A) + if(!narnar) return + if(isturf(A)) + narsiewall(A) + else if(istype(A, /obj/structure/cult)) + qdel(A) + +/obj/singularity/narsie/move(var/force_move = 0) + if(!move_self) + return 0 + + var/movement_dir = pick(alldirs - last_failed_movement) + + if(force_move) + movement_dir = force_move + + if(target && prob(60)) + movement_dir = get_dir(src,target) + + spawn(0) + step(src, movement_dir) + spawn(1) + step(src, movement_dir) + return 1 + +/obj/singularity/narsie/large/move(var/force_move = 0) + if(!move_self) + return 0 + + var/movement_dir = pick(alldirs - last_failed_movement) + + if(force_move) + movement_dir = force_move + + if(target && prob(60)) + movement_dir = get_dir(src,target) + spawn(0) + step(src, movement_dir) + narsiefloor(get_turf(loc)) + for(var/mob/M in player_list) + if(M.client) + M.see_narsie(src,movement_dir) + spawn(10) + step(src, movement_dir) + narsiefloor(get_turf(loc)) + for(var/mob/M in player_list) + if(M.client) + M.see_narsie(src,movement_dir) + return 1 + +/obj/singularity/narsie/proc/narsiefloor(var/turf/T)//leaving "footprints" + if(!(istype(T, /turf/simulated/wall/cult)||istype(T, /turf/space))) + if(T.icon_state != "cult-narsie") + T.desc = "something that goes beyond your understanding went this way" + T.icon_state = "cult-narsie" + T.luminosity = 1 + +/obj/singularity/narsie/proc/narsiewall(var/turf/T) + T.desc = "An opening has been made on that wall, but who can say if what you seek truly lies on the other side?" + T.icon = 'icons/turf/walls.dmi' + T.icon_state = "cult-narsie" + T.opacity = 0 + T.density = 0 + luminosity = 1 + +/obj/singularity/narsie/large/consume(const/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO +//NEW BEHAVIOUR + if(narsie_behaviour == "CultStation13") + //MOB PROCESSING + new_narsie(A) + +//OLD BEHAVIOUR + else if(narsie_behaviour == "Nar-Singulo") + old_narsie(A) + +/obj/singularity/narsie/proc/new_narsie(const/atom/A) + if (istype(A, /mob/) && (get_dist(A, src) <= 7)) + var/mob/M = A + + if(M.status_flags & GODMODE) + return 0 + + M.cultify() + +//ITEM PROCESSING + else if (istype(A, /obj/)) + var/obj/O = A + O.cultify() + +//TURF PROCESSING + else if (isturf(A)) + var/dist = get_dist(A, src) + + for (var/atom/movable/AM in A.contents) + if (dist <= consume_range) + consume(AM) + continue + + if (dist <= consume_range && !istype(A, /turf/space)) + var/turf/T = A + if(T.holy) + T.holy = 0 //Nar-Sie doesn't give a shit about sacred grounds. + T.cultify() + +/obj/singularity/narsie/proc/old_narsie(const/atom/A) + if(!(A.singuloCanEat())) + return 0 + + if (istype(A, /mob/living/)) + var/mob/living/C2 = A + + if(C2.status_flags & GODMODE) + return 0 + + C2.dust() // Changed from gib(), just for less lag. + + else if (istype(A, /obj/)) + qdel(A) + + if (A) + qdel(A) + else if (isturf(A)) + var/dist = get_dist(A, src) + + for (var/atom/movable/AM2 in A.contents) + if (AM2 == src) // This is the snowflake. + continue + + if (dist <= consume_range) + consume(AM2) + continue + + if (dist <= consume_range && !istype(A, /turf/space)) + var/turf/T2 = A + T2.ChangeTurf(/turf/space) + +/obj/singularity/narsie/consume(const/atom/A) //This one is for the small ones. + if(!(A.singuloCanEat())) + return 0 + + if (istype(A, /mob/living/)) + var/mob/living/C2 = A + + if(C2.status_flags & GODMODE) + return 0 + + C2.dust() // Changed from gib(), just for less lag. + + else if (istype(A, /obj/)) + qdel(A) + + if (A) + qdel(A) + else if (isturf(A)) + var/dist = get_dist(A, src) + + for (var/atom/movable/AM2 in A.contents) + if (AM2 == src) // This is the snowflake. + continue + + if (dist <= consume_range) + consume(AM2) + continue + + if (dist > consume_range) + if(!(AM2.singuloCanEat())) + continue + + if (101 == AM2.invisibility) + continue + + spawn (0) + AM2.singularity_pull(src, src.current_size) + + if (dist <= consume_range && !istype(A, /turf/space)) + var/turf/T2 = A + T2.ChangeTurf(/turf/space) + +/obj/singularity/narsie/ex_act(severity) //No throwing bombs at it either. --NEO + return + +/obj/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO + var/list/cultists = list() + for(var/datum/mind/cult_nh_mind in cult.current_antagonists) + if(!cult_nh_mind.current) + continue + if(cult_nh_mind.current.stat) + continue + var/turf/pos = get_turf(cult_nh_mind.current) + if(pos.z != src.z) + continue + cultists += cult_nh_mind.current + if(cultists.len) + acquire(pick(cultists)) + return + //If there was living cultists, it picks one to follow. + for(var/mob/living/carbon/human/food in living_mob_list) + if(food.stat) + continue + var/turf/pos = get_turf(food) + if(pos.z != src.z) + continue + cultists += food + if(cultists.len) + acquire(pick(cultists)) + return + //no living cultists, pick a living human instead. + for(var/mob/dead/observer/ghost in player_list) + if(!ghost.client) + continue + var/turf/pos = get_turf(ghost) + if(pos.z != src.z) + continue + cultists += ghost + if(cultists.len) + acquire(pick(cultists)) + return + //no living humans, follow a ghost instead. + +/obj/singularity/narsie/proc/acquire(const/mob/food) + var/capname = uppertext(name) + + target << "[capname] HAS LOST INTEREST IN YOU." + target = food + + if (ishuman(target)) + target << "[capname] HUNGERS FOR YOUR SOUL." + else + target << "[capname] HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL." + +/obj/singularity/narsie/on_capture() + chained = 1 + move_self = 0 + icon_state ="narsie-small-chains" + +/obj/singularity/narsie/on_release() + chained = 0 + move_self = 1 + icon_state ="narsie-small" + +/obj/singularity/narsie/large/on_capture() + chained = 1 + move_self = 0 + icon_state ="narsie-chains" + for(var/mob/M in mob_list)//removing the client image of nar-sie while it is chained + if(M.client) + M.see_narsie(src) + +/obj/singularity/narsie/large/on_release() + chained = 0 + move_self = 1 + icon_state ="narsie" + +/obj/singularity/narsie/cultify() + return + +/** + * Wizard narsie. + */ +/obj/singularity/narsie/wizard + grav_pull = 0 + +/obj/singularity/narsie/wizard/eat() + set background = BACKGROUND_ENABLED + + for (var/turf/T in trange(consume_range, src)) + consume(T) + +/obj/singularity/narsie/proc/narsie_spawn_animation() + icon = 'icons/obj/narsie_spawn_anim.dmi' + dir = SOUTH + move_self = 0 + flick("narsie_spawn_anim",src) + sleep(11) + move_self = 1 + icon = initial(icon) diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 2113ba87f7..10413fb992 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -41,14 +41,14 @@ if (A) if(ismob(A)) toxmob(A) - if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/machinery/singularity/))) + if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/))) A:energy += energy else if( istype(A,/obj/effect/rust_particle_catcher) ) var/obj/effect/rust_particle_catcher/collided_catcher = A if(particle_type && particle_type != "neutron") if(collided_catcher.AddParticles(particle_type, 1 + additional_particles)) collided_catcher.parent.AddEnergy(energy,mega_energy) - del (src) + qdel(src) else if( istype(A,/obj/machinery/power/rust_core) ) var/obj/machinery/power/rust_core/collided_core = A if(particle_type && particle_type != "neutron") @@ -56,7 +56,7 @@ var/energy_loss_ratio = abs(collided_core.owned_field.frequency - frequency) / 1e9 collided_core.owned_field.mega_energy += mega_energy - mega_energy * energy_loss_ratio collided_core.owned_field.energy += energy - energy * energy_loss_ratio - del (src) + qdel(src) return @@ -67,7 +67,7 @@ /obj/effect/accelerated_particle/ex_act(severity) - del(src) + qdel(src) return @@ -95,7 +95,7 @@ src.loc = get_step(src,dir) movement_range-- if(movement_range <= 0) - del(src) + qdel(src) else sleep(lag) move(lag) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 6739bd165e..6ae932dee1 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -72,6 +72,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin var/strength = null var/desc_holder = null +/obj/structure/particle_accelerator/Destroy() + construction_state = 0 + if(master) + master.part_scan() + ..() + /obj/structure/particle_accelerator/end_cap name = "Alpha Particle Generation Array" desc_holder = "This is where Alpha particles are generated from \[REDACTED\]" @@ -138,15 +144,15 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/structure/particle_accelerator/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(25)) - del(src) + qdel(src) return else return @@ -154,13 +160,13 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/structure/particle_accelerator/blob_act() if(prob(50)) - del(src) + qdel(src) return /obj/structure/particle_accelerator/meteorhit() if(prob(50)) - del(src) + qdel(src) return /obj/structure/particle_accelerator/update_icon() @@ -325,15 +331,15 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/machinery/particle_accelerator/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return if(3.0) if (prob(25)) - del(src) + qdel(src) return else return @@ -341,13 +347,13 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/machinery/particle_accelerator/blob_act() if(prob(50)) - del(src) + qdel(src) return /obj/machinery/particle_accelerator/meteorhit() if(prob(50)) - del(src) + qdel(src) return diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 26239ff567..985bd74e62 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -27,6 +27,10 @@ active_power_usage = initial(active_power_usage) * (strength + 1) ..() +/obj/machinery/particle_accelerator/control_box/Destroy() + if(active) + toggle_power() + ..() /obj/machinery/particle_accelerator/control_box/attack_hand(mob/user as mob) if(construction_state >= 3) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index cecdf46a2c..e04268e0a9 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -1,11 +1,6 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 -var/global/list/uneatable = list( - /turf/space, - /obj/effect/overlay - ) - -/obj/machinery/singularity/ +/obj/singularity/ name = "gravitational singularity" desc = "A gravitational singularity." icon = 'icons/obj/singularity.dmi' @@ -15,7 +10,7 @@ var/global/list/uneatable = list( layer = 6 luminosity = 6 unacidable = 1 //Don't comment this out. - use_power = 0 + var/current_size = 1 var/allowed_size = 1 var/contained = 1 //Are we going to move around? @@ -26,102 +21,113 @@ var/global/list/uneatable = list( var/dissipate_strength = 1 //How much energy do we lose? var/move_self = 1 //Do we move on our own? var/grav_pull = 4 //How many tiles out do we pull? - var/consume_range = 0 //How many tiles out do we eat - var/event_chance = 15 //Prob for event each tick - var/target = null //its target. moves towards the target if it has one - var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing - var/teleport_del = 0 + var/consume_range = 0 //How many tiles out do we eat. + var/event_chance = 15 //Prob for event each tick. + var/target = null //Its target. Moves towards the target if it has one. + var/last_failed_movement = 0 //Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing. var/last_warning -/obj/machinery/singularity/New(loc, var/starting_energy = 50, var/temp = 0) + var/chained = 0//Adminbus chain-grab + +/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0) //CARN: admin-alert for chuckle-fuckery. admin_investigate_setup() + energy = starting_energy + + if (temp) + spawn (temp) + qdel(src) - src.energy = starting_energy - if(temp) - spawn(temp) - del(src) ..() + processing_objects += src for(var/obj/machinery/power/singularity_beacon/singubeacon in machines) if(singubeacon.active) target = singubeacon break - return +/obj/singularity/Destroy() + processing_objects -= src + ..() -/obj/machinery/singularity/attack_hand(mob/user as mob) +/obj/singularity/attack_hand(mob/user as mob) consume(user) return 1 - -/obj/machinery/singularity/blob_act(severity) +/obj/singularity/blob_act(severity) return - -/obj/machinery/singularity/ex_act(severity) +/obj/singularity/ex_act(severity) + if(current_size == STAGE_SUPER)//IT'S UNSTOPPABLE + return switch(severity) if(1.0) if(prob(25)) - del(src) + investigate_log("has been destroyed by an explosion.", I_SINGULO) + qdel(src) return else energy += 50 if(2.0 to 3.0) energy += round((rand(20,60)/2),1) return - return +/obj/singularity/bullet_act(obj/item/projectile/P) + return 0 //Will there be an impact? Who knows. Will we see it? No. -/obj/machinery/singularity/Bump(atom/A) +/obj/singularity/Bump(atom/A) consume(A) - return - -/obj/machinery/singularity/Bumped(atom/A) +/obj/singularity/Bumped(atom/A) consume(A) - return - -/obj/machinery/singularity/process() +/obj/singularity/process() eat() dissipate() check_energy() - if(current_size >= 3) + if (current_size >= STAGE_THREE) move() pulse() - if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit + + if (prob(event_chance)) //Chance for it to run a special event TODO: Come up with one or two more that fit. event() + +/obj/singularity/attack_ai() //To prevent ais from gibbing themselves when they click on one. return - -/obj/machinery/singularity/attack_ai() //to prevent ais from gibbing themselves when they click on one. - return - - -/obj/machinery/singularity/proc/admin_investigate_setup() +/obj/singularity/proc/admin_investigate_setup() last_warning = world.time var/count = locate(/obj/machinery/containment_field) in orange(30, src) - if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) - investigate_log("was created. [count?"":"No containment fields were active"]","singulo") -/obj/machinery/singularity/proc/dissipate() - if(!dissipate) + if (!count) + message_admins("A singulo has been created without containment fields active ([x], [y], [z] - JMP).") + + investigate_log("was created. [count ? "" : "No containment fields were active."]", I_SINGULO) + +/obj/singularity/proc/dissipate() + if (!dissipate) return + if(dissipate_track >= dissipate_delay) - src.energy -= dissipate_strength + energy -= dissipate_strength dissipate_track = 0 else dissipate_track++ +/obj/singularity/proc/expand(var/force_size = 0, var/growing = 1) + if(current_size == STAGE_SUPER)//if this is happening, this is an error + message_admins("expand() was called on a super singulo. This should not happen. Contact a coder immediately!") + return + var/temp_allowed_size = allowed_size -/obj/machinery/singularity/proc/expand(var/force_size = 0) - var/temp_allowed_size = src.allowed_size - if(force_size) + if (force_size) temp_allowed_size = force_size - switch(temp_allowed_size) - if(1) - current_size = 1 + + switch (temp_allowed_size) + if (STAGE_ONE) + name = "gravitational singularity" + desc = "A gravitational singularity." + current_size = STAGE_ONE icon = 'icons/obj/singularity.dmi' icon_state = "singularity_s1" pixel_x = 0 @@ -131,8 +137,14 @@ var/global/list/uneatable = list( dissipate_delay = 10 dissipate_track = 0 dissipate_strength = 1 - if(3)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them - current_size = 3 + overlays = 0 + if(chained) + overlays = "chain_s1" + visible_message("The singularity has shrunk to a rather pitiful size.") + if (STAGE_TWO) //1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them. + name = "gravitational singularity" + desc = "A gravitational singularity." + current_size = STAGE_TWO icon = 'icons/effects/96x96.dmi' icon_state = "singularity_s3" pixel_x = -32 @@ -142,9 +154,18 @@ var/global/list/uneatable = list( dissipate_delay = 5 dissipate_track = 0 dissipate_strength = 5 - if(5) - if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2))) - current_size = 5 + overlays = 0 + if(chained) + overlays = "chain_s3" + if(growing) + visible_message("The singularity noticeably grows in size.") + else + visible_message("The singularity has shrunk to a less powerful size.") + if (STAGE_THREE) + if ((check_turfs_in(1, 2)) && (check_turfs_in(2, 2)) && (check_turfs_in(4, 2)) && (check_turfs_in(8, 2))) + name = "gravitational singularity" + desc = "A gravitational singularity." + current_size = STAGE_THREE icon = 'icons/effects/160x160.dmi' icon_state = "singularity_s5" pixel_x = -64 @@ -154,9 +175,18 @@ var/global/list/uneatable = list( dissipate_delay = 4 dissipate_track = 0 dissipate_strength = 20 - if(7) - if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3))) - current_size = 7 + overlays = 0 + if(chained) + overlays = "chain_s5" + if(growing) + visible_message("The singularity expands to a reasonable size.") + else + visible_message("The singularity has returned to a safe size.") + if(STAGE_FOUR) + if ((check_turfs_in(1, 3)) && (check_turfs_in(2, 3)) && (check_turfs_in(4, 3)) && (check_turfs_in(8, 3))) + name = "gravitational singularity" + desc = "A gravitational singularity." + current_size = STAGE_FOUR icon = 'icons/effects/224x224.dmi' icon_state = "singularity_s7" pixel_x = -96 @@ -166,125 +196,102 @@ var/global/list/uneatable = list( dissipate_delay = 10 dissipate_track = 0 dissipate_strength = 10 - if(9)//this one also lacks a check for gens because it eats everything - current_size = 9 + overlays = 0 + if(chained) + overlays = "chain_s7" + if(growing) + visible_message("The singularity expands to a dangerous size.") + else + visible_message("Miraculously, the singularity reduces in size, and can be contained.") + if(STAGE_FIVE) //This one also lacks a check for gens because it eats everything. + name = "gravitational singularity" + desc = "A gravitational singularity." + current_size = STAGE_FIVE icon = 'icons/effects/288x288.dmi' icon_state = "singularity_s9" pixel_x = -128 pixel_y = -128 grav_pull = 10 consume_range = 4 + dissipate = 0 //It cant go smaller due to e loss. + overlays = 0 + if(chained) + overlays = "chain_s9" + if(growing) + visible_message("The singularity has grown out of control!") + else + visible_message("The singularity miraculously reduces in size and loses its supermatter properties.") + if(STAGE_SUPER)//SUPERSINGULO + name = "super gravitational singularity" + desc = "A gravitational singularity with the properties of supermatter. It has the power to destroy worlds." + current_size = STAGE_SUPER + icon = 'icons/effects/352x352.dmi' + icon_state = "singularity_s11"//uh, whoever drew that, you know that black holes are supposed to look dark right? What's this, the clown's singulo? + pixel_x = -160 + pixel_y = -160 + grav_pull = 16 + consume_range = 5 dissipate = 0 //It cant go smaller due to e loss - if(current_size == allowed_size) - investigate_log("grew to size [current_size]","singulo") + event_chance = 25 //Events will fire off more often. + if(chained) + overlays = "chain_s9" + visible_message("You witness the creation of a destructive force that cannot possibly be stopped by human hands.") + + if (current_size == allowed_size) + investigate_log("grew to size [current_size].", I_SINGULO) return 1 - else if(current_size < (--temp_allowed_size)) + else if (current_size < (--temp_allowed_size) && current_size != STAGE_SUPER) expand(temp_allowed_size) else return 0 - -/obj/machinery/singularity/proc/check_energy() - if(energy <= 0) - del(src) +/obj/singularity/proc/check_energy() + if (energy <= 0) + investigate_log("collapsed.", I_SINGULO) + qdel(src) return 0 - switch(energy)//Some of these numbers might need to be changed up later -Mport - if(1 to 199) - allowed_size = 1 - if(200 to 499) - allowed_size = 3 - if(500 to 999) - allowed_size = 5 - if(1000 to 1999) - allowed_size = 7 - if(2000 to INFINITY) - allowed_size = 9 - if(current_size != allowed_size) - expand() + + switch (energy) //Some of these numbers might need to be changed up later -Mport. + if (1 to 199) + allowed_size = STAGE_ONE + if (200 to 499) + allowed_size = STAGE_TWO + if (500 to 999) + allowed_size = STAGE_THREE + if (1000 to 1999) + allowed_size = STAGE_FOUR + if(2000 to 49999) + allowed_size = STAGE_FIVE + if(50000 to INFINITY) + allowed_size = STAGE_SUPER + + if (current_size != allowed_size && current_size != STAGE_SUPER) + expand(null, current_size > allowed_size) return 1 +/obj/singularity/proc/eat() + set background = BACKGROUND_ENABLED -/obj/machinery/singularity/proc/eat() - set background = 1 - // Let's just make this one loop. - for(var/atom/X in orange(grav_pull,src)) + for(var/atom/X in orange(grav_pull, src)) var/dist = get_dist(X, src) - // Movable atoms only - if(dist > consume_range && istype(X, /atom/movable)) - if(is_type_in_list(X, uneatable)) continue - if(((X) &&(!X:anchored) && (!istype(X,/mob/living/carbon/human)))|| (src.current_size >= 9)) - step_towards(X,src) - else if(istype(X,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = X - if(istype(H.shoes,/obj/item/clothing/shoes/magboots)) - var/obj/item/clothing/shoes/magboots/M = H.shoes - if(M.magpulse) - continue - step_towards(H,src) - // Turf and movable atoms - else if(dist <= consume_range && (isturf(X) || istype(X, /atom/movable))) - consume(X) - return - - -/obj/machinery/singularity/proc/consume(var/atom/A) - var/gain = 0 - if(is_type_in_list(A, uneatable)) - return 0 - if (istype(A,/mob/living))//Mobs get gibbed - gain = 20 - if(istype(A,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = A - if(H.mind) - - if((H.mind.assigned_role == "Station Engineer") || (H.mind.assigned_role == "Chief Engineer") ) - gain = 100 - - if(H.mind.assigned_role == "Clown") - gain = rand(-300, 300) // HONK - - spawn() - A:gib() - sleep(1) - else if(istype(A,/obj/)) - - if (istype(A,/obj/item/weapon/storage/backpack/holding)) - var/dist = max((current_size - 2),1) - explosion(src.loc,(dist),(dist*2),(dist*4)) + var/obj/singularity/S = src + if(!istype(src)) return + if(dist > consume_range) + X.singularity_pull(S, current_size) + else if(dist <= consume_range) + consume(X) - if(istype(A, /obj/machinery/singularity))//Welp now you did it - var/obj/machinery/singularity/S = A - src.energy += (S.energy/2)//Absorb most of it - del(S) - var/dist = max((current_size - 2),1) - explosion(src.loc,(dist),(dist*2),(dist*4)) - return//Quits here, the obj should be gone, hell we might be + //for (var/turf/T in trange(grav_pull, src)) //TODO: Create a similar trange for orange to prevent snowflake of self check. + // consume(T) - if((teleport_del) && (!istype(A, /obj/machinery)))//Going to see if it does not lag less to tele items over to Z 2 - var/obj/O = A - O.x = 2 - O.y = 2 - O.z = 2 - else - A.ex_act(1.0) - if(A) del(A) - gain = 2 - else if(isturf(A)) - var/turf/T = A - if(T.intact) - for(var/obj/O in T.contents) - if(O.level != 1) - continue - if(O.invisibility == 101) - src.consume(O) - T.ChangeTurf(/turf/space) - gain = 2 - src.energy += gain return +/obj/singularity/proc/consume(const/atom/A) + src.energy += A.singularity_act(src, current_size) + return -/obj/machinery/singularity/proc/move(var/force_move = 0) +/obj/singularity/proc/move(var/force_move = 0) if(!move_self) return 0 @@ -311,8 +318,7 @@ var/global/list/uneatable = list( last_failed_movement = movement_dir return 0 - -/obj/machinery/singularity/proc/check_turfs_in(var/direction = 0, var/step = 0) +/obj/singularity/proc/check_turfs_in(var/direction = 0, var/step = 0) if(!direction) return 0 var/steps = 0 @@ -328,6 +334,8 @@ var/global/list/uneatable = list( steps = 4 if(9) steps = 5 + if(11) + steps = 6 else steps = step var/list/turfs = list() @@ -364,38 +372,42 @@ var/global/list/uneatable = list( return 0 return 1 +/obj/singularity/proc/can_move(const/turf/T) + if (!isturf(T)) + return 0 -/obj/machinery/singularity/proc/can_move(var/turf/T) - if(!T) + if ((locate(/obj/machinery/containment_field) in T) || (locate(/obj/machinery/shieldwall) in T)) return 0 - if((locate(/obj/machinery/containment_field) in T)||(locate(/obj/machinery/shieldwall) in T)) - return 0 - else if(locate(/obj/machinery/field_generator) in T) + else if (locate(/obj/machinery/field_generator) in T) var/obj/machinery/field_generator/G = locate(/obj/machinery/field_generator) in T - if(G && G.active) + + if (G && G.active) return 0 - else if(locate(/obj/machinery/shieldwallgen) in T) + else if (locate(/obj/machinery/shieldwallgen) in T) var/obj/machinery/shieldwallgen/S = locate(/obj/machinery/shieldwallgen) in T - if(S && S.active) + + if (S && S.active) return 0 return 1 +/obj/singularity/proc/event() + var/numb = pick(1, 2, 3, 4, 5, 6) -/obj/machinery/singularity/proc/event() - var/numb = pick(1,2,3,4,5,6) - switch(numb) - if(1)//EMP + switch (numb) + if (1) //EMP. emp_area() - if(2,3)//tox damage all carbon mobs in area + if (2, 3) //Tox damage all carbon mobs in area. toxmob() - if(4)//Stun mobs who lack optic scanners + if (4) //Stun mobs who lack optic scanners. mezzer() else return 0 + if(current_size == 11) + smwave() return 1 -/obj/machinery/singularity/proc/toxmob() +/obj/singularity/proc/toxmob() var/toxrange = 10 var/toxdamage = 4 var/radiation = 15 @@ -405,165 +417,82 @@ var/global/list/uneatable = list( radiation = round(((src.energy-150)/50)*5,1) radiationmin = round((radiation/5),1)// for(var/mob/living/M in view(toxrange, src.loc)) + if(M.status_flags & GODMODE) + continue M.apply_effect(rand(radiationmin,radiation), IRRADIATE) toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) M.apply_effect(toxdamage, TOX) return -/obj/machinery/singularity/proc/mezzer() +/obj/singularity/proc/mezzer() for(var/mob/living/carbon/M in oviewers(8, src)) if(istype(M, /mob/living/carbon/brain)) //Ignore brains continue - + if(M.status_flags & GODMODE) + continue if(M.stat == CONSCIOUS) if (istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(istype(H.glasses,/obj/item/clothing/glasses/meson)) - H << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!" + if(istype(H.glasses,/obj/item/clothing/glasses/meson) && current_size != 11) + H << "You look directly into The [src.name], good thing you had your protective eyewear on!" return - M << "\red You look directly into The [src.name] and feel weak." + else + H << "You look directly into The [src.name], but your eyewear does absolutely nothing to protect you from it!" + M << "You look directly into The [src.name] and feel [current_size == 11 ? "helpless" : "weak"]." M.apply_effect(3, STUN) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] stares blankly at The []!", M, src), 1) - return + O.show_message(text("[] stares blankly at The []!", M, src), 1) - -/obj/machinery/singularity/proc/emp_area() - empulse(src, 8, 10) - return - - -/obj/machinery/singularity/proc/pulse() - - for(var/obj/machinery/power/rad_collector/R in rad_collectors) - if(get_dist(R, src) <= 15) // Better than using orange() every process - R.receive_pulse(energy) - return - - - -/obj/machinery/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO - name = "Nar-Sie" - desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees." - icon = 'icons/obj/magic_terror.dmi' - pixel_x = -89 - pixel_y = -85 - current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO - contained = 0 //Are we going to move around? - dissipate = 0 //Do we lose energy over time? - move_self = 1 //Do we move on our own? - grav_pull = 10 //How many tiles out do we pull? - consume_range = 3 //How many tiles out do we eat - var/last_boom = 0 - -/obj/machinery/singularity/narsie/large - name = "Nar-Sie" - icon = 'icons/obj/narsie.dmi' - // Pixel stuff centers Narsie. - pixel_x = -236 - pixel_y = -256 - current_size = 12 - move_self = 1 //Do we move on our own? - consume_range = 12 //How many tiles out do we eat - -/obj/machinery/singularity/narsie/large/New() - ..() - world << "NAR-SIE HAS RISEN" - if(emergency_shuttle && emergency_shuttle.can_call()) - emergency_shuttle.call_evac() - emergency_shuttle.launch_time = 0 // Cannot recall - -/obj/machinery/singularity/narsie/process() - eat() - if(!target || prob(5)) - pickcultist() - move() - if(prob(25)) - mezzer() - -/obj/machinery/singularity/narsie/consume(var/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO - if(is_type_in_list(A, uneatable)) - return 0 - if (istype(A,/mob/living))//Mobs get gibbed - A:gib() - else if(istype(A,/obj)) - var/obj/O = A - machines -= O - processing_objects -= O - O.loc = null - else if(isturf(A)) - var/turf/T = A - if(T.intact) - for(var/obj/O in T.contents) - if(O.level != 1) - continue - if(O.invisibility == 101) - src.consume(O) - A:ChangeTurf(/turf/space) - if(last_boom + 100 < world.time && prob(5)) - explosion(loc, -1, -1, -1, 1, 0) //Since we're not exploding everything in consume() toss out an explosion effect every now and again - last_boom = world.time - return - -/obj/machinery/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO - return - -/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO - var/list/cultists = list() - if(cult && cult.current_antagonists.len) - for(var/datum/mind/cult_nh_mind in cult.current_antagonists) - if(!cult_nh_mind.current) - continue - if(cult_nh_mind.current.stat) - continue - var/turf/pos = get_turf(cult_nh_mind.current) - if(pos.z != src.z) - continue - cultists += cult_nh_mind.current - if(cultists.len) - acquire(pick(cultists)) - return - //If there was living cultists, it picks one to follow. - for(var/mob/living/carbon/human/food in living_mob_list) - if(food.stat) - continue - var/turf/pos = get_turf(food) - if(pos.z != src.z) - continue - cultists += food - if(cultists.len) - acquire(pick(cultists)) - return - //no living cultists, pick a living human instead. - for(var/mob/dead/observer/ghost in player_list) - if(!ghost.client) - continue - var/turf/pos = get_turf(ghost) - if(pos.z != src.z) - continue - cultists += ghost - if(cultists.len) - acquire(pick(cultists)) - return - //no living humans, follow a ghost instead. - -/obj/machinery/singularity/narsie/proc/acquire(var/mob/food) - target << "\blue NAR-SIE HAS LOST INTEREST IN YOU" - target = food - if(ishuman(target)) - target << "\red NAR-SIE HUNGERS FOR YOUR SOUL" +/obj/singularity/proc/emp_area() + if(current_size != 11) + empulse(src, 8, 10) else - target << "\red NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL" + empulse(src, 12, 16) -//Wizard narsie - -/obj/machinery/singularity/narsie/wizard - grav_pull = 0 - -/obj/machinery/singularity/narsie/wizard/eat() - set background = 1 - for(var/atom/X in orange(consume_range,src)) - if(isturf(X) || istype(X, /atom/movable)) - consume(X) +/obj/singularity/proc/smwave() + for(var/mob/living/M in view(10, src.loc)) + if(prob(67)) + M.apply_effect(rand(energy), IRRADIATE) + M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." + M << "Miraculously, it fails to kill you." + else + M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." + M << "You don't even have a moment to react as you are reduced to ashes by the intense radiation." + M.dust() return + +/obj/singularity/proc/pulse() + for(var/obj/machinery/power/rad_collector/R in rad_collectors) + if (get_dist(R, src) <= 15) //Better than using orange() every process. + R.receive_pulse(energy) + +/obj/singularity/proc/on_capture() + chained = 1 + overlays = 0 + move_self = 0 + switch (current_size) + if(1) + overlays += image('icons/obj/singularity.dmi',"chain_s1") + if(3) + overlays += image('icons/effects/96x96.dmi',"chain_s3") + if(5) + overlays += image('icons/effects/160x160.dmi',"chain_s5") + if(7) + overlays += image('icons/effects/224x224.dmi',"chain_s7") + if(9) + overlays += image('icons/effects/288x288.dmi',"chain_s9") + +/obj/singularity/proc/on_release() + chained = 0 + overlays = 0 + move_self = 1 + +/obj/singularity/singularity_act(S, size) + if(current_size <= size) + var/gain = (energy/2) + var/dist = max((current_size - 2), 1) + explosion(src.loc,(dist),(dist*2),(dist*4)) + spawn(0) + qdel(src) + return gain diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 4fdcbe811f..e42c5289b7 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -83,6 +83,12 @@ return + +/obj/machinery/power/smes/Destroy() + if(terminal) + disconnect_terminal() + ..() + /obj/machinery/power/smes/update_icon() overlays.Cut() if(stat & BROKEN) return @@ -281,7 +287,7 @@ user.visible_message(\ "[user.name] cut the cables and dismantled the power terminal.",\ "You cut the cables and dismantle the power terminal.") - del(terminal) + qdel(terminal) building_terminal = 0 return 0 return 1 @@ -374,7 +380,7 @@ smoke.attach(src) smoke.start() explosion(src.loc, -1, 0, 1, 3, 1, 0) - del(src) + qdel(src) return if(prob(15)) //Power drain var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 3fe4f511eb..b2e584c136 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -258,7 +258,7 @@ src.ping("DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...") explosion(src.loc,1,2,4,8) // Not sure if this is necessary, but just in case the SMES *somehow* survived.. - del(src) + qdel(src) @@ -345,7 +345,7 @@ if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = src.loc - del(src) + qdel(src) return // Superconducting Magnetic Coil - Upgrade the SMES diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 28eaf27619..6bdef2c273 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -30,7 +30,7 @@ var/list/solars_list = list() Make(S) connect_to_network() -/obj/machinery/power/solar/Del() +/obj/machinery/power/solar/Destroy() unset_control() //remove from control computer ..() @@ -71,7 +71,7 @@ var/list/solars_list = list() S.give_glass() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] takes the glass off the solar panel.") - del(src) // qdel + qdel(src) return else if (W) src.add_fingerprint(user) @@ -93,7 +93,7 @@ var/list/solars_list = list() else new /obj/item/weapon/shard(src.loc) new /obj/item/weapon/shard(src.loc) - del(src) // qdel + qdel(src) return return @@ -154,13 +154,13 @@ var/list/solars_list = list() if(1.0) if(prob(15)) new /obj/item/weapon/shard( src.loc ) - del(src) // qdel + qdel(src) return if(2.0) if (prob(25)) new /obj/item/weapon/shard( src.loc ) - del(src) // qdel + qdel(src) return if (prob(50)) @@ -270,7 +270,7 @@ var/list/solars_list = list() if(istype(W, /obj/item/weapon/tracker_electronics)) tracker = 1 user.drop_item() - del(W) // qdel + qdel(W) user.visible_message("[user] inserts the electronics into the solar assembly.") return 1 else @@ -308,13 +308,7 @@ var/list/solars_list = list() /obj/machinery/power/solar_control/drain_power() return -1 -/obj/machinery/power/solar_control/New() - ..() - if(ticker) - initialize() - connect_to_network() - -/obj/machinery/power/solar_control/Del() +/obj/machinery/power/solar_control/Destroy() for(var/obj/machinery/power/solar/M in connected_panels) M.unset_control() if(connected_tracker) @@ -368,6 +362,7 @@ var/list/solars_list = list() ..() if(!powernet) return set_panels(cdir) + connect_to_network() /obj/machinery/power/solar_control/update_icon() if(stat & BROKEN) @@ -433,7 +428,7 @@ var/list/solars_list = list() A.state = 3 A.icon_state = "3" A.anchored = 1 - del(src) // qdel + qdel(src) else user << "\blue You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) @@ -444,7 +439,7 @@ var/list/solars_list = list() A.state = 4 A.icon_state = "4" A.anchored = 1 - del(src) // qdel + qdel(src) else src.attack_hand(user) return @@ -534,7 +529,7 @@ var/list/solars_list = list() switch(severity) if(1.0) //SN src = null - del(src) // qdel + qdel(src) return if(2.0) if (prob(50)) diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index feec0e3f81..24245f00e4 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -20,7 +20,7 @@ if(level==1) hide(T.intact) return -/obj/machinery/power/terminal/Del() +/obj/machinery/power/terminal/Destroy() if(master) master.disconnect_terminal() return ..() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 38824dec5d..ea572a2b97 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -21,7 +21,7 @@ Make(S) connect_to_network() -/obj/machinery/power/tracker/Del() +/obj/machinery/power/tracker/Destroy() unset_control() //remove from control computer ..() @@ -69,7 +69,7 @@ S.give_glass() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] takes the glass off the tracker.") - del(src) // qdel + qdel(src) return ..() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 9708656d3b..10d6d8238d 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -243,7 +243,7 @@ A.state = 3 A.icon_state = "3" A.anchored = 1 - del(src) + qdel(src) else user << "\blue You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) @@ -255,7 +255,7 @@ A.state = 4 A.icon_state = "4" A.anchored = 1 - del(src) + qdel(src) else src.attack_hand(user) return diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index e25d8f39f1..eb2e6f1c1d 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -40,6 +40,10 @@ name = "magazine (.45 rubber)" ammo_type = /obj/item/ammo_casing/c45r +/obj/item/ammo_magazine/c45m/practice + name = "magazine (.45 practice)" + ammo_type = /obj/item/ammo_casing/c45p + /obj/item/ammo_magazine/c45m/flash name = "magazine (.45 flash)" ammo_type = "/obj/item/ammo_casing/c45f" @@ -90,6 +94,10 @@ name = "top mounted magazine (9mm rubber)" ammo_type = /obj/item/ammo_casing/c9mmr +/obj/item/ammo_magazine/mc9mmt/practice + name = "top mounted magazine (9mm practice)" + ammo_type = /obj/item/ammo_casing/c9mmp + /obj/item/ammo_magazine/c45 name = "ammunition Box (.45)" icon_state = "9mm" @@ -130,6 +138,10 @@ /obj/item/ammo_magazine/a556/empty initial_ammo = 0 +/obj/item/ammo_magazine/a556/practice + name = "magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556p + /obj/item/ammo_magazine/a50 name = "magazine (.50)" icon_state = "50ae" diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 931555381a..a07e5735c0 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -38,12 +38,22 @@ caliber = "9mm" projectile_type = /obj/item/projectile/bullet/pistol/rubber +/obj/item/ammo_casing/c9mmp + desc = "A 9mm practice bullet casing." + caliber = "9mm" + projectile_type = /obj/item/projectile/bullet/pistol/practice + /obj/item/ammo_casing/c45 desc = "A .45 bullet casing." caliber = ".45" projectile_type = /obj/item/projectile/bullet/pistol/medium +/obj/item/ammo_casing/c45p + desc = "A .45 practice bullet casing." + caliber = ".45" + projectile_type = /obj/item/projectile/bullet/pistol/practice + /obj/item/ammo_casing/c45r desc = "A .45 rubber bullet casing." caliber = ".45" @@ -82,6 +92,13 @@ projectile_type = /obj/item/projectile/bullet/blank matter = list("metal" = 90) +/obj/item/ammo_casing/shotgun/practice + name = "shotgun shell" + desc = "A practice shell." + icon_state = "pshell" + projectile_type = /obj/item/projectile/bullet/shotgun/practice + matter = list("metal" = 90) + /obj/item/ammo_casing/shotgun/beanbag name = "beanbag shell" desc = "A beanbag shell." @@ -130,6 +147,11 @@ caliber = "a556" projectile_type = /obj/item/projectile/bullet/rifle/a556 +/obj/item/ammo_casing/a556p + desc = "A 5.56mm practice bullet casing." + caliber = "a556" + projectile_type = /obj/item/projectile/bullet/rifle/a556/practice + /obj/item/ammo_casing/rocket name = "rocket shell" desc = "A high explosive designed to be fired from a launcher." diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm index 066f4cf55d..d765e353da 100644 --- a/code/modules/projectiles/effects.dm +++ b/code/modules/projectiles/effects.dm @@ -13,7 +13,7 @@ /obj/effect/projectile/proc/activate() spawn(3) - delete() //see effect_system.dm - sets loc to null and lets GC handle removing these effects + qdel(src) //see effect_system.dm - sets loc to null and lets GC handle removing these effects return @@ -100,13 +100,13 @@ //---------------------------- /obj/effect/projectile/emitter/tracer icon_state = "emitter" - + /obj/effect/projectile/emitter/muzzle icon_state = "muzzle_emitter" - + /obj/effect/projectile/emitter/impact icon_state = "impact_emitter" - + //---------------------------- // Stun beam //---------------------------- diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b0095ead05..5a1eaefcbb 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,11 +1,41 @@ +/* + Defines a firing mode for a gun. + + burst number of shots fired when the gun is used + burst_delay tick delay between shots in a burst + fire_delay tick delay after the last shot before the gun may be used again + move_delay tick delay after the last shot before the player may move + dispersion dispersion of each shot in the burst measured in tiles per 7 tiles angle ratio + accuracy accuracy modifier applied to each shot in tiles. + applied on top of the base weapon accuracy. +*/ +/datum/firemode + var/name = "default" + var/burst = 1 + var/burst_delay = null + var/fire_delay = null + var/move_delay = 1 + var/list/accuracy = list(0) + var/list/dispersion = list(0) + +//using a list makes defining fire modes for new guns much nicer, +//however we convert the lists to datums in part so that firemodes can be VVed if necessary. +/datum/firemode/New(list/properties = null) + ..() + if(!properties) return + + for(var/propname in vars) + if(!isnull(properties[propname])) + src.vars[propname] = properties[propname] + //Parent gun type. Guns are weapons that can be aimed at mobs and act over a distance /obj/item/weapon/gun name = "gun" desc = "Its a gun. It's pretty terrible, though." icon = 'icons/obj/gun.dmi' item_icons = list( - icon_l_hand = 'icons/mob/items/lefthand_guns.dmi', - icon_r_hand = 'icons/mob/items/righthand_guns.dmi', + slot_l_hand_str = 'icons/mob/items/lefthand_guns.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_guns.dmi', ) icon_state = "detective" item_state = "gun" @@ -21,16 +51,21 @@ attack_verb = list("struck", "hit", "bashed") zoomdevicename = "scope" - var/fire_delay = 6 + var/fire_delay = 6 //delay after shooting before the gun can be used again + var/burst_delay = 2 //delay between shots, if firing in bursts var/fire_sound = 'sound/weapons/Gunshot.ogg' var/fire_sound_text = "gunshot" var/recoil = 0 //screen shake var/silenced = 0 - var/accuracy = 0 //accuracy is measured in tiles. +1 accuracy means that everything is effectively one tile closer for the purpose of miss chance, -1 means the opposite. launchers are not supported, at the moment. + var/accuracy = 0 //accuracy is measured in tiles. +1 accuracy means that everything is effectively one tile closer for the purpose of miss chance, -1 means the opposite. launchers are not supported, at the moment. var/scoped_accuracy = null - var/last_fired = 0 - + var/next_fire_time = 0 + + var/sel_mode = 1 //index of the currently selected mode + var/list/firemodes = list() + var/firemode_type = /datum/firemode //for subtypes that need custom firemode data + //aiming system stuff var/keep_aim = 1 //1 for keep shooting until aim is lowered //0 for one bullet after tarrget moves and aim is lowered @@ -42,17 +77,15 @@ /obj/item/weapon/gun/New() ..() + if(!firemodes.len) + firemodes += new firemode_type + else + for(var/i in 1 to firemodes.len) + firemodes[i] = new firemode_type(firemodes[i]) + if(isnull(scoped_accuracy)) scoped_accuracy = accuracy -//Returns 1 if the gun is able to be fired -/obj/item/weapon/gun/proc/ready_to_fire() - if(world.time >= last_fired + fire_delay) - last_fired = world.time - return 1 - else - return 0 - //Checks whether a given mob can use the gun //Any checks that shouldn't result in handle_click_empty() being called if they fail should go here. //Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there. @@ -61,9 +94,9 @@ return 0 if(!user.IsAdvancedToolUser()) return 0 - + var/mob/living/M = user - + if(HULK in M.mutations) M << "Your fingers are much too large for the trigger guard!" return 0 @@ -73,14 +106,14 @@ if(process_projectile(P, user, user, pick("l_foot", "r_foot"))) handle_post_fire(user, user) user.visible_message( - "[user] shoots \himself in the foot with \the [src]!", + "[user] shoots \himself in the foot with \the [src]!", "You shoot yourself in the foot with \the [src]!" ) M.drop_item() else handle_click_empty(user) return 0 - return 1 + return 1 /obj/item/weapon/gun/emp_act(severity) for(var/obj/O in contents) @@ -112,9 +145,9 @@ else if(user.a_intent == I_HURT) //point blank shooting Fire(A, user, pointblank=1) else - return ..() //Pistolwhippin' + return ..() //Pistolwhippin' -/obj/item/weapon/gun/proc/Fire(atom/target, mob/living/user, params, pointblank=0, reflex=0) +/obj/item/weapon/gun/proc/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0) if(!user || !target) return add_fingerprint(user) @@ -122,24 +155,55 @@ if(!special_check(user)) return - if (!ready_to_fire()) + if(world.time < next_fire_time) if (world.time % 3) //to prevent spam - user << "[src] is not ready to fire again!" + user << "[src] is not ready to fire again!" return - var/obj/projectile = consume_next_projectile(user) - if(!projectile) - handle_click_empty(user) - return + //unpack firemode data + var/datum/firemode/firemode = firemodes[sel_mode] + var/_burst = firemode.burst + var/_burst_delay = isnull(firemode.burst_delay)? src.burst_delay : firemode.burst_delay + var/_fire_delay = isnull(firemode.fire_delay)? src.fire_delay : firemode.fire_delay + var/_move_delay = firemode.move_delay + var/shoot_time = (_burst - 1)*_burst_delay + user.next_move = world.time + shoot_time //no clicking on things while shooting + if(user.client) user.client.move_delay = world.time + shoot_time //no moving while shooting either + next_fire_time = world.time + shoot_time + + //actually attempt to shoot + var/turf/targloc = get_turf(target) //cache this in case target gets deleted during shooting, e.g. if it was a securitron that got destroyed. + for(var/i in 1 to _burst) + var/obj/projectile = consume_next_projectile(user) + if(!projectile) + handle_click_empty(user) + break + + var/acc = firemode.accuracy[min(i, firemode.accuracy.len)] + var/disp = firemode.dispersion[min(i, firemode.dispersion.len)] + process_accuracy(projectile, user, target, acc, disp) + + if(pointblank) + process_point_blank(projectile, user, target) + + if(process_projectile(projectile, user, target, user.zone_sel.selecting, clickparams)) + handle_post_fire(user, target, pointblank, reflex) + update_icon() + + if(i < _burst) + sleep(_burst_delay) + + if(!(target && target.loc)) + target = targloc + pointblank = 0 + + update_held_icon() + + //update timing user.next_move = world.time + 4 - - if(process_projectile(projectile, user, target, user.zone_sel.selecting, params, pointblank, reflex)) - handle_post_fire(user, target, pointblank, reflex) - - update_icon() - update_held_icon() - + if(user.client) user.client.move_delay = world.time + _move_delay + next_fire_time = world.time + _fire_delay //obtains the next projectile to fire /obj/item/weapon/gun/proc/consume_next_projectile() @@ -149,7 +213,7 @@ /obj/item/weapon/gun/proc/can_hit(atom/target as mob, var/mob/living/user as mob) if(!special_check(user)) return 2 - //just assume we can shoot through glass and stuff. No big deal, the player can just choose to not target someone + //just assume we can shoot through glass and stuff. No big deal, the player can just choose to not target someone //on the other side of a window if it makes a difference. Or if they run behind a window, too bad. return check_trajectory(target, user) @@ -167,33 +231,73 @@ playsound(user, fire_sound, 10, 1) else playsound(user, fire_sound, 50, 1) - + if(reflex) user.visible_message( - "[user] fires [src][pointblank ? " point blank at [target]":""] by reflex!", - "You fire [src] by reflex]!", + "\The [user] fires \the [src][pointblank ? " point blank at \the [target]":""] by reflex!", + "You fire \the [src] by reflex!", "You hear a [fire_sound_text]!" ) else user.visible_message( - "[user] fires [src][pointblank ? " point blank at [target]":""]!", - "You fire [src]!", + "\The [user] fires \the [src][pointblank ? " point blank at \the [target]":""]!", + "You fire \the [src]!", "You hear a [fire_sound_text]!" ) - + if(recoil) spawn() shake_camera(user, recoil+1, recoil) update_icon() -//does the actual shooting -/obj/item/weapon/gun/proc/process_projectile(obj/projectile, mob/user, atom/target, var/target_zone, var/params=null, var/pointblank=0, var/reflex=0) - if(!istype(projectile, /obj/item/projectile)) - return 0 //default behaviour only applies to true projectiles - + +/obj/item/weapon/gun/proc/process_point_blank(obj/projectile, mob/user, atom/target) var/obj/item/projectile/P = projectile - - //shooting while in shock + if(!istype(P)) + return //default behaviour only applies to true projectiles + + //default point blank multiplier + var/damage_mult = 1.3 + + //determine multiplier due to the target being grabbed + if(ismob(target)) + var/mob/M = target + if(M.grabbed_by.len) + var/grabstate = 0 + for(var/obj/item/weapon/grab/G in M.grabbed_by) + grabstate = max(grabstate, G.state) + if(grabstate >= GRAB_NECK) + damage_mult = 3.0 + else if(grabstate >= GRAB_AGGRESSIVE) + damage_mult = 1.5 + P.damage *= damage_mult + +/obj/item/weapon/gun/proc/process_accuracy(obj/projectile, mob/user, atom/target, acc_mod, dispersion) + var/obj/item/projectile/P = projectile + if(!istype(P)) + return //default behaviour only applies to true projectiles + + //Accuracy modifiers + P.accuracy = accuracy + acc_mod + P.dispersion = dispersion + + //accuracy bonus from aiming + if (aim_targets && (target in aim_targets)) + //If you aim at someone beforehead, it'll hit more often. + //Kinda balanced by fact you need like 2 seconds to aim + //As opposed to no-delay pew pew + P.accuracy += 2 + +//does the actual launching of the projectile +/obj/item/weapon/gun/proc/process_projectile(obj/projectile, mob/user, atom/target, var/target_zone, var/params=null) + var/obj/item/projectile/P = projectile + if(!istype(P)) + return 0 //default behaviour only applies to true projectiles + + if(params) + P.set_clickpoint(params) + + //shooting while in shock var/x_offset = 0 var/y_offset = 0 if(istype(user, /mob/living/carbon)) @@ -205,27 +309,6 @@ y_offset = rand(-1,1) x_offset = rand(-1,1) - //Point blank bonus - if(pointblank) - var/damage_mult = 1.3 //default point blank multiplier - - //determine multiplier due to the target being grabbed - if(ismob(target)) - var/mob/M = target - if(M.grabbed_by.len) - var/grabstate = 0 - for(var/obj/item/weapon/grab/G in M.grabbed_by) - grabstate = max(grabstate, G.state) - if(grabstate >= GRAB_NECK) - damage_mult = 3.0 - else if (grabstate >= GRAB_AGGRESSIVE) - damage_mult = 1.5 - - P.damage *= damage_mult - - if(params) - P.set_clickpoint(params) - return !P.launch(target, user, src, target_zone, x_offset, y_offset) //Suicide handling. @@ -234,7 +317,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/M = user - + mouthshoot = 1 M.visible_message("\red [user] sticks their gun in their mouth, ready to pull the trigger...") if(!do_after(user, 40)) @@ -260,13 +343,13 @@ else user << "Ow..." user.apply_effect(110,AGONY,0) - del(in_chamber) + qdel(in_chamber) mouthshoot = 0 return else handle_click_empty(user) mouthshoot = 0 - return + return /obj/item/weapon/gun/proc/toggle_scope(var/zoom_amount=2.0) //looking through a scope limits your periphereal vision @@ -274,7 +357,7 @@ var/zoom_offset = round(world.view * zoom_amount) var/view_size = round(world.view + zoom_amount) var/scoped_accuracy_mod = zoom_offset - + zoom(zoom_offset, view_size) if(zoom) accuracy = scoped_accuracy + scoped_accuracy_mod @@ -287,3 +370,21 @@ if(!zoom) accuracy = initial(accuracy) recoil = initial(recoil) + +/obj/item/weapon/gun/examine(mob/user) + ..() + if(firemodes.len > 1) + var/datum/firemode/current_mode = firemodes[sel_mode] + user << "The fire selector is set to [current_mode.name]." + +/obj/item/weapon/gun/proc/switch_firemodes(mob/user=null) + sel_mode++ + if(sel_mode > firemodes.len) + sel_mode = 1 + var/datum/firemode/new_mode = firemodes[sel_mode] + user << "\The [src] is now set to [new_mode.name]." + +/obj/item/weapon/gun/attack_self(mob/user) + if(firemodes.len > 1) + switch_firemodes(user) + diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 9f611e593d..ff9edcabfc 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -20,7 +20,7 @@ processing_objects.Add(src) last_regen = world.time -/obj/item/weapon/gun/launcher/spikethrower/Del() +/obj/item/weapon/gun/launcher/spikethrower/Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 994256b12a..f8abde2f95 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -1,9 +1,16 @@ +/datum/firemode/energy + var/projectile_type = null + var/modifystate = null + var/charge_cost = null + var/fire_sound = null + /obj/item/weapon/gun/energy name = "energy gun" desc = "A basic energy-based gun." icon_state = "energy" fire_sound = 'sound/weapons/Taser.ogg' fire_sound_text = "laser blast" + firemode_type = /datum/firemode/energy var/obj/item/weapon/cell/power_supply //What type of power cell this uses var/charge_cost = 100 //How much energy is needed to fire. @@ -18,6 +25,18 @@ var/recharge_time = 4 var/charge_tick = 0 +/obj/item/weapon/gun/energy/switch_firemodes(mob/user=null) + ..() + var/datum/firemode/energy/current_mode = firemodes[sel_mode] + if(istype(current_mode)) + projectile_type = isnull(current_mode.projectile_type)? initial(projectile_type) : current_mode.projectile_type + modifystate = isnull(current_mode.modifystate)? initial(modifystate) : current_mode.modifystate + charge_cost = isnull(current_mode.charge_cost)? initial(charge_cost) : current_mode.charge_cost + fire_sound = isnull(current_mode.fire_sound)? initial(fire_sound) : current_mode.fire_sound + + update_icon() + update_held_icon() + /obj/item/weapon/gun/energy/emp_act(severity) ..() update_icon() @@ -31,7 +50,7 @@ processing_objects.Add(src) update_icon() -/obj/item/weapon/gun/energy/Del() +/obj/item/weapon/gun/energy/Destroy() if(self_recharge) processing_objects.Remove(src) ..() diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 6b9f6f0d51..1e6d22a510 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -10,26 +10,10 @@ origin_tech = "combat=3;magnets=2" modifystate = "energystun" - var/mode = 0 //0 = stun, 1 = kill - -/obj/item/weapon/gun/energy/gun/attack_self(mob/living/user as mob) - switch(mode) - if(0) - mode = 1 - charge_cost = 100 - fire_sound = 'sound/weapons/Laser.ogg' - user << "[src.name] is now set to kill." - projectile_type = /obj/item/projectile/beam - modifystate = "energykill" - if(1) - mode = 0 - charge_cost = 100 - fire_sound = 'sound/weapons/Taser.ogg' - user << "[src.name] is now set to stun." - projectile_type = /obj/item/projectile/beam/stun - modifystate = "energystun" - update_icon() - update_held_icon() + firemodes = list( + list(name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="energystun", fire_sound='sound/weapons/Taser.ogg'), + list(name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", fire_sound='sound/weapons/Laser.ogg'), + ) /obj/item/weapon/gun/energy/gun/mounted name = "mounted energy gun" @@ -43,7 +27,14 @@ origin_tech = "combat=3;materials=5;powerstorage=3" slot_flags = SLOT_BELT force = 8 //looks heavier than a pistol - self_recharge = 1 + self_recharge = 1 + modifystate = null + + firemodes = list( + list(name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'), + list(name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'), + ) + var/lightfail = 0 //override for failcheck behaviour @@ -101,10 +92,10 @@ overlays += "nucgun-clean" /obj/item/weapon/gun/energy/gun/nuclear/proc/update_mode() - if (mode == 0) - overlays += "nucgun-stun" - else if (mode == 1) - overlays += "nucgun-kill" + var/datum/firemode/current_mode = firemodes[sel_mode] + switch(current_mode.name) + if("stun") overlays += "nucgun-stun" + if("lethal") overlays += "nucgun-kill" /obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity) ..() diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 82ab47438b..62c77cf4f3 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -5,33 +5,16 @@ item_state = null //so the human update icon uses the icon_state instead. slot_flags = SLOT_BELT|SLOT_BACK force = 10 - fire_sound = 'sound/weapons/pulse.ogg' - charge_cost = 200 - projectile_type = /obj/item/projectile/beam/pulse - cell_type = /obj/item/weapon/cell/super - var/mode = 2 - fire_delay = 25 - -/obj/item/weapon/gun/energy/pulse_rifle/attack_self(mob/living/user as mob) - switch(mode) - if(2) - mode = 0 - charge_cost = 100 - fire_sound = 'sound/weapons/Taser.ogg' - user << "[src.name] is now set to stun." - projectile_type = /obj/item/projectile/beam/stun - if(0) - mode = 1 - charge_cost = 100 - fire_sound = 'sound/weapons/Laser.ogg' - user << "[src.name] is now set to kill." - projectile_type = /obj/item/projectile/beam - if(1) - mode = 2 - charge_cost = 200 - fire_sound = 'sound/weapons/pulse.ogg' - user << "[src.name] is now set to DESTROY." - projectile_type = /obj/item/projectile/beam/pulse + fire_sound='sound/weapons/Laser.ogg' + charge_cost = 50 + projectile_type = /obj/item/projectile/beam + sel_mode = 2 + + firemodes = list( + list(name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'), + list(name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'), + list(name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/pulse.ogg', fire_delay=25, charge_cost=100), + ) /obj/item/weapon/gun/energy/pulse_rifle/mounted self_recharge = 1 @@ -40,12 +23,13 @@ /obj/item/weapon/gun/energy/pulse_rifle/destroyer name = "pulse destroyer" desc = "A heavy-duty, pulse-based energy weapon. Because of its complexity and cost, it is rarely seen in use except by specialists." - cell_type = /obj/item/weapon/cell/infinite - fire_delay = 10 + cell_type = /obj/item/weapon/cell/super + fire_delay = 25 + fire_sound='sound/weapons/pulse.ogg' + projectile_type=/obj/item/projectile/beam/pulse /obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob) - user << "[src.name] has three settings, and they are all DESTROY." - + user << "[src.name] has three settings, and they are all DESTROY." //WHY? /obj/item/weapon/gun/energy/pulse_rifle/M1911 @@ -53,5 +37,4 @@ desc = "It's not the size of the gun, it's the size of the hole it puts through people." slot_flags = SLOT_BELT|SLOT_HOLSTER icon_state = "m1911-p" - cell_type = /obj/item/weapon/cell/infinite - fire_delay = 10 + cell_type = /obj/item/weapon/cell/crap diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index c7f74e1d95..5525c25bbf 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -43,24 +43,11 @@ origin_tech = "materials=2;biotech=3;powerstorage=3" modifystate = "floramut" self_recharge = 1 - var/mode = 0 //0 = mutate, 1 = yield boost -/obj/item/weapon/gun/energy/floragun/attack_self(mob/living/user as mob) - switch(mode) - if(0) - mode = 1 - charge_cost = 100 - user << "The [src.name] is now set to increase yield." - projectile_type = /obj/item/projectile/energy/florayield - modifystate = "florayield" - if(1) - mode = 0 - charge_cost = 100 - user << "The [src.name] is now set to induce mutations." - projectile_type = /obj/item/projectile/energy/floramut - modifystate = "floramut" - update_icon() - update_held_icon() + firemodes = list( + list(name="induce mutations", projectile_type=/obj/item/projectile/energy/floramut, modifystate="floramut"), + list(name="increase yield", projectile_type=/obj/item/projectile/energy/florayield, modifystate="florayield"), + ) /obj/item/weapon/gun/energy/floragun/afterattack(obj/target, mob/user, adjacent_flag) //allow shooting into adjacent hydrotrays regardless of intent diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index b836d265cc..47bc2cfc00 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -18,7 +18,7 @@ processing_objects.Add(src) -/obj/item/weapon/gun/energy/temperature/Del() +/obj/item/weapon/gun/energy/temperature/Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/projectiles/guns/launcher.dm b/code/modules/projectiles/guns/launcher.dm index 98b09e12c7..29971e6b60 100644 --- a/code/modules/projectiles/guns/launcher.dm +++ b/code/modules/projectiles/guns/launcher.dm @@ -26,6 +26,3 @@ projectile.loc = get_turf(user) projectile.throw_at(target, throw_distance, release_force, user) return 1 - -/obj/item/weapon/gun/launcher/attack_self(mob/living/user as mob) - return diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index 917d3c338e..4736fc0c7b 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -43,7 +43,7 @@ user << "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow." var/obj/item/weapon/shard/shrapnel/S = new() S.loc = get_turf(src) - src.Del() + qdel(src) /obj/item/weapon/gun/launcher/crossbow name = "powered crossbow" @@ -257,7 +257,7 @@ if(buildstate == 5) user << "\blue You secure the crossbow's various parts." new /obj/item/weapon/gun/launcher/crossbow(get_turf(src)) - del(src) + qdel(src) return else ..() diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index b1a0f563df..863d3348e5 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -150,7 +150,7 @@ if(istype(W,/obj/item/pipe)) if(buildstate == 0) user.drop_item() - del(W) + qdel(W) user << "\blue You secure the piping inside the frame." buildstate++ update_icon() @@ -168,7 +168,7 @@ else if(istype(W,/obj/item/device/transfer_valve)) if(buildstate == 4) user.drop_item() - del(W) + qdel(W) user << "\blue You install the transfer valve and connect it to the piping." buildstate++ update_icon() @@ -197,7 +197,7 @@ playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) user << "\blue You weld the valve into place." new /obj/item/weapon/gun/launcher/pneumatic(get_turf(src)) - del(src) + qdel(src) return else ..() diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 944a9fe99f..31ea6b0335 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -165,7 +165,10 @@ load_ammo(A, user) /obj/item/weapon/gun/projectile/attack_self(mob/user as mob) - unload_ammo(user) + if(firemodes.len > 1) + switch_firemodes(user) + else + unload_ammo(user) /obj/item/weapon/gun/projectile/attack_hand(mob/user as mob) if(user.get_inactive_hand() == src) @@ -189,9 +192,9 @@ /obj/item/weapon/gun/projectile/examine(mob/user) ..(user) - user << "Has [getAmmo()] round\s remaining." if(ammo_magazine) user << "It has \a [ammo_magazine] loaded." + user << "Has [getAmmo()] round\s remaining." return /obj/item/weapon/gun/projectile/proc/getAmmo() @@ -203,3 +206,15 @@ if(chambered) bullets += 1 return bullets + +/* Unneeded -- so far. +//in case the weapon has firemodes and can't unload using attack_hand() +/obj/item/weapon/gun/projectile/verb/unload_gun() + set name = "Unload Ammo" + set category = "Object" + set src in usr + + if(usr.stat || usr.restrained()) return + + unload_ammo(usr) +*/ \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index ee7bfbffff..2ad17537c2 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -10,7 +10,12 @@ slot_flags = SLOT_BELT ammo_type = /obj/item/ammo_casing/c9mm multi_aim = 1 - fire_delay = 0 + + firemodes = list( + list(name="semiauto", burst=1, fire_delay=0), + list(name="3-round bursts", burst=3, move_delay=4, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.0, 0.6, 1.0)), + list(name="short bursts", burst=5, move_delay=4, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)), + ) /obj/item/weapon/gun/projectile/automatic/mini_uzi name = "\improper Uzi" @@ -59,6 +64,12 @@ slot_flags = SLOT_BACK load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/c762 + + firemodes = list( + list(name="semiauto", burst=1, fire_delay=0), + list(name="3-round bursts", burst=3, move_delay=6, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.0, 0.6, 0.6)), + list(name="short bursts", burst=5, move_delay=6, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)), + ) /obj/item/weapon/gun/projectile/automatic/sts35/update_icon() ..() @@ -87,6 +98,9 @@ icon_state = "wt550" return +/datum/firemode/z8 + var/use_launcher = 0 + /obj/item/weapon/gun/projectile/automatic/z8 name = "\improper Z8 Bulldog" desc = "An older model bullpup carbine, made by the now defunct Zendai Foundries. Uses armor piercing 5.56mm rounds. Makes you feel like a space marine when you hold it." @@ -104,17 +118,20 @@ auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' - var/use_launcher = 0 + burst_delay = 4 + firemode_type = /datum/firemode/z8 + firemodes = list( + list(name="semiauto", burst=1, fire_delay=0), + list(name="3-round bursts", burst=3, move_delay=6, accuracy = list(0,-1,-1), dispersion = list(0.0, 0.6, 0.6)), + list(name="fire grenades", use_launcher=1) + ) + var/obj/item/weapon/gun/launcher/grenade/underslung/launcher /obj/item/weapon/gun/projectile/automatic/z8/New() ..() launcher = new(src) -/obj/item/weapon/gun/projectile/automatic/z8/attack_self(mob/user) - use_launcher = !use_launcher - user << "You switch to [use_launcher? "\the [launcher]" : "firing normally"]." - /obj/item/weapon/gun/projectile/automatic/z8/attackby(obj/item/I, mob/user) if((istype(I, /obj/item/weapon/grenade))) launcher.load(I, user) @@ -122,16 +139,18 @@ ..() /obj/item/weapon/gun/projectile/automatic/z8/attack_hand(mob/user) - if(user.get_inactive_hand() == src && use_launcher) + var/datum/firemode/z8/current_mode = firemodes[sel_mode] + if(user.get_inactive_hand() == src && current_mode.use_launcher) launcher.unload(user) else ..() /obj/item/weapon/gun/projectile/automatic/z8/Fire(atom/target, mob/living/user, params, pointblank=0, reflex=0) - if(use_launcher) + var/datum/firemode/z8/current_mode = firemodes[sel_mode] + if(current_mode.use_launcher) launcher.Fire(target, user, params, pointblank, reflex) if(!launcher.chambered) - use_launcher = 0 //switch back automatically + switch_firemodes() //switch back automatically else ..() @@ -166,22 +185,40 @@ fire_sound = 'sound/weapons/Gunshot_smg.ogg' load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/a762 + + firemodes = list( + list(name="short bursts", burst=5, move_delay=6, accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)), + list(name="long bursts", burst=8, move_delay=8, accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2)), + ) + var/cover_open = 0 -/obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) - cover_open = !cover_open - user << "You [cover_open ? "open" : "close"] [src]'s cover." - update_icon() - -/obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() - icon_state = "l6[cover_open ? "open" : "closed"][ammo_magazine ? round(ammo_magazine.stored_ammo.len, 25) : "-empty"]" - /obj/item/weapon/gun/projectile/automatic/l6_saw/special_check(mob/user) if(cover_open) user << "[src]'s cover is open! Close it before firing!" return 0 return ..() +/obj/item/weapon/gun/projectile/automatic/l6_saw/proc/toggle_cover(mob/user) + cover_open = !cover_open + user << "You [cover_open ? "open" : "close"] [src]'s cover." + update_icon() + +/obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) + if(cover_open) + toggle_cover(user) //close the cover + else + return ..() //once closed, behave like normal + +/obj/item/weapon/gun/projectile/automatic/l6_saw/attack_hand(mob/user as mob) + if(!cover_open && user.get_inactive_hand() == src) + toggle_cover(user) //open the cover + else + return ..() //once open, behave like normal + +/obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() + icon_state = "l6[cover_open ? "open" : "closed"][ammo_magazine ? round(ammo_magazine.stored_ammo.len, 25) : "-empty"]" + /obj/item/weapon/gun/projectile/automatic/l6_saw/load_ammo(var/obj/item/A, mob/user) if(!cover_open) user << "You need to open the cover to load [src]." @@ -190,5 +227,6 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/unload_ammo(mob/user, var/allow_dump=1) if(!cover_open) + user << "You need to open the cover to unload [src]." return ..() diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index cf05a005ed..e6a81c7057 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -27,7 +27,7 @@ projectile_type = /obj/item/projectile/bullet/chemdart /obj/item/ammo_casing/chemdart/expend() - del(src) + qdel(src) /obj/item/ammo_magazine/chemdart name = "dart cartridge" diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index b29f2f3e42..2c116901ec 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -8,7 +8,7 @@ load_method = MAGAZINE /obj/item/weapon/gun/projectile/colt/detective - desc = "A cheap Martian knock-off of a Colt M1911. Uses less-than-lethal .45 rounds." + desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds." magazine_type = /obj/item/ammo_magazine/c45m/rubber /obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun() @@ -30,7 +30,7 @@ return 1 /obj/item/weapon/gun/projectile/sec - desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses less-than-lethal .45 rounds." + desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 rounds." name = "\improper NT Mk58" icon_state = "secguncomp" magazine_type = /obj/item/ammo_magazine/c45m/rubber @@ -40,11 +40,10 @@ /obj/item/weapon/gun/projectile/sec/flash name = "\improper NT Mk58 signal pistol" - desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 signal flash rounds." magazine_type = /obj/item/ammo_magazine/c45m/flash /obj/item/weapon/gun/projectile/sec/wood - desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses less-than-lethal .45 rounds." + desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses .45 rounds." name = "\improper Custom NT Mk58" icon_state = "secgundark" @@ -118,7 +117,7 @@ /obj/item/weapon/gun/projectile/pistol/flash name = "\improper Stechtkin signal pistol" - desc = "A small, easily concealable gun. Uses 9mm signal flash rounds." + desc = "A small, easily concealable gun. Uses 9mm rounds." magazine_type = /obj/item/ammo_magazine/mc9mm/flash /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob) diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index fa29d7e8ba..1b3bb21451 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -65,12 +65,24 @@ caliber = "shotgun" origin_tech = "combat=3;materials=1" ammo_type = /obj/item/ammo_casing/shotgun/beanbag + + burst_delay = 0 + firemodes = list( + list(name="fire one barrel at a time", burst=1), + list(name="fire both barrels at once", burst=2), + ) + +/obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet + ammo_type = /obj/item/ammo_casing/shotgun/pellet /obj/item/weapon/gun/projectile/shotgun/doublebarrel/flare name = "signal shotgun" desc = "A double-barreled shotgun meant to fire signal flash shells." ammo_type = /obj/item/ammo_casing/shotgun/flash +/obj/item/weapon/gun/projectile/shotgun/doublebarrel/unload_ammo(user, allow_dump) + ..(user, allow_dump=1) + //this is largely hacky and bad :( -Pete /obj/item/weapon/gun/projectile/shotgun/doublebarrel/attackby(var/obj/item/A as obj, mob/user as mob) if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter)) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3786dda532..8f24273eb2 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -33,6 +33,9 @@ var/p_x = 16 var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center + var/accuracy = 0 + var/dispersion = 0.0 + var/damage = 10 var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here var/nodamage = 0 //Determines if the projectile will skip any damage inflictions @@ -51,17 +54,18 @@ var/drowsy = 0 var/agony = 0 var/embed = 0 // whether or not the projectile can embed itself in the mob - - var/hitscan = 0 // whether the projectile should be hitscan + + var/hitscan = 0 // whether the projectile should be hitscan + var/step_delay = 1 // the delay between iterations if not a hitscan projectile // effect types to be used var/muzzle_type var/tracer_type var/impact_type - + var/datum/plot_vector/trajectory // used to plot the path of the projectile var/datum/vector_loc/location // current location of the projectile in pixel space - var/matrix/effect_transform // matrix to rotate and scale projectile effects - putting it here so it doesn't + var/matrix/effect_transform // matrix to rotate and scale projectile effects - putting it here so it doesn't // have to be recreated multiple times //TODO: make it so this is called more reliably, instead of sometimes by bullet_act() and sometimes not @@ -100,6 +104,12 @@ if(mouse_control["icon-y"]) p_y = text2num(mouse_control["icon-y"]) + //randomize clickpoint a bit based on dispersion + if(dispersion) + var/radius = round((dispersion*0.443)*world.icon_size*0.8) //0.443 = sqrt(pi)/4 = 2a, where a is the side length of a square that shares the same area as a circle with diameter = dispersion + p_x = between(0, p_x + rand(-radius, radius), world.icon_size) + p_y = between(0, p_y + rand(-radius, radius), world.icon_size) + //called to launch a projectile from a gun /obj/item/projectile/proc/launch(atom/target, mob/user, obj/item/weapon/gun/launcher, var/target_zone, var/x_offset=0, var/y_offset=0) var/turf/curloc = get_turf(user) @@ -113,12 +123,12 @@ if(user == target) //Shooting yourself user.bullet_act(src, target_zone) on_impact(user) - del(src) + qdel(src) return 0 if(targloc == curloc) //Shooting something in the same turf target.bullet_act(src, target_zone) on_impact(target) - del(src) + qdel(src) return 0 original = target @@ -146,22 +156,15 @@ yo = new_y - starting_loc.y xo = new_x - starting_loc.x + setup_trajectory() //Called when the projectile intercepts a mob. Returns 1 if the projectile hit the mob, 0 if it missed and should keep flying. /obj/item/projectile/proc/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) - //accuracy bonus from aiming - if (istype(shot_from, /obj/item/weapon/gun)) - var/obj/item/weapon/gun/daddy = shot_from - miss_modifier -= round(15*daddy.accuracy) - - //If you aim at someone beforehead, it'll hit more often. - //Kinda balanced by fact you need like 2 seconds to aim - //As opposed to no-delay pew pew - if (daddy.aim_targets && original in daddy.aim_targets) - miss_modifier += -30 + if(!istype(target_mob)) + return //roll to-hit - miss_modifier = max(miss_modifier + 15*(distance-2), 0) + miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier, 0) var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1)) if(!hit_zone) visible_message("\The [src] misses [target_mob] narrowly!") @@ -197,7 +200,7 @@ /obj/item/projectile/Bump(atom/A as mob|obj|turf|area, forced=0) if(A == src) return 0 //no - + if(A == firer) loc = A.loc return 0 //cannot shoot yourself @@ -218,7 +221,7 @@ visible_message("\The [M] uses [G.affecting] as a shield!") if(Bump(G.affecting, forced=1)) return //If Bump() returns 0 (keep going) then we continue on to attack M. - + passthrough = !attack_mob(M, distance) else passthrough = 1 //so ghosts don't stop bullets @@ -227,7 +230,7 @@ if(isturf(A)) for(var/obj/O in A) O.bullet_act(src) - for(var/mob/M in A) + for(var/mob/living/M in A) attack_mob(M, distance) //penetrating projectiles can pass through things that otherwise would not let them @@ -250,11 +253,11 @@ //stop flying on_impact(A) - + density = 0 invisibility = 101 - del(src) + qdel(src) return 1 /obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -271,22 +274,25 @@ //plot the initial trajectory setup_trajectory() - spawn while(src) + spawn while(src && src.loc) if(kill_count-- < 1) on_impact(src.loc) //for any final impact behaviours - del(src) + qdel(src) + return if((!( current ) || loc == current)) current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) - del(src) + qdel(src) return trajectory.increment() // increment the current location location = trajectory.return_location(location) // update the locally stored location data if(!location) - del(src) // if it's left the world... kill it + qdel(src) // if it's left the world... kill it + return + before_move() Move(location.return_turf()) if(first_step) @@ -294,20 +300,32 @@ first_step = 0 else tracer_effect(effect_transform) - + if(!bumped && !isturf(original)) if(loc == get_turf(original)) if(!(original in permutated)) - Bump(original) + if(Bump(original)) + return if(!hitscan) - sleep(1) //add delay between movement iterations if it's not a hitscan weapon + sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon + +/obj/item/projectile/proc/process_step(first_step = 0) + + +/obj/item/projectile/proc/before_move() /obj/item/projectile/proc/setup_trajectory() + // trajectory dispersion + var/offset = 0 + if(dispersion) + var/radius = round(dispersion*9, 1) + offset = rand(-radius, radius) + // plot the initial trajectory trajectory = new() - trajectory.setup(starting, original, pixel_x, pixel_y) - + trajectory.setup(starting, original, pixel_x, pixel_y, angle_offset=offset) + // generate this now since all visual effects the projectile makes can use it effect_transform = new() effect_transform.Scale(trajectory.return_hypotenuse(), 1) @@ -319,7 +337,7 @@ if(ispath(muzzle_type)) var/obj/effect/projectile/M = new muzzle_type(get_turf(src)) - + if(istype(M)) M.set_transform(T) M.pixel_x = location.pixel_x @@ -329,7 +347,7 @@ /obj/item/projectile/proc/tracer_effect(var/matrix/M) if(ispath(tracer_type)) var/obj/effect/projectile/P = new tracer_type(location.loc) - + if(istype(P)) P.set_transform(M) P.pixel_x = location.pixel_x @@ -339,14 +357,14 @@ /obj/item/projectile/proc/impact_effect(var/matrix/M) if(ispath(tracer_type)) var/obj/effect/projectile/P = new impact_type(location.loc) - + if(istype(P)) P.set_transform(M) P.pixel_x = location.pixel_x P.pixel_y = location.pixel_y P.activate() -//"Tracing" projectile +//"Tracing" projectile /obj/item/projectile/test //Used to see if you can hit them. invisibility = 101 //Nope! Can't see me! yo = null @@ -374,6 +392,8 @@ yo = targloc.y - curloc.y xo = targloc.x - curloc.x target = targloc + original = target + starting = curloc //plot the initial trajectory setup_trajectory() @@ -407,5 +427,5 @@ trace.pass_flags = pass_flags //And the pass flags to that of the real projectile... trace.firer = user var/output = trace.process() //Test it! - del(trace) //No need for it anymore - return output //Send it back to the gun! + qdel(trace) //No need for it anymore + return output //Send it back to the gun! diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 977c9e26f4..80142b5f97 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -8,7 +8,7 @@ embed = 1 sharp = 1 var/mob_passthrough_check = 0 - + muzzle_type = /obj/effect/projectile/bullet/muzzle /obj/item/projectile/bullet/on_hit(var/atom/target, var/blocked = 0) @@ -38,8 +38,8 @@ if(ismob(A)) if(!mob_passthrough_check) return 0 - if(iscarbon(A)) - damage *= 0.7 //squishy mobs absorb KE + if(iscarbon(A)) + damage *= 0.7 //squishy mobs absorb KE return 1 var/chance = 0 @@ -148,6 +148,7 @@ stun = 3 weaken = 3 penetrating = 5 + hitscan = 1 //so the PTR isn't useless as a sniper weapon /obj/item/projectile/bullet/rifle/a556 damage = 40 @@ -184,3 +185,15 @@ /obj/item/projectile/bullet/chameleon damage = 1 // stop trying to murderbone with a fake gun dumbass!!! embed = 0 // nope + +/* Practice */ + +/obj/item/projectile/bullet/pistol/practice + damage = 5 + +/obj/item/projectile/bullet/rifle/a556/practice + damage = 5 + +/obj/item/projectile/bullet/shotgun/practice + name = "practice" + damage = 5 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 24feb08771..4a9fdb9c4f 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -19,11 +19,11 @@ if(istype(M, /mob/living/silicon/robot)) var/mob/living/silicon/robot/Robot = M if(Robot.mmi) - del(Robot.mmi) + qdel(Robot.mmi) else for(var/obj/item/W in M) if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something - del(W) + qdel(W) continue M.drop_from_inventory(W) @@ -79,8 +79,8 @@ A.randomize_appearance_for(H) if(new_mob) - for (var/obj/effect/proc_holder/spell/S in M.spell_list) - new_mob.spell_list += new S.type + for (var/spell/S in M.spell_list) + new_mob.add_spell(new S.type) new_mob.a_intent = "hurt" if(M.mind) @@ -90,7 +90,7 @@ new_mob << "Your form morphs into that of \a [lowertext(randomize)]." - del(M) + qdel(M) return else M << "Your form morphs into that of \a [lowertext(randomize)]." diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index fc69f6ec94..9ef0aea43c 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -65,7 +65,7 @@ for(var/mob/M in range(10, src)) if(!M.stat && !istype(M, /mob/living/silicon/ai))\ shake_camera(M, 3, 1) - del(src) + qdel(src) return 1 else return 0 @@ -141,12 +141,12 @@ /obj/item/projectile/icarus/pointdefense/process() Icarus_FireLaser(get_turf(original)) spawn - del src + qdel(src) return /obj/item/projectile/icarus/guns/process() Icarus_FireCannon(get_turf(original)) spawn - del src + qdel(src) return diff --git a/code/modules/projectiles/targeting.dm b/code/modules/projectiles/targeting.dm index 4e49a785e7..3bda5319d7 100644 --- a/code/modules/projectiles/targeting.dm +++ b/code/modules/projectiles/targeting.dm @@ -14,11 +14,7 @@ set category = "Object" if(aim_targets) stop_aim() - usr.visible_message("\blue \The [usr] lowers \the [src]...") - -//Clicking gun will still lower aim for guns that don't overwrite this -/obj/item/weapon/gun/attack_self() - lower_aim() + usr.visible_message(" \The [usr] lowers \the [src]...") //Removing the lock and the buttons. /obj/item/weapon/gun/dropped(mob/user as mob) @@ -40,7 +36,7 @@ for(var/mob/living/M in aim_targets) if(M) M.NotTargeted(src) //Untargeting people. - del(aim_targets) + qdel(aim_targets) //Compute how to fire..... //Return 1 if a target was found, 0 otherwise. @@ -69,10 +65,10 @@ for(var/mob/living/L in aim_targets) if(L) L.NotTargeted(src) - del(aim_targets) - usr.visible_message("\red [usr] turns \the [src] on [M]!") + qdel(aim_targets) + usr.visible_message("[usr] turns \the [src] on [M]!") else - usr.visible_message("\red [usr] aims \a [src] at [M]!") + usr.visible_message("[usr] aims \a [src] at [M]!") M.Targeted(src) //HE MOVED, SHOOT HIM! @@ -86,7 +82,7 @@ //reflex firing is disabled when help intent is set if (M.a_intent == I_HELP) - M << "\red You refrain from firing your [src] as your intent is set to help." + M << "You refrain from firing your [src] as your intent is set to help." return M.last_move_intent = world.time @@ -95,7 +91,7 @@ if(firing_check == 1) Fire(T,usr, reflex = 1) else if(!told_cant_shoot) - M << "\red They can't be hit from here!" + M << "They can't be hit from here!" told_cant_shoot = 1 spawn(30) told_cant_shoot = 0 @@ -153,6 +149,7 @@ last_move_intent = -100 last_target_click = -5 target_locked = null + last_target_radio = -5; /mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. if(!I.aim_targets) @@ -171,10 +168,10 @@ if(!targeted_by) targeted_by = list() targeted_by += I I.lock_time = world.time + 20 //Target has 2 second to realize they're targeted and stop (or target the opponent). - src << "((\red Your character is being targeted. They have 2 seconds to stop any click or move actions. \black While targeted, they may \ + src << "((Your character is being targeted. They have 2 seconds to stop any click or move actions. While targeted, they may \ drag and drop items in or into the map, speak, and click on interface buttons. Clicking on the map objects (floors and walls are fine), their items \ - (other than a weapon to de-target), or moving will result in being fired upon. \red The aggressor may also fire manually, \ - so try not to get on their bad side.\black ))" + (other than a weapon to de-target), moving, or talking into a radio will result in being fired upon. The aggressor may also fire manually, \ + so try not to get on their bad side.))" if(targeted_by.len == 1) spawn(0) @@ -194,8 +191,8 @@ else I.lower_aim() return - if(m_intent == "run" && T.client.target_can_move == 1 && T.client.target_can_run == 0) - src << "\red Your move intent is now set to walk, as your targeter permits it." //Self explanitory. + if(iscarbon(src) && m_intent == "run" && T.client.target_can_move == 1 && T.client.target_can_run == 0) + src << "Your move intent is now set to walk, as your targeter permits it." //Self explanitory. set_m_intent("walk") //Processing the aiming. Should be probably in separate object with process() but lasy. @@ -218,6 +215,12 @@ I.lock_time = world.time + 5 I.lock_time = world.time + 5 I.last_moved_mob = src + if(last_target_radio > I.lock_time + 10 && !T.client.target_can_radio) + I.TargetActed(src) + if(I.last_moved_mob == src) //If they were the last ones to move, give them more of a grace period, so that an automatic weapon can hold down a room better. + I.lock_time = world.time + 5 + I.lock_time = world.time + 5 + I.last_moved_mob = src sleep(1) /mob/living/proc/NotTargeted(var/obj/item/weapon/gun/I) @@ -227,13 +230,13 @@ targeted_by -= I I.aim_targets.Remove(src) //De-target them if(!I.aim_targets.len) - del(I.aim_targets) + qdel(I.aim_targets) var/mob/living/T = I.loc //Remove the targeting icons - if(T && ismob(T) && !I.aim_targets) + if(T && ismob(T) && !I.aim_targets && T.client) T.client.remove_gun_icons() if(!targeted_by.len) - del target_locked //Remove the overlay - del targeted_by + qdel(target_locked) //Remove the overlay + qdel(targeted_by) spawn(1) update_targeted() /mob/living/Move() @@ -253,12 +256,14 @@ target_can_move = 0 target_can_run = 0 target_can_click = 0 + target_can_radio = 0 gun_mode = 0 //These are called by the on-screen buttons, adjusting what the victim can and cannot do. /client/proc/add_gun_icons() screen += usr.item_use_icon screen += usr.gun_move_icon + screen += usr.radio_use_icon if (target_can_move) screen += usr.gun_run_icon @@ -268,6 +273,7 @@ if(!usr) return 1 // Runtime prevention on N00k agents spawning with SMG screen -= usr.item_use_icon screen -= usr.gun_move_icon + screen -= usr.radio_use_icon if (target_can_move) screen -= usr.gun_run_icon @@ -298,7 +304,7 @@ else usr << "Target may no longer move." target_can_run = 0 - del(usr.gun_run_icon) //no need for icon for running permission + qdel(usr.gun_run_icon) //no need for icon for running permission //Updating walking permission button if(usr.gun_move_icon) @@ -313,10 +319,10 @@ if(target_can_move) M << "Your character may now walk at the discretion of their targeter." if(!target_can_run) - M << "\red Your move intent is now set to walk, as your targeter permits it." + M << "Your move intent is now set to walk, as your targeter permits it." M.set_m_intent("walk") else - M << "\red Your character will now be shot if they move." + M << "Your character will now be shot if they move." /mob/living/proc/set_m_intent(var/intent) if (intent != "walk" && intent != "run") @@ -349,7 +355,7 @@ client/verb/AllowTargetRun() if(target_can_run) M << "Your character may now run at the discretion of their targeter." else - M << "\red Your character will now be shot if they run." + M << "Your character will now be shot if they run." /client/verb/AllowTargetClick() set hidden=1 @@ -373,4 +379,27 @@ client/verb/AllowTargetRun() if(target_can_click) M << "Your character may now use items at the discretion of their targeter." else - M << "\red Your character will now be shot if they use items." + M << "Your character will now be shot if they use items." + +/client/verb/AllowTargetRadio() + set hidden=1 + + target_can_radio = !target_can_radio + if(target_can_radio) + usr << "Target may now use radio." + else + usr << "Target may no longer use radio." + + if(usr.radio_use_icon) + usr.radio_use_icon.icon_state = "no_radio[target_can_radio]" + usr.radio_use_icon.name = "[target_can_radio ? "Disallow" : "Allow"] Radio Use" + + //Handling change for all the guns on client + for(var/obj/item/weapon/gun/G in src) + G.lock_time = world.time + 5 + if(G.aim_targets) + for(var/mob/living/M in G.aim_targets) + if(target_can_radio) + M << "Your character may now use the radio at the discretion of their targeter." + else + M << "Your character will now be shot if they use the radio." diff --git a/code/modules/random_map/mining_distribution.dm b/code/modules/random_map/mining_distribution.dm index 76c3b5bcc0..7973ff14ab 100644 --- a/code/modules/random_map/mining_distribution.dm +++ b/code/modules/random_map/mining_distribution.dm @@ -62,13 +62,13 @@ Deep minerals: deep_count++ // Sanity check. if(surface_count < MIN_SURFACE_COUNT) - world << "Insufficient surface minerals. Rerolling..." + admin_notice("Insufficient surface minerals. Rerolling...", R_DEBUG) return 0 else if(rare_count < MIN_RARE_COUNT) - world << "Insufficient rare minerals. Rerolling..." + admin_notice("Insufficient rare minerals. Rerolling...", R_DEBUG) return 0 else if(deep_count < MIN_DEEP_COUNT) - world << "Insufficient deep minerals. Rerolling..." + admin_notice("Insufficient deep minerals. Rerolling...", R_DEBUG) return 0 else return 1 @@ -112,7 +112,7 @@ Deep minerals: // Infinite loop check! if(iteration>=iterate_before_fail) - world << "Iteration count exceeded, aborting." + admin_notice("Iteration count exceeded, aborting.", R_DEBUG) return var/isize = input_size diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index e6f4ec1409..81def6be14 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -58,12 +58,12 @@ var/global/list/random_maps = list() if(seed) rand_seed(seed) var/start_time = world.timeofday - world << "Generating [descriptor]." + admin_notice("Generating [descriptor].", R_DEBUG) for(var/i = 0;i[capitalize(descriptor)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds." + admin_notice("[capitalize(descriptor)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG) return - world << "[capitalize(descriptor)] generation failed in [round(0.1*(world.timeofday-start_time),0.1)] seconds: could not produce sane map." + admin_notice("[capitalize(descriptor)] generation failed in [round(0.1*(world.timeofday-start_time),0.1)] seconds: could not produce sane map.", R_DEBUG) /datum/random_map/proc/within_bounds(var/val) return (val>0) && (val<=raw_map_size) @@ -169,5 +169,5 @@ var/global/list/random_maps = list() for(var/i = 0, i < max_secret_rooms, i++) if(make_mining_asteroid_secret()) rooms_placed++ - world << "Placed [rooms_placed] secrets." + admin_notice("Placed [rooms_placed] secrets.", R_DEBUG) return 1 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/Chemistry-Colours.dm index a59147e85f..501b1ac475 100644 --- a/code/modules/reagents/Chemistry-Colours.dm +++ b/code/modules/reagents/Chemistry-Colours.dm @@ -1,66 +1,23 @@ -/proc/mix_color_from_reagents(var/list/reagent_list) - if(!reagent_list || !length(reagent_list)) - return 0 +/datum/reagents/proc/get_color() + if(!reagent_list || !reagent_list.len) + return "#ffffffff" + if(reagent_list.len == 1) // It's pretty common and saves a lot of work + var/datum/reagent/R = reagent_list[1] + return R.color - var/contents = length(reagent_list) - var/list/weight = new /list(contents) - var/list/redcolor = new /list(contents) - var/list/greencolor = new /list(contents) - var/list/bluecolor = new /list(contents) - var/i + var/list/colors = list(0, 0, 0, 0) + var/tot_w = 0 + for(var/datum/reagent/R in reagent_list) + var/hex = uppertext(R.color) + if(length(hex) == 7) + hex += "FF" + if(length(hex) != 9) // PANIC PANIC PANIC + warning("Reagent [R.id] has an incorrect color set ([R.color])") + hex = "#FFFFFFFF" + colors[1] += hex2num(copytext(hex, 2, 4)) * R.volume * R.color_weight + colors[2] += hex2num(copytext(hex, 4, 6)) * R.volume * R.color_weight + colors[3] += hex2num(copytext(hex, 6, 8)) * R.volume * R.color_weight + colors[4] += hex2num(copytext(hex, 8, 10)) * R.volume * R.color_weight + tot_w += R.volume * R.color_weight - //fill the list of weights - for(i=1; i<=contents; i++) - var/datum/reagent/re = reagent_list[i] - var/reagentweight = re.volume - if(istype(re, /datum/reagent/paint)) - reagentweight *= 20 //Paint colours a mixture twenty times as much - weight[i] = reagentweight - - - //fill the lists of colours - for(i=1; i<=contents; i++) - var/datum/reagent/re = reagent_list[i] - var/hue = re.color - if(length(hue) != 7) - return 0 - redcolor[i]=hex2num(copytext(hue,2,4)) - greencolor[i]=hex2num(copytext(hue,4,6)) - bluecolor[i]=hex2num(copytext(hue,6,8)) - - //mix all the colors - var/red = mixOneColor(weight,redcolor) - var/green = mixOneColor(weight,greencolor) - var/blue = mixOneColor(weight,bluecolor) - - //assemble all the pieces - var/finalcolor = rgb(red, green, blue) - return finalcolor - -/proc/mixOneColor(var/list/weight, var/list/color) - if (!weight || !color || length(weight)!=length(color)) - return 0 - - var/contents = length(weight) - var/i - - //normalize weights - var/listsum = 0 - for(i=1; i<=contents; i++) - listsum += weight[i] - for(i=1; i<=contents; i++) - weight[i] /= listsum - - //mix them - var/mixedcolor = 0 - for(i=1; i<=contents; i++) - mixedcolor += weight[i]*color[i] - mixedcolor = round(mixedcolor) - - //until someone writes a formal proof for this algorithm, let's keep this in -// if(mixedcolor<0x00 || mixedcolor>0xFF) -// return 0 - //that's not the kind of operation we are running here, nerd - mixedcolor=min(max(mixedcolor,0),255) - - return mixedcolor + return rgb(colors[1] / tot_w, colors[2] / tot_w, colors[3] / tot_w, colors[4] / tot_w) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 6c6c194af5..a9562ca861 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -5,655 +5,623 @@ var/const/INGEST = 2 /////////////////////////////////////////////////////////////////////////////////// -datum - reagents - var/list/datum/reagent/reagent_list = new/list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null +/datum/reagents + var/list/datum/reagent/reagent_list = new/list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null - New(maximum=100) - maximum_volume = maximum +/datum/reagents/New(maximum=100) + maximum_volume = maximum - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!chemical_reagents_list) - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - var/paths = typesof(/datum/reagent) - /datum/reagent - chemical_reagents_list = list() - for(var/path in paths) - var/datum/reagent/D = new path() - chemical_reagents_list[D.id] = D - if(!chemical_reactions_list) - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reaction_list["phoron"] is a list of all reactions relating to phoron + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!chemical_reagents_list) + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + var/paths = typesof(/datum/reagent) - /datum/reagent + chemical_reagents_list = list() + for(var/path in paths) + var/datum/reagent/D = new path() + chemical_reagents_list[D.id] = D + if(!chemical_reactions_list) + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reaction_list["phoron"] is a list of all reactions relating to phoron - var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction - chemical_reactions_list = list() + var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction + chemical_reactions_list = list() - for(var/path in paths) + for(var/path in paths) - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() - if(D.required_reagents && D.required_reagents.len) - for(var/reaction in D.required_reagents) - reaction_ids += reaction + if(D.required_reagents && D.required_reagents.len) + for(var/reaction in D.required_reagents) + reaction_ids += reaction - // Create filters based on each reagent id in the required reagents list - for(var/id in reaction_ids) - if(!chemical_reactions_list[id]) - chemical_reactions_list[id] = list() - chemical_reactions_list[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant. + // Create filters based on each reagent id in the required reagents list + for(var/id in reaction_ids) + if(!chemical_reactions_list[id]) + chemical_reactions_list[id] = list() + chemical_reactions_list[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant. - proc +/datum/reagents/Destroy() + ..() + for(var/datum/reagent/R in reagent_list) + qdel(R) + reagent_list.Cut() + reagent_list = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null - remove_any(var/amount=1) - var/total_transfered = 0 - var/current_list_element = 1 +/datum/reagents/proc/remove_any(var/amount=1) + var/total_transfered = 0 + var/current_list_element = 1 - current_list_element = rand(1,reagent_list.len) + current_list_element = rand(1,reagent_list.len) - while(total_transfered != amount) - if(total_transfered >= amount) break - if(total_volume <= 0 || !reagent_list.len) break + while(total_transfered != amount) + if(total_transfered >= amount) break + if(total_volume <= 0 || !reagent_list.len) break - if(current_list_element > reagent_list.len) current_list_element = 1 - var/datum/reagent/current_reagent = reagent_list[current_list_element] + if(current_list_element > reagent_list.len) current_list_element = 1 + var/datum/reagent/current_reagent = reagent_list[current_list_element] - src.remove_reagent(current_reagent.id, 1) + src.remove_reagent(current_reagent.id, 1) - current_list_element++ - total_transfered++ - src.update_total() + current_list_element++ + total_transfered++ + src.update_total() - handle_reactions() - return total_transfered + handle_reactions() + return total_transfered - get_master_reagent() - var/the_reagent = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_reagent = A +/datum/reagents/proc/get_master_reagent() + var/the_reagent = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_reagent = A - return the_reagent + return the_reagent - get_master_reagent_name() - var/the_name = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_name = A.name +/datum/reagents/proc/get_master_reagent_name() + var/the_name = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_name = A.name - return the_name + return the_name - get_master_reagent_id() - var/the_id = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_id = A.id +/datum/reagents/proc/get_master_reagent_id() + var/the_id = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_id = A.id - return the_id + return the_id - trans_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. - if (!target ) - return - if (!target.reagents || src.total_volume<=0) - return - var/datum/reagents/R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for (var/datum/reagent/current_reagent in src.reagent_list) - if (!current_reagent) - continue - if (current_reagent.id == "blood" && ishuman(target)) - var/mob/living/carbon/human/H = target - H.inject_blood(my_atom, amount) - continue - var/current_reagent_transfer = current_reagent.volume * part - if(preserve_data) - trans_data = copy_data(current_reagent) +/datum/reagents/proc/trans_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. + if (!target ) + return + if (!target.reagents || src.total_volume<=0) + return + var/datum/reagents/R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for (var/datum/reagent/current_reagent in src.reagent_list) + if (!current_reagent) + continue + if (current_reagent.id == "blood" && ishuman(target)) + var/mob/living/carbon/human/H = target + H.inject_blood(my_atom, amount) + continue + var/current_reagent_transfer = current_reagent.volume * part + if(preserve_data) + trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety checks on these so all chemicals are transferred - src.remove_reagent(current_reagent.id, current_reagent_transfer, safety = 1) // to the target container before handling reactions + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety checks on these so all chemicals are transferred + src.remove_reagent(current_reagent.id, current_reagent_transfer, safety = 1) // to the target container before handling reactions - src.update_total() - R.update_total() - R.handle_reactions() - src.handle_reactions() - return amount + src.update_total() + R.update_total() + R.handle_reactions() + src.handle_reactions() + return amount - trans_to_ingest(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//For items ingested. A delay is added between ingestion and addition of the reagents - if (!target ) - return - if (!target.reagents || src.total_volume<=0) - return +/datum/reagents/proc/trans_to_ingest(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//For items ingested. A delay is added between ingestion and addition of the reagents + if (!target ) + return + if (!target.reagents || src.total_volume<=0) + return - /*var/datum/reagents/R = target.reagents + /*var/datum/reagents/R = target.reagents - var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder + var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for (var/datum/reagent/current_reagent in src.reagent_list) - if (!current_reagent) - continue - //if (current_reagent.id == "blood" && ishuman(target)) - // var/mob/living/carbon/human/H = target - // H.inject_blood(my_atom, amount) - // continue - var/current_reagent_transfer = current_reagent.volume * part - if(preserve_data) - trans_data = current_reagent.data + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for (var/datum/reagent/current_reagent in src.reagent_list) + if (!current_reagent) + continue + //if (current_reagent.id == "blood" && ishuman(target)) + // var/mob/living/carbon/human/H = target + // H.inject_blood(my_atom, amount) + // continue + var/current_reagent_transfer = current_reagent.volume * part + if(preserve_data) + trans_data = current_reagent.data - B.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety checks on these so all chemicals are transferred - src.remove_reagent(current_reagent.id, current_reagent_transfer, safety = 1) // to the target container before handling reactions + B.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety checks on these so all chemicals are transferred + src.remove_reagent(current_reagent.id, current_reagent_transfer, safety = 1) // to the target container before handling reactions - src.update_total() - B.update_total() - B.handle_reactions() - src.handle_reactions()*/ + src.update_total() + B.update_total() + B.handle_reactions() + src.handle_reactions()*/ - var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder - B.volume = 1000 + var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder + B.volume = 1000 - var/datum/reagents/BR = B.reagents - var/datum/reagents/R = target.reagents + var/datum/reagents/BR = B.reagents + var/datum/reagents/R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - src.trans_to(B, amount) + src.trans_to(B, amount) - spawn(95) - BR.reaction(target, INGEST) - spawn(5) - BR.trans_to(target, BR.total_volume) - del(B) + spawn(95) + BR.reaction(target, INGEST) + spawn(5) + BR.trans_to(target, BR.total_volume) + qdel(B) - return amount + return amount - copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0) - if(!target) - return - if(!target.reagents || src.total_volume<=0) - return - var/datum/reagents/R = target.reagents - amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) - var/part = amount / src.total_volume - var/trans_data = null - for (var/datum/reagent/current_reagent in src.reagent_list) - var/current_reagent_transfer = current_reagent.volume * part - if(preserve_data) - trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety check so all chemicals are transferred before reacting +/datum/reagents/proc/copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0) + if(!target) + return + if(!target.reagents || src.total_volume<=0) + return + var/datum/reagents/R = target.reagents + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) + var/part = amount / src.total_volume + var/trans_data = null + for (var/datum/reagent/current_reagent in src.reagent_list) + var/current_reagent_transfer = current_reagent.volume * part + if(preserve_data) + trans_data = copy_data(current_reagent) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, safety = 1) //safety check so all chemicals are transferred before reacting - src.update_total() - R.update_total() - if(!safety) - R.handle_reactions() - src.handle_reactions() - return amount + src.update_total() + R.update_total() + if(!safety) + R.handle_reactions() + src.handle_reactions() + return amount - trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N - if (!target) - return - if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) - return +/datum/reagents/proc/trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N + if (!target) + return + if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent)) + return - var/datum/reagents/R = target.reagents - if(src.get_reagent_amount(reagent) R.maximum_volume) return 0 + if (!target) return + var/total_transfered = 0 + var/current_list_element = 1 + var/datum/reagents/R = target.reagents + var/trans_data = null + //if(R.total_volume + amount > R.maximum_volume) return 0 - current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix. + current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix. - while(total_transfered != amount) - if(total_transfered >= amount) break //Better safe than sorry. - if(total_volume <= 0 || !reagent_list.len) break - if(R.total_volume >= R.maximum_volume) break + while(total_transfered != amount) + if(total_transfered >= amount) break //Better safe than sorry. + if(total_volume <= 0 || !reagent_list.len) break + if(R.total_volume >= R.maximum_volume) break - if(current_list_element > reagent_list.len) current_list_element = 1 - var/datum/reagent/current_reagent = reagent_list[current_list_element] - if(preserve_data) - trans_data = current_reagent.data - R.add_reagent(current_reagent.id, (1 * multiplier), trans_data) - src.remove_reagent(current_reagent.id, 1) + if(current_list_element > reagent_list.len) current_list_element = 1 + var/datum/reagent/current_reagent = reagent_list[current_list_element] + if(preserve_data) + trans_data = current_reagent.data + R.add_reagent(current_reagent.id, (1 * multiplier), trans_data) + src.remove_reagent(current_reagent.id, 1) - current_list_element++ - total_transfered++ - src.update_total() - R.update_total() - R.handle_reactions() - handle_reactions() + current_list_element++ + total_transfered++ + src.update_total() + R.update_total() + R.handle_reactions() + handle_reactions() - return total_transfered + return total_transfered */ - metabolize(var/mob/M,var/alien) +/datum/reagents/proc/metabolize(var/mob/M,var/alien) - for(var/A in reagent_list) - var/datum/reagent/R = A - if(M && R) - R.on_mob_life(M,alien) - update_total() + for(var/A in reagent_list) + var/datum/reagent/R = A + if(M && R) + R.on_mob_life(M,alien) + update_total() - conditional_update_move(var/atom/A, var/Running = 0) - for(var/datum/reagent/R in reagent_list) - R.on_move (A, Running) - update_total() +/datum/reagents/proc/conditional_update_move(var/atom/A, var/Running = 0) + for(var/datum/reagent/R in reagent_list) + R.on_move (A, Running) + update_total() - conditional_update(var/atom/A, ) - for(var/datum/reagent/R in reagent_list) - R.on_update (A) - update_total() +/datum/reagents/proc/conditional_update(var/atom/A, ) + for(var/datum/reagent/R in reagent_list) + R.on_update (A) + update_total() - handle_reactions() - if(my_atom.flags & NOREACT) return //Yup, no reactions here. No siree. +/datum/reagents/proc/handle_reactions() + if(my_atom.flags & NOREACT) return //Yup, no reactions here. No siree. - var/reaction_occured = 0 - do - reaction_occured = 0 - for(var/datum/reagent/R in reagent_list) // Usually a small list - for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + var/reaction_occured = 0 + do + reaction_occured = 0 + for(var/datum/reagent/R in reagent_list) // Usually a small list + for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue + if(!reaction) + continue - var/datum/chemical_reaction/C = reaction + var/datum/chemical_reaction/C = reaction - //check if this recipe needs to be heated to mix - if(C.requires_heating) - if(istype(my_atom.loc, /obj/machinery/bunsen_burner)) - if(!my_atom.loc:heated) - continue - else - continue - - var/total_required_reagents = C.required_reagents.len - var/total_matching_reagents = 0 - var/total_required_catalysts = C.required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = 0 - var/matching_other = 0 - var/list/multipliers = new/list() - - for(var/B in C.required_reagents) - if(!has_reagent(B, C.required_reagents[B])) break - total_matching_reagents++ - multipliers += round(get_reagent_amount(B) / C.required_reagents[B]) - for(var/B in C.required_catalysts) - if(!has_reagent(B, C.required_catalysts[B])) break - total_matching_catalysts++ - - if(!C.required_container) - matching_container = 1 - - else - if(my_atom.type == C.required_container) - matching_container = 1 - - if(!C.required_other) - matching_other = 1 - - else - /*if(istype(my_atom, /obj/item/slime_core)) - var/obj/item/slime_core/M = my_atom - - if(M.POWERFLAG == C.required_other && M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1*/ - if(istype(my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/M = my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 - - - - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other) - var/multiplier = min(multipliers) - var/preserved_data = null - for(var/B in C.required_reagents) - if(!preserved_data) - preserved_data = get_data(B) - remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1) - - var/created_volume = C.result_amount*multiplier - if(C.result) - feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]") - multiplier = max(multiplier, 1) //this shouldnt happen ... - if(!isnull(C.resultcolor)) //paints - add_reagent(C.result, C.result_amount*multiplier, C.resultcolor) - else - add_reagent(C.result, C.result_amount*multiplier) - set_data(C.result, preserved_data) - - //add secondary products - for(var/S in C.secondary_results) - add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier) - - var/list/seen = viewers(4, get_turf(my_atom)) - for(var/mob/M in seen) - M << "\blue \icon[my_atom] The solution begins to bubble." - - /* if(istype(my_atom, /obj/item/slime_core)) - var/obj/item/slime_core/ME = my_atom - ME.Uses-- - if(ME.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in viewers(4, get_turf(my_atom)) ) - M << "\blue \icon[my_atom] The innards begin to boil!" - */ - if(istype(my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - M << "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction." - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - - playsound(get_turf(my_atom), 'sound/effects/bubbles.ogg', 80, 1) - - C.on_reaction(src, created_volume) - reaction_occured = 1 - break - - while(reaction_occured) - update_total() - return 0 - - isolate_reagent(var/reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id != reagent) - del_reagent(R.id) - update_total() - - del_reagent(var/reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id == reagent) - reagent_list -= A - del(A) - update_total() - my_atom.on_reagent_change() - return 0 - - - return 1 - - update_total() - total_volume = 0 - for(var/datum/reagent/R in reagent_list) - if(R.volume < 0.1) - del_reagent(R.id) + //check if this recipe needs to be heated to mix + if(C.requires_heating) + if(istype(my_atom.loc, /obj/machinery/bunsen_burner)) + if(!my_atom.loc:heated) + continue else - total_volume += R.volume + continue - return 0 + var/total_required_reagents = C.required_reagents.len + var/total_matching_reagents = 0 + var/total_required_catalysts = C.required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = 0 + var/matching_other = 0 + var/list/multipliers = new/list() - clear_reagents() - for(var/datum/reagent/R in reagent_list) - del_reagent(R.id) - return 0 + for(var/B in C.required_reagents) + if(!has_reagent(B, C.required_reagents[B])) break + total_matching_reagents++ + multipliers += round(get_reagent_amount(B) / C.required_reagents[B]) + for(var/B in C.required_catalysts) + if(!has_reagent(B, C.required_catalysts[B])) break + total_matching_catalysts++ - reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0) + if(!C.required_container) + matching_container = 1 - switch(method) - if(TOUCH) - for(var/datum/reagent/R in reagent_list) - if(ismob(A)) - spawn(0) - if(!R) return - else R.reaction_mob(A, TOUCH, R.volume+volume_modifier) - if(isturf(A)) - spawn(0) - if(!R) return - else R.reaction_turf(A, R.volume+volume_modifier) - if(isobj(A)) - spawn(0) - if(!R) return - else R.reaction_obj(A, R.volume+volume_modifier) - if(INGEST) - for(var/datum/reagent/R in reagent_list) - if(ismob(A) && R) - spawn(0) - if(!R) return - else R.reaction_mob(A, INGEST, R.volume+volume_modifier) - if(isturf(A) && R) - spawn(0) - if(!R) return - else R.reaction_turf(A, R.volume+volume_modifier) - if(isobj(A) && R) - spawn(0) - if(!R) return - else R.reaction_obj(A, R.volume+volume_modifier) - return - - add_reagent(var/reagent, var/amount, var/data=null, var/safety = 0) - if(!isnum(amount)) return 1 - update_total() - if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. - - for(var/A in reagent_list) - - var/datum/reagent/R = A - if (R.id == reagent) - R.volume += amount - update_total() - - // mix dem viruses - if(R.id == "blood" && reagent == "blood") - if(R.data && data) - - if(R.data["viruses"] || data["viruses"]) - - var/list/mix1 = R.data["viruses"] - var/list/mix2 = data["viruses"] - - // Stop issues with the list changing during mixing. - var/list/to_mix = list() - - for(var/datum/disease/advance/AD in mix1) - to_mix += AD - for(var/datum/disease/advance/AD in mix2) - to_mix += AD - - var/datum/disease/advance/AD = Advance_Mix(to_mix) - if(AD) - var/list/preserve = list(AD) - for(var/D in R.data["viruses"]) - if(!istype(D, /datum/disease/advance)) - preserve += D - R.data["viruses"] = preserve - if(R.id == "paint" && reagent == "paint") - if(R.color && data) - var/list/mix = new /list(2) - //fill the list - var/datum/reagent/paint/P = chemical_reagents_list["paint"] - var/datum/reagent/paint/P1 = new P.type() - P1.color = R.color - P1.volume = R.volume - amount //since we just increased that - var/datum/reagent/paint/P2 = new P.type() - P2.color = data - P2.volume = amount - mix[1] = P1 - mix[2] = P2 - R.color = mix_color_from_reagents(mix) - if(!safety) - handle_reactions() - my_atom.on_reagent_change() - return 0 - - var/datum/reagent/D = chemical_reagents_list[reagent] - if(D) - - var/datum/reagent/R = new D.type() - reagent_list += R - R.holder = src - R.volume = amount - if(reagent == "paint") - R.color = data - else - SetViruses(R, data) // Includes setting data for blood - - //debug - //world << "Adding data" - //for(var/D in R.data) - // world << "Container data: [D] = [R.data[D]]" - //debug - update_total() - my_atom.on_reagent_change() - if(!safety) - handle_reactions() - return 0 else - warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + if(my_atom.type == C.required_container) + matching_container = 1 - if(!safety) - handle_reactions() + if(!C.required_other) + matching_other = 1 - return 1 + else + /*if(istype(my_atom, /obj/item/slime_core)) + var/obj/item/slime_core/M = my_atom - remove_reagent(var/reagent, var/amount, var/safety = 0)//Added a safety check for the trans_id_to - if(!isnum(amount)) return 1 + if(M.POWERFLAG == C.required_other && M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1*/ + if(istype(my_atom, /obj/item/slime_extract)) + var/obj/item/slime_extract/M = my_atom - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id == reagent) - R.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - my_atom.on_reagent_change() - return 0 + if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = 1 - return 1 - has_reagent(var/reagent, var/amount = -1) - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id == reagent) - if(!amount) return R + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other) + var/multiplier = min(multipliers) + var/preserved_data = null + for(var/B in C.required_reagents) + if(!preserved_data) + preserved_data = get_data(B) + remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1) + + var/created_volume = C.result_amount*multiplier + if(C.result) + feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]") + multiplier = max(multiplier, 1) //this shouldnt happen ... + if(!isnull(C.resultcolor)) //paints + add_reagent(C.result, C.result_amount*multiplier, C.resultcolor) else - if(R.volume >= amount) return R - else return 0 + add_reagent(C.result, C.result_amount*multiplier) + set_data(C.result, preserved_data) - return 0 + //add secondary products + for(var/S in C.secondary_results) + add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier) - get_reagent_amount(var/reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if (R.id == reagent) - return R.volume + var/list/seen = viewers(4, get_turf(my_atom)) + for(var/mob/M in seen) + M << "\blue \icon[my_atom] The solution begins to bubble." - return 0 + /* if(istype(my_atom, /obj/item/slime_core)) + var/obj/item/slime_core/ME = my_atom + ME.Uses-- + if(ME.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in viewers(4, get_turf(my_atom)) ) + M << "\blue \icon[my_atom] The innards begin to boil!" + */ + if(istype(my_atom, /obj/item/slime_extract)) + var/obj/item/slime_extract/ME2 = my_atom + ME2.Uses-- + if(ME2.Uses <= 0) // give the notification that the slime core is dead + for(var/mob/M in seen) + M << "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction." + ME2.name = "used slime extract" + ME2.desc = "This extract has been used up." - get_reagents() - var/res = "" - for(var/datum/reagent/A in reagent_list) - if (res != "") res += "," - res += A.name + playsound(get_turf(my_atom), 'sound/effects/bubbles.ogg', 80, 1) - return res + C.on_reaction(src, created_volume) + reaction_occured = 1 + break - remove_all_type(var/reagent_type, var/amount, var/strict = 0, var/safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. - if(!isnum(amount)) return 1 + while(reaction_occured) + update_total() + return 0 - var/has_removed_reagent = 0 +/datum/reagents/proc/isolate_reagent(var/reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if (R.id != reagent) + del_reagent(R.id) + update_total() - for(var/datum/reagent/R in reagent_list) - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(R.type == reagent_type) - matches = 1 - else - if(istype(R, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) +/datum/reagents/proc/del_reagent(var/reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if (R.id == reagent) + reagent_list -= A + qdel(A) + update_total() + my_atom.on_reagent_change() + return 0 - return has_removed_reagent - //two helper functions to preserve data across reactions (needed for xenoarch) - get_data(var/reagent_id) - for(var/datum/reagent/D in reagent_list) - if(D.id == reagent_id) - //world << "proffering a data-carrying reagent ([reagent_id])" - return D.data + return 1 - set_data(var/reagent_id, var/new_data) - for(var/datum/reagent/D in reagent_list) - if(D.id == reagent_id) - //world << "reagent data set ([reagent_id])" - D.data = new_data +/datum/reagents/proc/update_total() + total_volume = 0 + for(var/datum/reagent/R in reagent_list) + if(R.volume < 0.1) + del_reagent(R.id) + else + total_volume += R.volume - delete() - for(var/datum/reagent/R in reagent_list) - R.holder = null - if(my_atom) - my_atom.reagents = null + return 0 - copy_data(var/datum/reagent/current_reagent) - if (current_reagent.id == "paint") return current_reagent.color - if (!current_reagent || !current_reagent.data) return null - if (!istype(current_reagent.data, /list)) return current_reagent.data +/datum/reagents/proc/clear_reagents() + for(var/datum/reagent/R in reagent_list) + del_reagent(R.id) + return 0 - var/list/trans_data = current_reagent.data.Copy() +/datum/reagents/proc/reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0) - // We do this so that introducing a virus to a blood sample - // doesn't automagically infect all other blood samples from - // the same donor. - // - // Technically we should probably copy all data lists, but - // that could possibly eat up a lot of memory needlessly - // if most data lists are read-only. - if (trans_data["virus2"]) - var/list/v = trans_data["virus2"] - trans_data["virus2"] = v.Copy() + switch(method) + if(TOUCH) + for(var/datum/reagent/R in reagent_list) + if(ismob(A)) + spawn(0) + if(!R) return + else R.reaction_mob(A, TOUCH, R.volume+volume_modifier) + if(isturf(A)) + spawn(0) + if(!R) return + else R.reaction_turf(A, R.volume+volume_modifier) + if(isobj(A)) + spawn(0) + if(!R) return + else R.reaction_obj(A, R.volume+volume_modifier) + if(INGEST) + for(var/datum/reagent/R in reagent_list) + if(ismob(A) && R) + spawn(0) + if(!R) return + else R.reaction_mob(A, INGEST, R.volume+volume_modifier) + if(isturf(A) && R) + spawn(0) + if(!R) return + else R.reaction_turf(A, R.volume+volume_modifier) + if(isobj(A) && R) + spawn(0) + if(!R) return + else R.reaction_obj(A, R.volume+volume_modifier) + return - return trans_data +/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/data=null, var/safety = 0) + if(!isnum(amount)) return 1 + update_total() + if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. + + for(var/A in reagent_list) + + var/datum/reagent/R = A + if (R.id == reagent) + R.on_merge(data, amount) + R.volume += amount + update_total() + if(!safety) + handle_reactions() + my_atom.on_reagent_change() + return 0 + + var/datum/reagent/D = chemical_reagents_list[reagent] + if(D) + + var/datum/reagent/R = new D.type() + reagent_list += R + R.holder = src + R.volume = amount + if(reagent == "paint") + R.color = data + else + SetViruses(R, data) // Includes setting data for blood + + //debug + //world << "Adding data" + //for(var/D in R.data) + // world << "Container data: [D] = [R.data[D]]" + //debug + update_total() + my_atom.on_reagent_change() + if(!safety) + handle_reactions() + return 0 + else + warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + + if(!safety) + handle_reactions() + + return 1 + +/datum/reagents/proc/remove_reagent(var/reagent, var/amount, var/safety = 0)//Added a safety check for the trans_id_to + if(!isnum(amount)) return 1 + + for(var/A in reagent_list) + var/datum/reagent/R = A + if (R.id == reagent) + R.volume -= amount + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + my_atom.on_reagent_change() + return 0 + + return 1 + +/datum/reagents/proc/has_reagent(var/reagent, var/amount = -1) + + for(var/A in reagent_list) + var/datum/reagent/R = A + if (R.id == reagent) + if(!amount) return R + else + if(R.volume >= amount) return R + else return 0 + + return 0 + +/datum/reagents/proc/get_reagent_amount(var/reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if (R.id == reagent) + return R.volume + + return 0 + +/datum/reagents/proc/get_reagents() + var/res = "" + for(var/datum/reagent/A in reagent_list) + if (res != "") res += "," + res += A.name + + return res + +/datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0, var/safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. + if(!isnum(amount)) return 1 + + var/has_removed_reagent = 0 + + for(var/datum/reagent/R in reagent_list) + var/matches = 0 + // Switch between how we check the reagent type + if(strict) + if(R.type == reagent_type) + matches = 1 + else + if(istype(R, reagent_type)) + matches = 1 + // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. + if(matches) + // Have our other proc handle removement + has_removed_reagent = remove_reagent(R.id, amount, safety) + + return has_removed_reagent + +//two helper functions to preserve data across reactions (needed for xenoarch) +/datum/reagents/proc/get_data(var/reagent_id) + for(var/datum/reagent/D in reagent_list) + if(D.id == reagent_id) + //world << "proffering a data-carrying reagent ([reagent_id])" + return D.data + +/datum/reagents/proc/set_data(var/reagent_id, var/new_data) + for(var/datum/reagent/D in reagent_list) + if(D.id == reagent_id) + //world << "reagent data set ([reagent_id])" + D.data = new_data + +/datum/reagents/proc/delete() + for(var/datum/reagent/R in reagent_list) + R.holder = null + if(my_atom) + my_atom.reagents = null + +/datum/reagents/proc/copy_data(var/datum/reagent/current_reagent) + if (current_reagent.id == "paint") return current_reagent.color + if (!current_reagent || !current_reagent.data) return null + if (!istype(current_reagent.data, /list)) return current_reagent.data + + var/list/trans_data = current_reagent.data.Copy() + + // We do this so that introducing a virus to a blood sample + // doesn't automagically infect all other blood samples from + // the same donor. + // + // Technically we should probably copy all data lists, but + // that could possibly eat up a lot of memory needlessly + // if most data lists are read-only. + if (trans_data["virus2"]) + var/list/v = trans_data["virus2"] + trans_data["virus2"] = v.Copy() + + return trans_data /////////////////////////////////////////////////////////////////////////////////// // Convenience proc to create a reagents holder for an atom // Max vol is maximum volume of holder -atom/proc/create_reagents(var/max_vol) +/atom/proc/create_reagents(var/max_vol) reagents = new/datum/reagents(max_vol) reagents.my_atom = src diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 227fe03a4e..5a79e2a3cd 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -37,19 +37,19 @@ /obj/machinery/chem_master/ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) - del(src) + qdel(src) return /obj/machinery/chem_master/blob_act() if (prob(50)) - del(src) + qdel(src) /obj/machinery/chem_master/meteorhit() - del(src) + qdel(src) return /obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) @@ -406,7 +406,7 @@ if(type in diseases) // Make sure this is a disease D = new type(0, null) var/list/data = list("viruses"=list(D)) - var/name = sanitizeSafe(input(usr,"Name:","Name the culture",D.name)) + var/name = sanitizeSafe(input(usr,"Name:","Name the culture",D.name), MAX_NAME_LEN) if(!name || name == " ") name = D.name B.name = "[name] culture bottle" B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." @@ -751,7 +751,7 @@ /obj/machinery/reagentgrinder/proc/remove_object(var/obj/item/O) holdingitems -= O - del(O) + qdel(O) /obj/machinery/reagentgrinder/proc/grind() diff --git a/code/modules/reagents/Chemistry-Reagents-Antidepressants.dm b/code/modules/reagents/Chemistry-Reagents-Antidepressants.dm deleted file mode 100644 index 12ecf3a817..0000000000 --- a/code/modules/reagents/Chemistry-Reagents-Antidepressants.dm +++ /dev/null @@ -1,90 +0,0 @@ -#define ANTIDEPRESSANT_MESSAGE_DELAY 5*60*10 - -/datum/reagent/antidepressant/methylphenidate - name = "Methylphenidate" - id = "methylphenidate" - description = "Improves the ability to concentrate." - reagent_state = LIQUID - color = "#BF80BF" - custom_metabolism = 0.01 - data = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(src.volume <= 0.1) if(data != -1) - data = -1 - M << "\red You lose focus.." - else - if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) - data = world.time - M << "\blue Your mind feels focused and undivided." - ..() - return - -/datum/chemical_reaction/methylphenidate - name = "Methylphenidate" - id = "methylphenidate" - result = "methylphenidate" - required_reagents = list("mindbreaker" = 1, "hydrogen" = 1) - result_amount = 3 - -/datum/reagent/antidepressant/citalopram - name = "Citalopram" - id = "citalopram" - description = "Stabilizes the mind a little." - reagent_state = LIQUID - color = "#FF80FF" - custom_metabolism = 0.01 - data = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(src.volume <= 0.1) if(data != -1) - data = -1 - M << "\red Your mind feels a little less stable.." - else - if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) - data = world.time - M << "\blue Your mind feels stable.. a little stable." - ..() - return - -/datum/chemical_reaction/citalopram - name = "Citalopram" - id = "citalopram" - result = "citalopram" - required_reagents = list("mindbreaker" = 1, "carbon" = 1) - result_amount = 3 - - -/datum/reagent/antidepressant/paroxetine - name = "Paroxetine" - id = "paroxetine" - description = "Stabilizes the mind greatly, but has a chance of adverse effects." - reagent_state = LIQUID - color = "#FF80BF" - custom_metabolism = 0.01 - data = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(src.volume <= 0.1) if(data != -1) - data = -1 - M << "\red Your mind feels much less stable.." - else - if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) - data = world.time - if(prob(90)) - M << "\blue Your mind feels much more stable." - else - M << "\red Your mind breaks apart.." - M.hallucination += 200 - ..() - return - -/datum/chemical_reaction/paroxetine - name = "Paroxetine" - id = "paroxetine" - result = "paroxetine" - required_reagents = list("mindbreaker" = 1, "oxygen" = 1, "inaprovaline" = 1) - result_amount = 3 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 2a73fd5786..b4e6248246 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -8,4417 +8,99 @@ //so that it can continue working when the reagent is deleted while the proc is still active. -datum - reagent - var/name = "Reagent" - var/id = "reagent" - var/description = "" - var/datum/reagents/holder = null - var/reagent_state = SOLID - var/list/data = null - var/volume = 0 - var/nutriment_factor = 0 - var/custom_metabolism = REAGENTS_METABOLISM - var/overdose = 0 - var/overdose_dam = 1 - var/scannable = 0 //shows up on health analyzers - var/glass_icon_state = null - var/glass_name = null - var/glass_desc = null - var/glass_center_of_mass = null - //var/list/viruses = list() - var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) - - proc - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //By default we have a chance to transfer some - if(!istype(M, /mob/living)) return 0 - var/datum/reagent/self = src - src = null //of the reagent to the mob on TOUCHING it. - - if(self.holder) //for catching rare runtimes - if(!istype(self.holder.my_atom, /obj/effect/effect/smoke/chem)) - // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl - - if(method == TOUCH) - - var/chance = 1 - var/block = 0 - - for(var/obj/item/clothing/C in M.get_equipped_items()) - if(C.permeability_coefficient < chance) chance = C.permeability_coefficient - if(istype(C, /obj/item/clothing/suit/bio_suit)) - // bio suits are just about completely fool-proof - Doohl - // kind of a hacky way of making bio suits more resistant to chemicals but w/e - if(prob(75)) - block = 1 - - if(istype(C, /obj/item/clothing/head/bio_hood)) - if(prob(75)) - block = 1 - - chance = chance * 100 - - if(prob(chance) && !block) - if(M.reagents) - M.reagents.add_reagent(self.id,self.volume/2) - return 1 - - reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object - src = null //if it can hold reagents. nope! - //if(O.reagents) - // O.reagents.add_reagent(id,volume/3) - return - - reaction_turf(var/turf/T, var/volume) - src = null - return - - on_mob_life(var/mob/living/M as mob, var/alien) - if(!istype(M, /mob/living)) - return //Noticed runtime errors from pacid trying to damage ghosts, this should fix. --NEO - if( (overdose > 0) && (volume >= overdose))//Overdosing, wooo - M.adjustToxLoss(overdose_dam) - holder.remove_reagent(src.id, custom_metabolism) //By default it slowly disappears. - return - - on_move(var/mob/M) - return - - // Called after add_reagents creates a new reagent. - on_new(var/data) - return - - // Called when two reagents of the same are mixing. <-- Blatant lies - on_merge(var/data) - return - - on_update(var/atom/A) - return - - - - blood - data = new/list("donor"=null,"viruses"=null,"species"="Human","blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = list()) - name = "Blood" - id = "blood" - reagent_state = LIQUID - color = "#C80000" // rgb: 200, 0, 0 - - glass_icon_state = "glass_red" - glass_name = "glass of tomato juice" - glass_desc = "Are you sure this is tomato juice?" - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/blood/self = src - src = null - if(self.data && self.data["viruses"]) - for(var/datum/disease/D in self.data["viruses"]) - //var/datum/disease/virus = new D.type(0, D, 1) - // We don't spread. - if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS) continue - - if(method == TOUCH) - M.contract_disease(D) - else //injected - M.contract_disease(D, 1, 0) - if(self.data && self.data["virus2"] && istype(M, /mob/living/carbon))//infecting... - var/list/vlist = self.data["virus2"] - if (vlist.len) - for (var/ID in vlist) - var/datum/disease2/disease/V = vlist[ID] - - if(method == TOUCH) - infect_virus2(M,V.getcopy()) - else - infect_virus2(M,V.getcopy(),1) //injected, force infection! - if(self.data && self.data["antibodies"] && istype(M, /mob/living/carbon))//... and curing - var/mob/living/carbon/C = M - C.antibodies |= self.data["antibodies"] - - on_merge(var/data) - if(data["blood_colour"]) - color = data["blood_colour"] - return ..() - - on_update(var/atom/A) - if(data["blood_colour"]) - color = data["blood_colour"] - return ..() - - reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place - if(!istype(T)) return - var/datum/reagent/blood/self = src - src = null - if(!(volume >= 3)) return - - if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) - blood_splatter(T,self,1) - else if(istype(self.data["donor"], /mob/living/carbon/alien)) - var/obj/effect/decal/cleanable/blood/B = blood_splatter(T,self,1) - if(B) B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" - return - -/* Must check the transfering of reagents and their data first. They all can point to one disease datum. - - Del() - if(src.data["virus"]) - var/datum/disease/D = src.data["virus"] - D.cure(0) - ..() -*/ - vaccine - //data must contain virus type - name = "Vaccine" - id = "vaccine" - reagent_state = LIQUID - color = "#C81040" // rgb: 200, 16, 64 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/vaccine/self = src - src = null - if(self.data&&method == INGEST) - for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/A = D - if(A.GetDiseaseID() == self.data) - D.cure() - else - if(D.type == self.data) - D.cure() - - M.resistances += self.data - return - - woodpulp - name = "Wood Pulp" - id = "woodpulp" - description = "A mass of wood fibers." - reagent_state = LIQUID - color = "#B97A57" - - #define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L) - water - name = "Water" - id = "water" - description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." - reagent_state = LIQUID - color = "#0064C8" // rgb: 0, 100, 200 - custom_metabolism = 0.01 - - glass_icon_state = "glass_clear" - glass_name = "glass of water" - glass_desc = "The father of all refreshments." - - reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - - //If the turf is hot enough, remove some heat - var/datum/gas_mixture/environment = T.return_air() - var/min_temperature = T0C + 100 //100C, the boiling point of water - - if (environment && environment.temperature > min_temperature) //abstracted as steam or something - var/removed_heat = between(0, volume*WATER_LATENT_HEAT, -environment.get_thermal_energy_change(min_temperature)) - environment.add_thermal_energy(-removed_heat) - if (prob(5)) - T.visible_message("\red The water sizzles as it lands on \the [T]!") - - else //otherwise, the turf gets wet - if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - src = null - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - - //Put out fires. - var/hotspot = (locate(/obj/fire) in T) - if(hotspot) - del(hotspot) - if(environment) - environment.react() //react at the new temperature - - reaction_obj(var/obj/O, var/volume) - var/turf/T = get_turf(O) - var/hotspot = (locate(/obj/fire) in T) - if(hotspot && !istype(T, /turf/space)) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) - lowertemp.react() - T.assume_air(lowertemp) - del(hotspot) - if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) - var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O - if(!cube.wrapped) - cube.Expand() - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if (istype(M, /mob/living/carbon/slime)) - var/mob/living/carbon/slime/S = M - S.apply_water(volume) - if(method == TOUCH && isliving(M)) - M.adjust_fire_stacks(-(volume / 10)) - if(M.fire_stacks <= 0) - M.ExtinguishMob() - return - - water/holywater - name = "Holy Water" - id = "holywater" - description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." - color = "#E0E8EF" // rgb: 224, 232, 239 - - glass_icon_state = "glass_clear" - glass_name = "glass of holy water" - glass_desc = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." - - on_mob_life(var/mob/living/M as mob) - if(ishuman(M)) - if(M.mind && cult.is_antagonist(M.mind) && prob(10)) - cult.remove_antagonist(M.mind) - holder.remove_reagent(src.id, 10 * REAGENTS_METABOLISM) //high metabolism to prevent extended uncult rolls. - return - - lube - name = "Space Lube" - id = "lube" - description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." - reagent_state = LIQUID - color = "#009CA8" // rgb: 0, 156, 168 - overdose = REAGENTS_OVERDOSE - - reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - src = null - if(volume >= 1) - if(T.wet >= 2) return - T.wet = 2 - spawn(800) - if (!istype(T)) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - return - - plasticide - name = "Plasticide" - id = "plasticide" - description = "Liquid plastic, do not eat." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - custom_metabolism = 0.01 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - // Toxins are really weak, but without being treated, last very long. - M.adjustToxLoss(0.2) - ..() - return - - slimetoxin - name = "Mutation Toxin" - id = "mutationtoxin" - description = "A corruptive toxin produced by slimes." - reagent_state = LIQUID - color = "#13BC5E" // rgb: 19, 188, 94 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(ishuman(M)) - var/mob/living/carbon/human/human = M - if(human.species.name != "Slime") - M << "Your flesh rapidly mutates!" - human.set_species("Slime") - ..() - return - - aslimetoxin - name = "Advanced Mutation Toxin" - id = "amutationtoxin" - description = "An advanced corruptive toxin produced by slimes." - reagent_state = LIQUID - color = "#13BC5E" // rgb: 19, 188, 94 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(istype(M, /mob/living/carbon) && M.stat != DEAD) - M << "\red Your flesh rapidly mutates!" - if(M.monkeyizing) return - M.monkeyizing = 1 - M.canmove = 0 - M.icon = null - M.overlays.Cut() - M.invisibility = 101 - for(var/obj/item/W in M) - if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something - del(W) - continue - W.layer = initial(W.layer) - W.loc = M.loc - W.dropped(M) - var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(M.loc) - new_mob.a_intent = I_HURT - new_mob.universal_speak = 1 - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key - del(M) - ..() - return - - inaprovaline - name = "Inaprovaline" - id = "inaprovaline" - description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients." - reagent_state = LIQUID - color = "#00BFFF" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE*2 - scannable = 1 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(!M) M = holder.my_atom - - if(alien && alien == IS_VOX) - M.adjustToxLoss(REAGENTS_METABOLISM) - else - if(M.losebreath >= 10) - M.losebreath = max(10, M.losebreath-5) - - holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) - return - - space_drugs - name = "Space drugs" - id = "space_drugs" - description = "An illegal chemical compound used as drug." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 15) - if(isturf(M.loc) && !istype(M.loc, /turf/space)) - if(M.canmove && !M.restrained()) - if(prob(10)) step(M, pick(cardinal)) - if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) - holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) - return - - serotrotium - name = "Serotrotium" - id = "serotrotium" - description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." - reagent_state = LIQUID - color = "#202040" // rgb: 20, 20, 40 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(ishuman(M)) - if(prob(7)) M.emote(pick("twitch","drool","moan","gasp")) - holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM) - return - - silicate - name = "Silicate" - id = "silicate" - description = "A compound that can be used to reinforce glass." - reagent_state = LIQUID - color = "#C7FFFF" // rgb: 199, 255, 255 - - reaction_obj(var/obj/O, var/volume) - src = null - if(istype(O,/obj/structure/window)) - var/obj/structure/window/W = O - W.apply_silicate(volume) - return - - oxygen - name = "Oxygen" - id = "oxygen" - description = "A colorless, odorless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - custom_metabolism = 0.01 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2) return - if(alien && alien == IS_VOX) - M.adjustToxLoss(REAGENTS_METABOLISM) - holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. - return - ..() - - copper - name = "Copper" - id = "copper" - description = "A highly ductile metal." - color = "#6E3B08" // rgb: 110, 59, 8 - - custom_metabolism = 0.01 - - nitrogen - name = "Nitrogen" - id = "nitrogen" - description = "A colorless, odorless, tasteless gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - custom_metabolism = 0.01 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2) return - if(alien && alien == IS_VOX) - M.adjustOxyLoss(-2*REM) - holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. - return - ..() - - hydrogen - name = "Hydrogen" - id = "hydrogen" - description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - - custom_metabolism = 0.01 - - potassium - name = "Potassium" - id = "potassium" - description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." - reagent_state = SOLID - color = "#A0A0A0" // rgb: 160, 160, 160 - - custom_metabolism = 0.01 - - mercury - name = "Mercury" - id = "mercury" - description = "A chemical element." - reagent_state = LIQUID - color = "#484848" // rgb: 72, 72, 72 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.canmove && !M.restrained() && istype(M.loc, /turf/space)) - step(M, pick(cardinal)) - if(prob(5)) M.emote(pick("twitch","drool","moan")) - M.adjustBrainLoss(2) - ..() - return - - sulfur - name = "Sulfur" - id = "sulfur" - description = "A chemical element with a pungent smell." - reagent_state = SOLID - color = "#BF8C00" // rgb: 191, 140, 0 - - custom_metabolism = 0.01 - - carbon - name = "Carbon" - id = "carbon" - description = "A chemical element, the builing block of life." - reagent_state = SOLID - color = "#1C1300" // rgb: 30, 20, 0 - - custom_metabolism = 0.01 - - reaction_turf(var/turf/T, var/volume) - src = null - if(!istype(T, /turf/space)) - var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, T) - if (!dirtoverlay) - dirtoverlay = new/obj/effect/decal/cleanable/dirt(T) - dirtoverlay.alpha = volume*30 - else - dirtoverlay.alpha = min(dirtoverlay.alpha+volume*30, 255) - - chlorine - name = "Chlorine" - id = "chlorine" - description = "A chemical element with a characteristic odour." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.take_organ_damage(1*REM, 0) - ..() - return - - fluorine - name = "Fluorine" - id = "fluorine" - description = "A highly-reactive chemical element." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1*REM) - ..() - return - - sodium - name = "Sodium" - id = "sodium" - description = "A chemical element, readily reacts with water." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - - custom_metabolism = 0.01 - - phosphorus - name = "Phosphorus" - id = "phosphorus" - description = "A chemical element, the backbone of biological energy carriers." - reagent_state = SOLID - color = "#832828" // rgb: 131, 40, 40 - - custom_metabolism = 0.01 - - lithium - name = "Lithium" - id = "lithium" - description = "A chemical element, used as antidepressant." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.canmove && !M.restrained() && istype(M.loc, /turf/space)) - step(M, pick(cardinal)) - if(prob(5)) M.emote(pick("twitch","drool","moan")) - ..() - return - - sugar - name = "Sugar" - id = "sugar" - description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." - reagent_state = SOLID - color = "#FFFFFF" // rgb: 255, 255, 255 - - glass_icon_state = "iceglass" - glass_name = "glass of sugar" - glass_desc = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." - - on_mob_life(var/mob/living/M as mob) - M.nutrition += 1*REM - ..() - return - - - glycerol - name = "Glycerol" - id = "glycerol" - description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." - reagent_state = LIQUID - color = "#808080" // rgb: 128, 128, 128 - - custom_metabolism = 0.01 - - nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." - reagent_state = LIQUID - color = "#808080" // rgb: 128, 128, 128 - - custom_metabolism = 0.01 - - radium - name = "Radium" - id = "radium" - description = "Radium is an alkaline earth metal. It is extremely radioactive." - reagent_state = SOLID - color = "#C7C7C7" // rgb: 199,199,199 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.apply_effect(2*REM,IRRADIATE,0) - // radium may increase your chances to cure a disease - if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs - var/mob/living/carbon/C = M - if(C.virus2.len) - for (var/ID in C.virus2) - var/datum/disease2/disease/V = C.virus2[ID] - if(prob(5)) - C.antibodies |= V.antigen - if(prob(50)) - M.radiation += 50 // curing it that way may kill you instead - var/absorbed - var/obj/item/organ/diona/nutrients/rad_organ = locate() in C.internal_organs - if(rad_organ && !rad_organ.is_broken()) - absorbed = 1 - if(!absorbed) - M.adjustToxLoss(100) - ..() - return - - reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T) - if(!glow) - new /obj/effect/decal/cleanable/greenglow(T) - return - - - ryetalyn - name = "Ryetalyn" - id = "ryetalyn" - description = "Ryetalyn can cure all genetic abnomalities via a catalytic process." - reagent_state = SOLID - color = "#004000" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - - var/needs_update = M.mutations.len > 0 - - M.mutations = list() - M.disabilities = 0 - M.sdisabilities = 0 - - // Might need to update appearance for hulk etc. - if(needs_update && ishuman(M)) - var/mob/living/carbon/human/H = M - H.update_mutations() - - ..() - return - - thermite - name = "Thermite" - id = "thermite" - description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." - reagent_state = SOLID - color = "#673910" // rgb: 103, 57, 16 - - reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 5) - if(istype(T, /turf/simulated/wall)) - var/turf/simulated/wall/W = T - W.thermite = 1 - W.overlays += image('icons/effects/effects.dmi',icon_state = "#673910") - return - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustFireLoss(1) - ..() - return - - paracetamol - name = "Paracetamol" - id = "paracetamol" - description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller." - reagent_state = LIQUID - color = "#C8A5DC" - overdose = 60 - scannable = 1 - custom_metabolism = 0.025 // Lasts 10 minutes for 15 units - - on_mob_life(var/mob/living/M as mob) - if (volume > overdose) - M.hallucination = max(M.hallucination, 2) - ..() - return - - tramadol - name = "Tramadol" - id = "tramadol" - description = "A simple, yet effective painkiller." - reagent_state = LIQUID - color = "#CB68FC" - overdose = 30 - scannable = 1 - custom_metabolism = 0.025 // Lasts 10 minutes for 15 units - - on_mob_life(var/mob/living/M as mob) - if (volume > overdose) - M.hallucination = max(M.hallucination, 2) - ..() - return - - oxycodone - name = "Oxycodone" - id = "oxycodone" - description = "An effective and very addictive painkiller." - reagent_state = LIQUID - color = "#800080" - overdose = 20 - custom_metabolism = 0.25 // Lasts 10 minutes for 15 units - - on_mob_life(var/mob/living/M as mob) - if (volume > overdose) - M.druggy = max(M.druggy, 10) - M.hallucination = max(M.hallucination, 3) - ..() - return - - - virus_food - name = "Virus Food" - id = "virusfood" - description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#899613" // rgb: 137, 150, 19 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.nutrition += nutriment_factor*REM - ..() - return - - sterilizine - name = "Sterilizine" - id = "sterilizine" - description = "Sterilizes wounds in preparation for surgery." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - - //makes you squeaky clean - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if (method == TOUCH) - M.germ_level -= min(volume*20, M.germ_level) - - reaction_obj(var/obj/O, var/volume) - O.germ_level -= min(volume*20, O.germ_level) - - reaction_turf(var/turf/T, var/volume) - T.germ_level -= min(volume*20, T.germ_level) - - /* reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - src = null - if (method==TOUCH) - if(istype(M, /mob/living/carbon/human)) - if(M.health >= -100 && M.health <= 0) - M.crit_op_stage = 0.0 - if (method==INGEST) - usr << "Well, that was stupid." - M.adjustToxLoss(3) - return - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.radiation += 3 - ..() - return - */ - iron - name = "Iron" - id = "iron" - description = "Pure iron is a metal." - reagent_state = SOLID - color = "#353535" - overdose = REAGENTS_OVERDOSE - - gold - name = "Gold" - id = "gold" - description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." - reagent_state = SOLID - color = "#F7C430" // rgb: 247, 196, 48 - - silver - name = "Silver" - id = "silver" - description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." - reagent_state = SOLID - color = "#D0D0D0" // rgb: 208, 208, 208 - - uranium - name ="Uranium" - id = "uranium" - description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." - reagent_state = SOLID - color = "#B8B8C0" // rgb: 184, 184, 192 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.apply_effect(1,IRRADIATE,0) - ..() - return - - reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/space)) - var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T) - if(!glow) - new /obj/effect/decal/cleanable/greenglow(T) - return - - aluminum - name = "Aluminum" - id = "aluminum" - description = "A silvery white and ductile member of the boron group of chemical elements." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - - silicon - name = "Silicon" - id = "silicon" - description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - - fuel - name = "Welding fuel" - id = "fuel" - description = "Required for welders. Flamable." - reagent_state = LIQUID - color = "#660000" // rgb: 102, 0, 0 - overdose = REAGENTS_OVERDOSE - - glass_icon_state = "dr_gibb_glass" - glass_name = "glass of welder fuel" - glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption." - - reaction_obj(var/obj/O, var/volume) - var/turf/the_turf = get_turf(O) - if(!the_turf) - return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO - new /obj/effect/decal/cleanable/liquid_fuel(the_turf, volume) - reaction_turf(var/turf/T, var/volume) - new /obj/effect/decal/cleanable/liquid_fuel(T, volume) - return - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1) - ..() - return - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 10) - return - - space_cleaner - name = "Space cleaner" - id = "cleaner" - description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" - reagent_state = LIQUID - color = "#A5F0EE" // rgb: 165, 240, 238 - overdose = REAGENTS_OVERDOSE - - reaction_obj(var/obj/O, var/volume) - if(istype(O,/obj/effect/decal/cleanable)) - del(O) - else - if(O) - O.clean_blood() - - reaction_turf(var/turf/T, var/volume) - if(volume >= 1) - if(istype(T, /turf/simulated)) - var/turf/simulated/S = T - S.dirt = 0 - T.clean_blood() - for(var/obj/effect/decal/cleanable/C in T.contents) - src.reaction_obj(C, volume) - del(C) - - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(5,10)) - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(C.r_hand) - C.r_hand.clean_blood() - if(C.l_hand) - C.l_hand.clean_blood() - if(C.wear_mask) - if(C.wear_mask.clean_blood()) - C.update_inv_wear_mask(0) - if(ishuman(M)) - var/mob/living/carbon/human/H = C - if(H.head) - if(H.head.clean_blood()) - H.update_inv_head(0) - if(H.wear_suit) - if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0) - else if(H.w_uniform) - if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0) - if(H.shoes) - if(H.shoes.clean_blood()) - H.update_inv_shoes(0) - else - H.clean_blood(1) - return - M.clean_blood() - - leporazine - name = "Leporazine" - id = "leporazine" - description = "Leporazine can be use to stabilize an individuals body temperature." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.bodytemperature > 310) - M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) - else if(M.bodytemperature < 311) - M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) - ..() - return - - cryptobiolin - name = "Cryptobiolin" - id = "cryptobiolin" - description = "Cryptobiolin causes confusion and dizzyness." - reagent_state = LIQUID - color = "#000055" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.make_dizzy(1) - if(!M.confused) M.confused = 1 - M.confused = max(M.confused, 20) - holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) - ..() - return - - - kelotane - name = "Kelotane" - id = "kelotane" - description = "Kelotane is a drug used to treat burns." - reagent_state = LIQUID - color = "#FFA800" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(M.stat == 2.0) - return - if(!M) M = holder.my_atom - //This needs a diona check but if one is added they won't be able to heal burn damage at all. - M.heal_organ_damage(0,2*REM) - ..() - return - - dermaline - name = "Dermaline" - id = "dermaline" - description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue." - reagent_state = LIQUID - color = "#FF8000" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE/2 - scannable = 1 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2.0) //THE GUY IS **DEAD**! BEREFT OF ALL LIFE HE RESTS IN PEACE etc etc. He does NOT metabolise shit anymore, god DAMN - return - if(!M) M = holder.my_atom - if(!alien || alien != IS_DIONA) - M.heal_organ_damage(0,3*REM) - ..() - return - - dexalin - name = "Dexalin" - id = "dexalin" - description = "Dexalin is used in the treatment of oxygen deprivation." - reagent_state = LIQUID - color = "#0080FF" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2.0) - return //See above, down and around. --Agouri - if(!M) M = holder.my_atom - - if(alien && alien == IS_VOX) - M.adjustToxLoss(2*REM) - else if(!alien || alien != IS_DIONA) - M.adjustOxyLoss(-2*REM) - - holder.remove_reagent("lexorin", 2*REM) - ..() - return - - dexalinp - name = "Dexalin Plus" - id = "dexalinp" - description = "Dexalin Plus is used in the treatment of oxygen deprivation. It is highly effective." - reagent_state = LIQUID - color = "#0040FF" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE/2 - scannable = 1 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2.0) - return - if(!M) M = holder.my_atom - - if(alien && alien == IS_VOX) - M.adjustOxyLoss() - else if(!alien || alien != IS_DIONA) - M.adjustOxyLoss(-M.getOxyLoss()) - - holder.remove_reagent("lexorin", 2*REM) - ..() - return - - tricordrazine - name = "Tricordrazine" - id = "tricordrazine" - description = "Tricordrazine is a highly potent stimulant, originally derived from cordrazine. Can be used to treat a wide range of injuries." - reagent_state = LIQUID - color = "#8040FF" // rgb: 200, 165, 220 - scannable = 1 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2.0) - return - if(!M) M = holder.my_atom - if(!alien || alien != IS_DIONA) - if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM) - if(M.getBruteLoss() && prob(80)) M.heal_organ_damage(1*REM,0) - if(M.getFireLoss() && prob(80)) M.heal_organ_damage(0,1*REM) - if(M.getToxLoss() && prob(80)) M.adjustToxLoss(-1*REM) - ..() - return - - anti_toxin - name = "Dylovene" - id = "anti_toxin" - description = "Dylovene is a broad-spectrum antitoxin." - reagent_state = LIQUID - color = "#00A000" // rgb: 200, 165, 220 - scannable = 1 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(!M) M = holder.my_atom - if(!alien || alien != IS_DIONA) - M.reagents.remove_all_type(/datum/reagent/toxin, 1*REM, 0, 1) - M.drowsyness = max(M.drowsyness-2*REM, 0) - M.hallucination = max(0, M.hallucination - 5*REM) - M.adjustToxLoss(-2*REM) - ..() - return - - adminordrazine //An OP chemical for admins - name = "Adminordrazine" - id = "adminordrazine" - description = "It's magic. We don't have to explain it." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - - glass_icon_state = "golden_cup" - glass_name = "golden cup" - glass_desc = "It's magic. We don't have to explain it." - - on_mob_life(var/mob/living/carbon/M as mob) - if(!M) M = holder.my_atom ///This can even heal dead people. - M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) - M.setCloneLoss(0) - M.setOxyLoss(0) - M.radiation = 0 - M.heal_organ_damage(5,5) - M.adjustToxLoss(-5) - M.hallucination = 0 - M.setBrainLoss(0) - M.disabilities = 0 - M.sdisabilities = 0 - M.eye_blurry = 0 - M.eye_blind = 0 - M.SetWeakened(0) - M.SetStunned(0) - M.SetParalysis(0) - M.silent = 0 - M.dizziness = 0 - M.drowsyness = 0 - M.stuttering = 0 - M.confused = 0 - M.sleeping = 0 - M.jitteriness = 0 - for(var/datum/disease/D in M.viruses) - D.spread = "Remissive" - D.stage-- - if(D.stage < 1) - D.cure() - ..() - return - synaptizine - - name = "Synaptizine" - id = "synaptizine" - description = "Synaptizine is used to treat various diseases." - reagent_state = LIQUID - color = "#99CCFF" // rgb: 200, 165, 220 - custom_metabolism = 0.01 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.drowsyness = max(M.drowsyness-5, 0) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - holder.remove_reagent("mindbreaker", 5) - M.hallucination = max(0, M.hallucination - 10) - if(prob(60)) M.adjustToxLoss(1) - ..() - return - - impedrezene - name = "Impedrezene" - id = "impedrezene" - description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.jitteriness = max(M.jitteriness-5,0) - if(prob(80)) M.adjustBrainLoss(1*REM) - if(prob(50)) M.drowsyness = max(M.drowsyness, 3) - if(prob(10)) M.emote("drool") - ..() - return - - hyronalin - name = "Hyronalin" - id = "hyronalin" - description = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." - reagent_state = LIQUID - color = "#408000" // rgb: 200, 165, 220 - custom_metabolism = 0.05 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.radiation = max(M.radiation-3*REM,0) - ..() - return - - arithrazine - name = "Arithrazine" - id = "arithrazine" - description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." - reagent_state = LIQUID - color = "#008000" // rgb: 200, 165, 220 - custom_metabolism = 0.05 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(M.stat == 2.0) - return //See above, down and around. --Agouri - if(!M) M = holder.my_atom - M.radiation = max(M.radiation-7*REM,0) - M.adjustToxLoss(-1*REM) - if(prob(15)) - M.take_organ_damage(1, 0) - ..() - return - - alkysine - name = "Alkysine" - id = "alkysine" - description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." - reagent_state = LIQUID - color = "#FFFF66" // rgb: 200, 165, 220 - custom_metabolism = 0.05 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustBrainLoss(-3*REM) - ..() - return - - imidazoline - name = "Imidazoline" - id = "imidazoline" - description = "Heals eye damage" - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.eye_blurry = max(M.eye_blurry-5 , 0) - M.eye_blind = max(M.eye_blind-5 , 0) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - if(E && istype(E)) - if(E.damage > 0) - E.damage = max(E.damage - 1, 0) - ..() - return - - peridaxon - name = "Peridaxon" - id = "peridaxon" - description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." - reagent_state = LIQUID - color = "#561EC3" // rgb: 200, 165, 220 - overdose = 10 - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - //Peridaxon heals only non-robotic organs - for(var/obj/item/organ/I in H.internal_organs) - if((I.damage > 0) && (I.robotic != 2)) - I.damage = max(I.damage - 0.20, 0) - ..() - return - - bicaridine - name = "Bicaridine" - id = "bicaridine" - description = "Bicaridine is an analgesic medication and can be used to treat blunt trauma." - reagent_state = LIQUID - color = "#BF0000" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob, var/alien) - if(M.stat == 2.0) - return - if(!M) M = holder.my_atom - if(alien != IS_DIONA) - M.heal_organ_damage(2*REM,0) - ..() - return - - hyperzine - name = "Hyperzine" - id = "hyperzine" - description = "Hyperzine is a highly effective, long lasting, muscle stimulant." - reagent_state = LIQUID - color = "#FF3300" // rgb: 200, 165, 220 - custom_metabolism = 0.03 - overdose = REAGENTS_OVERDOSE/2 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(5)) M.emote(pick("twitch","blink_r","shiver")) - ..() - return - - adrenaline - name = "Adrenaline" - id = "adrenaline" - description = "Adrenaline is a hormone used as a drug to treat cardiac arrest and other cardiac dysrhythmias resulting in diminished or absent cardiac output." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.SetParalysis(0) - M.SetWeakened(0) - M.adjustToxLoss(rand(3)) - ..() - return - - cryoxadone - name = "Cryoxadone" - id = "cryoxadone" - description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." - reagent_state = LIQUID - color = "#8080FF" // rgb: 200, 165, 220 - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.bodytemperature < 170) - M.adjustCloneLoss(-1) - M.adjustOxyLoss(-1) - M.heal_organ_damage(1,1) - M.adjustToxLoss(-1) - ..() - return - - clonexadone - name = "Clonexadone" - id = "clonexadone" - description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' the cloning process when used in conjunction with a cryo tube." - reagent_state = LIQUID - color = "#80BFFF" // rgb: 200, 165, 220 - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.bodytemperature < 170) - M.adjustCloneLoss(-3) - M.adjustOxyLoss(-3) - M.heal_organ_damage(3,3) - M.adjustToxLoss(-3) - ..() - return - - rezadone - name = "Rezadone" - id = "rezadone" - description = "A powder derived from fish toxin, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." - reagent_state = SOLID - color = "#669900" // rgb: 102, 153, 0 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - data++ - switch(data) - if(1 to 15) - M.adjustCloneLoss(-1) - M.heal_organ_damage(1,1) - if(15 to 35) - M.adjustCloneLoss(-2) - M.heal_organ_damage(2,1) - M.status_flags &= ~DISFIGURED - if(35 to INFINITY) - M.adjustToxLoss(1) - M.make_dizzy(5) - M.make_jittery(5) - - ..() - return - - spaceacillin - name = "Spaceacillin" - id = "spaceacillin" - description = "An all-purpose antiviral agent." - reagent_state = LIQUID - color = "#C1C1C1" // rgb: 200, 165, 220 - custom_metabolism = 0.01 - overdose = REAGENTS_OVERDOSE - scannable = 1 - - on_mob_life(var/mob/living/M as mob) - ..() - return - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - nanites - name = "Nanomachines" - id = "nanites" - description = "Microscopic construction robots." - reagent_state = LIQUID - color = "#535E66" // rgb: 83, 94, 102 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.contract_disease(new /datum/disease/robotic_transformation(0),1) - - xenomicrobes - name = "Xenomicrobes" - id = "xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - reagent_state = LIQUID - color = "#535E66" // rgb: 83, 94, 102 - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.contract_disease(new /datum/disease/xeno_transformation(0),1) - - fluorosurfactant//foam precursor - name = "Fluorosurfactant" - id = "fluorosurfactant" - description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." - reagent_state = LIQUID - color = "#9E6B38" // rgb: 158, 107, 56 - - foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. - name = "Foaming agent" - id = "foaming_agent" - description = "A agent that yields metallic foam when mixed with light metal and a strong acid." - reagent_state = SOLID - color = "#664B63" // rgb: 102, 75, 99 - - nicotine - name = "Nicotine" - id = "nicotine" - description = "A highly addictive stimulant extracted from the tobacco plant." - reagent_state = LIQUID - color = "#181818" // rgb: 24, 24, 24 - - ammonia - name = "Ammonia" - id = "ammonia" - description = "A caustic substance commonly used in fertilizer or household cleaners." - reagent_state = GAS - color = "#404030" // rgb: 64, 64, 48 - - ultraglue - name = "Ultra Glue" - id = "glue" - description = "An extremely powerful bonding agent." - color = "#FFFFCC" // rgb: 255, 255, 204 - - diethylamine - name = "Diethylamine" - id = "diethylamine" - description = "A secondary amine, mildly corrosive." - reagent_state = LIQUID - color = "#604030" // rgb: 96, 64, 48 - - ethylredoxrazine // FUCK YOU, ALCOHOL - name = "Ethylredoxrazine" - id = "ethylredoxrazine" - description = "A powerful oxidizer that reacts with ethanol." - reagent_state = SOLID - color = "#605048" // rgb: 96, 80, 72 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.dizziness = 0 - M.drowsyness = 0 - M.stuttering = 0 - M.confused = 0 - M.reagents.remove_all_type(/datum/reagent/ethanol, 1*REM, 0, 1) - ..() - return - -//////////////////////////Ground crayons///////////////////// - - - crayon_dust - name = "Crayon dust" - id = "crayon_dust" - description = "Intensely coloured powder obtained by grinding crayons." - reagent_state = LIQUID - color = "#888888" - overdose = 5 - - red - name = "Red crayon dust" - id = "crayon_dust_red" - color = "#FE191A" - - orange - name = "Orange crayon dust" - id = "crayon_dust_orange" - color = "#FFBE4F" - - yellow - name = "Yellow crayon dust" - id = "crayon_dust_yellow" - color = "#FDFE7D" - - green - name = "Green crayon dust" - id = "crayon_dust_green" - color = "#18A31A" - - blue - name = "Blue crayon dust" - id = "crayon_dust_blue" - color = "#247CFF" - - purple - name = "Purple crayon dust" - id = "crayon_dust_purple" - color = "#CC0099" - - grey //Mime - name = "Grey crayon dust" - id = "crayon_dust_grey" - color = "#808080" - - brown //Rainbow - name = "Brown crayon dust" - id = "crayon_dust_brown" - color = "#846F35" - -//////////////////////////Paint////////////////////////////// - - paint - name = "Paint" - id = "paint" - description = "This paint will stick to almost any object." - reagent_state = LIQUID - color = "#808080" - overdose = 15 - - reaction_turf(var/turf/T, var/volume) - ..() - if(istype(T) && !istype(T, /turf/space)) - T.color = color - - reaction_obj(var/obj/O, var/volume) - ..() - if(istype(O,/obj)) - O.color = color - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - ..() - if(istype(M,/mob) && !istype(M,/mob/dead)) - //painting ghosts: not allowed - M.color = color - - -//////////////////////////Poison stuff/////////////////////// - - toxin - name = "Toxin" - id = "toxin" - description = "A toxic chemical." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - var/toxpwr = 0.7 // Toxins are really weak, but without being treated, last very long. - custom_metabolism = 0.1 - - on_mob_life(var/mob/living/M as mob,var/alien) - if(!M) M = holder.my_atom - if(toxpwr) - M.adjustToxLoss(toxpwr*REM) - if(alien) ..() // Kind of a catch-all for aliens without the liver. Because this does not metabolize 'naturally', only removed by the liver. - return - - toxin/amatoxin - name = "Amatoxin" - id = "amatoxin" - description = "A powerful poison derived from certain species of mushroom." - reagent_state = LIQUID - color = "#792300" // rgb: 121, 35, 0 - toxpwr = 1 - - toxin/mutagen - name = "Unstable mutagen" - id = "mutagen" - description = "Might cause unpredictable mutations. Keep away from children." - reagent_state = LIQUID - color = "#13BC5E" // rgb: 19, 188, 94 - toxpwr = 0 - - reaction_mob(var/mob/living/carbon/M, var/method=TOUCH, var/volume) - if(!..()) return - if(!istype(M) || !M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - src = null - if((method==TOUCH && prob(33)) || method==INGEST) - randmuti(M) - if(prob(98)) randmutb(M) - else randmutg(M) - domutcheck(M, null) - M.UpdateAppearance() - return - on_mob_life(var/mob/living/carbon/M) - if(!istype(M)) return - if(!M) M = holder.my_atom - M.apply_effect(10,IRRADIATE,0) - ..() - return - - toxin/phoron - name = "Phoron" - id = "phoron" - description = "Phoron in its liquid form." - reagent_state = LIQUID - color = "#9D14DB" - toxpwr = 3 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - holder.remove_reagent("inaprovaline", 2*REM) - ..() - return - reaction_obj(var/obj/O, var/volume) - src = null - /*if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg/slime)) - var/obj/item/weapon/reagent_containers/food/snacks/egg/slime/egg = O - if (egg.grown) - egg.Hatch()*/ - if((!O) || (!volume)) return 0 - var/turf/the_turf = get_turf(O) - the_turf.assume_gas("volatile_fuel", volume, T20C) - reaction_turf(var/turf/T, var/volume) - src = null - T.assume_gas("volatile_fuel", volume, T20C) - return - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel! - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 5) - return - - toxin/lexorin - name = "Lexorin" - id = "lexorin" - description = "Lexorin temporarily stops respiration. Causes tissue damage." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - toxpwr = 0 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(M.stat == 2.0) - return - if(!M) M = holder.my_atom - if(prob(33)) - M.take_organ_damage(1*REM, 0) - if(M.losebreath < 15) - M.losebreath++ - ..() - return - - toxin/slimejelly - name = "Slime Jelly" - id = "slimejelly" - description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." - reagent_state = LIQUID - color = "#801E28" // rgb: 128, 30, 40 - toxpwr = 0 - - on_mob_life(var/mob/living/M as mob) - if(prob(10)) - M << "\red Your insides are burning!" - M.adjustToxLoss(rand(20,60)*REM) - else if(prob(40)) - M.heal_organ_damage(5*REM,0) - ..() - return - - toxin/cyanide //Fast and Lethal - name = "Cyanide" - id = "cyanide" - description = "A highly toxic chemical." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - toxpwr = 4 - custom_metabolism = 0.4 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustOxyLoss(4*REM) - M.sleeping += 1 - ..() - return - - toxin/minttoxin - name = "Mint Toxin" - id = "minttoxin" - description = "Useful for dealing with undesirable customers." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - toxpwr = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if (FAT in M.mutations) - M.gib() - ..() - return - - toxin/carpotoxin - name = "Carpotoxin" - id = "carpotoxin" - description = "A deadly neurotoxin produced by the dreaded space carp." - reagent_state = LIQUID - color = "#003333" // rgb: 0, 51, 51 - toxpwr = 2 - - toxin/zombiepowder - name = "Zombie Powder" - id = "zombiepowder" - description = "A strong neurotoxin that puts the subject into a death-like state." - reagent_state = SOLID - color = "#669900" // rgb: 102, 153, 0 - toxpwr = 0.5 - - on_mob_life(var/mob/living/carbon/M as mob) - if(!M) M = holder.my_atom - M.status_flags |= FAKEDEATH - M.adjustOxyLoss(0.5*REM) - M.Weaken(10) - M.silent = max(M.silent, 10) - M.tod = worldtime2text() - ..() - return - - Del() - if(holder && ismob(holder.my_atom)) - var/mob/M = holder.my_atom - M.status_flags &= ~FAKEDEATH - ..() - - toxin/mindbreaker - name = "Mindbreaker Toxin" - id = "mindbreaker" - description = "A powerful hallucinogen, it can cause fatal effects in users." - reagent_state = LIQUID - color = "#B31008" // rgb: 139, 166, 233 - toxpwr = 0 - custom_metabolism = 0.05 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M) - if(!M) M = holder.my_atom - M.hallucination += 10 - ..() - return - - //Reagents used for plant fertilizers. - toxin/fertilizer - name = "fertilizer" - id = "fertilizer" - description = "A chemical mix good for growing plants with." - reagent_state = LIQUID - toxpwr = 0.2 //It's not THAT poisonous. - color = "#664330" // rgb: 102, 67, 48 - - toxin/fertilizer/eznutrient - name = "EZ Nutrient" - id = "eznutrient" - - toxin/fertilizer/left4zed - name = "Left-4-Zed" - id = "left4zed" - - toxin/fertilizer/robustharvest - name = "Robust Harvest" - id = "robustharvest" - - toxin/plantbgone - name = "Plant-B-Gone" - id = "plantbgone" - description = "A harmful toxic mixture to kill plantlife. Do not ingest!" - reagent_state = LIQUID - color = "#49002E" // rgb: 73, 0, 46 - toxpwr = 1 - - // 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) - if(istype(O,/obj/effect/alien/weeds/)) - var/obj/effect/alien/weeds/alien_weeds = O - alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast - alien_weeds.healthcheck() - else if(istype(O,/obj/effect/plant)) - var/obj/effect/plant/plant = O - plant.die_off() - else if(istype(O,/obj/machinery/portable_atmospherics/hydroponics)) - var/obj/machinery/portable_atmospherics/hydroponics/tray = O - - if(tray.seed) - tray.health -= rand(30,50) - if(tray.pestlevel > 0) - tray.pestlevel -= 2 - if(tray.weedlevel > 0) - tray.weedlevel -= 3 - tray.toxins += 4 - tray.check_level_sanity() - tray.update_icon() - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - src = null - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!C.wear_mask) // If not wearing a mask - C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.dna) - if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage - H.adjustToxLoss(50) - - toxin/stoxin - name = "Soporific" - id = "stoxin" - description = "An effective hypnotic used to treat insomnia." - reagent_state = LIQUID - color = "#009CA8" // rgb: 232, 149, 204 - toxpwr = 0 - custom_metabolism = 0.1 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - switch(data) - if(1 to 12) - if(prob(5)) M.emote("yawn") - if(12 to 15) - M.eye_blurry = max(M.eye_blurry, 10) - if(15 to 49) - if(prob(50)) - M.Weaken(2) - M.drowsyness = max(M.drowsyness, 20) - if(50 to INFINITY) - M.sleeping = max(M.sleeping, 20) - M.drowsyness = max(M.drowsyness, 60) - data++ - ..() - return - - toxin/chloralhydrate - name = "Chloral Hydrate" - id = "chloralhydrate" - description = "A powerful sedative." - reagent_state = SOLID - color = "#000067" // rgb: 0, 0, 103 - toxpwr = 1 - custom_metabolism = 0.1 //Default 0.2 - overdose = 15 - overdose_dam = 5 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - data++ - switch(data) - if(1) - M.confused += 2 - M.drowsyness += 2 - if(2 to 20) - M.Weaken(30) - M.eye_blurry = max(M.eye_blurry, 10) - if(20 to INFINITY) - M.sleeping = max(M.sleeping, 30) - ..() - return - - toxin/potassium_chloride - name = "Potassium Chloride" - id = "potassium_chloride" - description = "A delicious salt that stops the heart when injected into cardiac muscle." - reagent_state = SOLID - color = "#FFFFFF" // rgb: 255,255,255 - toxpwr = 0 - overdose = 30 - - on_mob_life(var/mob/living/carbon/M as mob) - var/mob/living/carbon/human/H = M - if(H.stat != 1) - if (volume >= overdose) - if(H.losebreath >= 10) - H.losebreath = max(10, H.losebreath-10) - H.adjustOxyLoss(2) - H.Weaken(10) - ..() - return - - toxin/potassium_chlorophoride - name = "Potassium Chlorophoride" - id = "potassium_chlorophoride" - description = "A specific chemical based on Potassium Chloride to stop the heart for surgery. Not safe to eat!" - reagent_state = SOLID - color = "#FFFFFF" // rgb: 255,255,255 - toxpwr = 2 - overdose = 20 - - on_mob_life(var/mob/living/carbon/M as mob) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.stat != 1) - if(H.losebreath >= 10) - H.losebreath = max(10, M.losebreath-10) - H.adjustOxyLoss(2) - H.Weaken(10) - ..() - return - - toxin/beer2 //disguised as normal beer for use by emagged brobots - name = "Beer" - id = "beer2" - description = "An alcoholic beverage made from malted grains, hops, yeast, and water. The fermentation appears to be incomplete." //If the players manage to analyze this, they deserve to know something is wrong. - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - custom_metabolism = 0.15 // Sleep toxins should always be consumed pretty fast - overdose = REAGENTS_OVERDOSE/2 - - glass_icon_state = "beerglass" - glass_name = "glass of beer" - glass_desc = "A freezing pint of beer" - glass_center_of_mass = list("x"=16, "y"=8) - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - switch(data) - if(1) - M.confused += 2 - M.drowsyness += 2 - if(2 to 50) - M.sleeping += 1 - if(51 to INFINITY) - M.sleeping += 1 - M.adjustToxLoss((data - 50)*REM) - data++ - ..() - return - - toxin/acid - name = "Sulphuric acid" - id = "sacid" - description = "A very corrosive mineral acid with the molecular formula H2SO4." - reagent_state = LIQUID - color = "#DB5008" // rgb: 219, 80, 8 - toxpwr = 1 - var/meltprob = 10 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.take_organ_damage(0, 1*REM) - ..() - return - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//magic numbers everywhere - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - - if(H.head) - if(prob(meltprob) && !H.head.unacidable) - H << "Your headgear melts away but protects you from the acid!" - del(H.head) - H.update_inv_head(0) - H.update_hair(0) - else - H << "Your headgear protects you from the acid." - return - - if(H.wear_mask) - if(prob(meltprob) && !H.wear_mask.unacidable) - H << "Your mask melts away but protects you from the acid!" - del (H.wear_mask) - H.update_inv_wear_mask(0) - H.update_hair(0) - else - H << "Your mask protects you from the acid." - return - - if(H.glasses) //Doesn't protect you from the acid but can melt anyways! - if(prob(meltprob) && !H.glasses.unacidable) - H << "Your glasses melts away!" - del (H.glasses) - H.update_inv_glasses(0) - - if(!M.unacidable) - if(istype(M, /mob/living/carbon/human) && volume >= 10) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/affecting = H.get_organ("head") - if(affecting) - if(affecting.take_damage(4*toxpwr, 2*toxpwr)) - H.UpdateDamageIcon() - if(prob(meltprob)) //Applies disfigurement - if (!(H.species && (H.species.flags & NO_PAIN))) - H.emote("scream") - H.status_flags |= DISFIGURED - else - M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) // uses min() and volume to make sure they aren't being sprayed in trace amounts (1 unit != insta rape) -- Doohl - else - if(!M.unacidable) - M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) - - reaction_obj(var/obj/O, var/volume) - if((istype(O,/obj/item) || istype(O,/obj/effect/plant)) && prob(meltprob * 3)) - if(!O.unacidable) - var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) - I.desc = "Looks like this was \an [O] some time ago." - for(var/mob/M in viewers(5, O)) - M << "\red \the [O] melts." - del(O) - - toxin/acid/polyacid - name = "Polytrinic acid" - id = "pacid" - description = "Polytrinic acid is a an extremely corrosive chemical substance." - reagent_state = LIQUID - color = "#8E18A9" // rgb: 142, 24, 169 - toxpwr = 2 - meltprob = 30 - -/////////////////////////Food Reagents//////////////////////////// -// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food -// condiments, additives, and such go. - nutriment - name = "Nutriment" - id = "nutriment" - description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." - reagent_state = SOLID - nutriment_factor = 15 * REAGENTS_METABOLISM - color = "#664330" // rgb: 102, 67, 48 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(50)) M.heal_organ_damage(1,0) - M.nutrition += nutriment_factor // For hunger and fatness - ..() - return - - nutriment/protein // Bad for Skrell! - name = "animal protein" - id = "protein" - color = "#440000" - - on_mob_life(var/mob/living/M, var/alien) - if(alien && alien == IS_SKRELL) - M.adjustToxLoss(0.5) - M.nutrition -= nutriment_factor - ..() - - nutriment/egg // Also bad for skrell. Not a child of protein because it might mess up, not sure. - name = "egg yolk" - id = "egg" - color = "#FFFFAA" - - on_mob_life(var/mob/living/M, var/alien) - if(alien && alien == IS_SKRELL) - M.adjustToxLoss(0.5) - M.nutrition -= nutriment_factor - ..() - - lipozine - name = "Lipozine" // The anti-nutriment. - id = "lipozine" - description = "A chemical compound that causes a powerful fat-burning reaction." - reagent_state = LIQUID - nutriment_factor = 10 * REAGENTS_METABOLISM - color = "#BBEDA4" // rgb: 187, 237, 164 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.nutrition = max(M.nutrition - nutriment_factor, 0) - M.overeatduration = 0 - if(M.nutrition < 0)//Prevent from going into negatives. - M.nutrition = 0 - ..() - return - - soysauce - name = "Soysauce" - id = "soysauce" - description = "A salty sauce made from the soy plant." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#792300" // rgb: 121, 35, 0 - - ketchup - name = "Ketchup" - id = "ketchup" - description = "Ketchup, catsup, whatever. It's tomato paste." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#731008" // rgb: 115, 16, 8 - - capsaicin - name = "Capsaicin Oil" - id = "capsaicin" - description = "This is what makes chilis hot." - reagent_state = LIQUID - color = "#B31008" // rgb: 179, 16, 8 - - on_mob_life(var/mob/living/M as mob) - if(!M) - M = holder.my_atom - if(!data) - data = 1 - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && !(H.species.flags & (NO_PAIN | IS_SYNTHETIC)) ) - switch(data) - if(1 to 2) - H << "\red Your insides feel uncomfortably hot !" - if(2 to 20) - if(prob(5)) - H << "\red Your insides feel uncomfortably hot !" - if(20 to INFINITY) - H.apply_effect(2,AGONY,0) - if(prob(5)) - H.visible_message("[H] [pick("dry heaves!","coughs!","splutters!")]") - H << "\red You feel like your insides are burning !" - else if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(10,25) - holder.remove_reagent("frostoil", 5) - holder.remove_reagent(src.id, FOOD_METABOLISM) - data++ - ..() - return - - condensedcapsaicin - name = "Condensed Capsaicin" - id = "condensedcapsaicin" - description = "A chemical agent used for self-defense and in police work." - reagent_state = LIQUID - color = "#B31008" // rgb: 179, 16, 8 - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/victim = M - var/mouth_covered = 0 - var/eyes_covered = 0 - var/obj/item/safe_thing = null - if( victim.wear_mask ) - if ( victim.wear_mask.flags & MASKCOVERSEYES ) - eyes_covered = 1 - safe_thing = victim.wear_mask - if ( victim.wear_mask.flags & MASKCOVERSMOUTH ) - mouth_covered = 1 - safe_thing = victim.wear_mask - if( victim.head ) - if ( victim.head.flags & MASKCOVERSEYES ) - eyes_covered = 1 - safe_thing = victim.head - if ( victim.head.flags & MASKCOVERSMOUTH ) - mouth_covered = 1 - safe_thing = victim.head - if(victim.glasses) - eyes_covered = 1 - if ( !safe_thing ) - safe_thing = victim.glasses - if ( eyes_covered && mouth_covered ) - victim << "\red Your [safe_thing] protects you from the pepperspray!" - return - else if ( eyes_covered ) // Reduced effects if partially protected - victim << "\red Your [safe_thing] protect you from most of the pepperspray!" - victim.eye_blurry = max(M.eye_blurry, 15) - victim.eye_blind = max(M.eye_blind, 5) - victim.Stun(5) - victim.Weaken(5) - //victim.Paralyse(10) - //victim.drop_item() - return - else if ( mouth_covered ) // Mouth cover is better than eye cover - victim << "\red Your [safe_thing] protects your face from the pepperspray!" - if (!(victim.species && (victim.species.flags & NO_PAIN))) - victim.emote("scream") - victim.eye_blurry = max(M.eye_blurry, 5) - return - else // Oh dear :D - if (!(victim.species && (victim.species.flags & NO_PAIN))) - victim.emote("scream") - victim << "\red You're sprayed directly in the eyes with pepperspray!" - victim.eye_blurry = max(M.eye_blurry, 25) - victim.eye_blind = max(M.eye_blind, 10) - victim.Stun(5) - victim.Weaken(5) - //victim.Paralyse(10) - //victim.drop_item() - - on_mob_life(var/mob/living/M as mob) - if(!M) - M = holder.my_atom - if(!data) - data = 1 - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species && !(H.species.flags & (NO_PAIN | IS_SYNTHETIC)) ) - switch(data) - if(1) - H << "\red You feel like your insides are burning !" - if(2 to INFINITY) - H.apply_effect(4,AGONY,0) - if(prob(5)) - H.visible_message("[H] [pick("dry heaves!","coughs!","splutters!")]") - H << "\red You feel like your insides are burning !" - else if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(15,30) - holder.remove_reagent("frostoil", 5) - holder.remove_reagent(src.id, FOOD_METABOLISM) - data++ - ..() - return - - frostoil - name = "Frost Oil" - id = "frostoil" - description = "A special oil that noticably chills the body. Extracted from Ice Peppers." - reagent_state = LIQUID - color = "#B31008" // rgb: 139, 166, 233 - - on_mob_life(var/mob/living/M as mob) - if(!M) - M = holder.my_atom - M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) - if(prob(1)) - M.emote("shiver") - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature = max(M.bodytemperature - rand(10,20), 0) - holder.remove_reagent("capsaicin", 5) - holder.remove_reagent(src.id, FOOD_METABOLISM) - ..() - return - - reaction_turf(var/turf/simulated/T, var/volume) - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(15,30)) - - sodiumchloride - name = "Table Salt" - id = "sodiumchloride" - description = "A salt made of sodium chloride. Commonly used to season food." - reagent_state = SOLID - color = "#FFFFFF" // rgb: 255,255,255 - overdose = REAGENTS_OVERDOSE - - blackpepper - name = "Black Pepper" - id = "blackpepper" - description = "A powder ground from peppercorns. *AAAACHOOO*" - reagent_state = SOLID - // no color (ie, black) - - coco - name = "Coco Powder" - id = "coco" - description = "A fatty, bitter paste made from coco beans." - reagent_state = SOLID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - hot_coco // there's also drink/hot_coco for whatever reason - name = "Hot Chocolate" - id = "hot_coco" - description = "Made with love! And cocoa beans." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#403010" // rgb: 64, 48, 16 - - glass_icon_state = "chocolateglass" - glass_name = "glass of hot chocolate" - glass_desc = "Made with love! And cocoa beans." - - on_mob_life(var/mob/living/M as mob) - if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) - M.nutrition += nutriment_factor - ..() - return - - psilocybin - name = "Psilocybin" - id = "psilocybin" - description = "A strong psycotropic derived from certain species of mushroom." - color = "#E700E7" // rgb: 231, 0, 231 - overdose = REAGENTS_OVERDOSE - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 30) - if(!data) data = 1 - switch(data) - if(1 to 5) - if (!M.stuttering) M.stuttering = 1 - M.make_dizzy(5) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(5 to 10) - if (!M.stuttering) M.stuttering = 1 - M.make_jittery(10) - M.make_dizzy(10) - M.druggy = max(M.druggy, 35) - if(prob(20)) M.emote(pick("twitch","giggle")) - if (10 to INFINITY) - if (!M.stuttering) M.stuttering = 1 - M.make_jittery(20) - M.make_dizzy(20) - M.druggy = max(M.druggy, 40) - if(prob(30)) M.emote(pick("twitch","giggle")) - holder.remove_reagent(src.id, 0.2) - data++ - ..() - return - - sprinkles - name = "Sprinkles" - id = "sprinkles" - description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FF00FF" // rgb: 255, 0, 255 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - /*if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - */ - ..() - -/* //removed because of meta bullshit. this is why we can't have nice things. - syndicream - name = "Cream filling" - id = "syndicream" - description = "Delicious cream filling of a mysterious origin. Tastes criminally good." - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#AB7878" // rgb: 171, 120, 120 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.mind) - if(M.mind.special_role) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() -*/ - cornoil - name = "Corn Oil" - id = "cornoil" - description = "An oil derived from various types of corn." - reagent_state = LIQUID - nutriment_factor = 20 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - reaction_turf(var/turf/simulated/T, var/volume) - if (!istype(T)) return - src = null - if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - var/hotspot = (locate(/obj/fire) in T) - if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) - lowertemp.react() - T.assume_air(lowertemp) - del(hotspot) - - enzyme - name = "Universal Enzyme" - id = "enzyme" - description = "A universal enzyme used in the preperation of certain chemicals and foods." - reagent_state = LIQUID - color = "#365E30" // rgb: 54, 94, 48 - overdose = REAGENTS_OVERDOSE - - dry_ramen - name = "Dry Ramen" - id = "dry_ramen" - description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." - reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - hot_ramen - name = "Hot Ramen" - id = "hot_ramen" - description = "The noodles are boiled, the flavors are artificial, just like being back in school." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT)) - ..() - return - - hell_ramen - name = "Hell Ramen" - id = "hell_ramen" - description = "The noodles are boiled, the flavors are artificial, just like being back in school." - reagent_state = LIQUID - nutriment_factor = 5 * REAGENTS_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - ..() - return - - flour - name = "flour" - id = "flour" - description = "This is what you rub all over yourself to pretend to be a ghost." - reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FFFFFF" // rgb: 0, 0, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - reaction_turf(var/turf/T, var/volume) - src = null - if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/flour(T) - - rice - name = "Rice" - id = "rice" - description = "Enjoy the great taste of nothing." - reagent_state = SOLID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FFFFFF" // rgb: 0, 0, 0 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - - cherryjelly - name = "Cherry Jelly" - id = "cherryjelly" - description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." - reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#801E28" // rgb: 128, 30, 40 - - on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - ..() - return - -///////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////// - - drink - name = "Drink" - id = "drink" - description = "Uh, some kind of drink." - reagent_state = LIQUID - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#E78108" // rgb: 231, 129, 8 - var/adj_dizzy = 0 - var/adj_drowsy = 0 - var/adj_sleepy = 0 - var/adj_temp = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - // Drinks should be used up faster than other reagents. - holder.remove_reagent(src.id, FOOD_METABOLISM) - if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy) - if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) - if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) - if (adj_temp) - if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 - M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) - - ..() - return - - drink/orangejuice - name = "Orange juice" - id = "orangejuice" - description = "Both delicious AND rich in Vitamin C, what more do you need?" - color = "#E78108" // rgb: 231, 129, 8 - - glass_icon_state = "glass_orange" - glass_name = "glass of orange juice" - glass_desc = "Vitamins! Yay!" - - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1) - return - - drink/tomatojuice - name = "Tomato Juice" - id = "tomatojuice" - description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" - color = "#731008" // rgb: 115, 16, 8 - - glass_icon_state = "glass_red" - glass_name = "glass of tomato juice" - glass_desc = "Are you sure this is tomato juice?" - - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1) - return - - drink/limejuice - name = "Lime Juice" - id = "limejuice" - description = "The sweet-sour juice of limes." - color = "#365E30" // rgb: 54, 94, 48 - - glass_icon_state = "glass_green" - glass_name = "glass of lime juice" - glass_desc = "A glass of sweet-sour lime juice" - - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1*REM) - return - - drink/carrotjuice - name = "Carrot juice" - id = "carrotjuice" - description = "It is just like a carrot but without crunching." - color = "#FF8C00" // rgb: 255, 140, 0 - - glass_icon_state = "carrotjuice" - glass_name = "glass of carrot juice" - glass_desc = "It is just like a carrot but without crunching." - - on_mob_life(var/mob/living/M as mob) - ..() - M.eye_blurry = max(M.eye_blurry-1 , 0) - M.eye_blind = max(M.eye_blind-1 , 0) - if(!data) data = 1 - switch(data) - if(1 to 20) - //nothing - if(21 to INFINITY) - if (prob(data-10)) - M.disabilities &= ~NEARSIGHTED - data++ - return - - drink/berryjuice - name = "Berry Juice" - id = "berryjuice" - description = "A delicious blend of several different kinds of berries." - color = "#990066" // rgb: 153, 0, 102 - - glass_icon_state = "berryjuice" - glass_name = "glass of berry juice" - glass_desc = "Berry juice. Or maybe it's jam. Who cares?" - - drink/grapejuice - name = "Grape Juice" - id = "grapejuice" - description = "It's grrrrrape!" - color = "#863333" // rgb: 134, 51, 51 - - glass_icon_state = "grapejuice" - glass_name = "glass of grape juice" - glass_desc = "It's grrrrrape!" - - drink/grapesoda - name = "Grape Soda" - id = "grapesoda" - description = "Grapes made into a fine drank." - color = "#421C52" // rgb: 98, 57, 53 - adj_drowsy = -3 - - glass_icon_state = "gsodaglass" - glass_name = "glass of grape soda" - glass_desc = "Looks like a delicious drink!" - - drink/poisonberryjuice - name = "Poison Berry Juice" - id = "poisonberryjuice" - description = "A tasty juice blended from various kinds of very deadly and toxic berries." - color = "#863353" // rgb: 134, 51, 83 - - glass_icon_state = "poisonberryjuice" - glass_name = "glass of poison berry juice" - glass_desc = "A glass of deadly juice." - - on_mob_life(var/mob/living/M as mob) - ..() - M.adjustToxLoss(1) - return - - drink/watermelonjuice - name = "Watermelon Juice" - id = "watermelonjuice" - description = "Delicious juice made from watermelon." - color = "#B83333" // rgb: 184, 51, 51 - - glass_icon_state = "glass_red" - glass_name = "glass of watermelon juice" - glass_desc = "Delicious juice made from watermelon." - - drink/lemonjuice - name = "Lemon Juice" - id = "lemonjuice" - description = "This juice is VERY sour." - color = "#AFAF00" // rgb: 175, 175, 0 - - glass_icon_state = "lemonjuice" - glass_name = "glass of lemon juice" - glass_desc = "Sour..." - - drink/banana - name = "Banana Juice" - id = "banana" - description = "The raw essence of a banana." - color = "#C3AF00" // rgb: 195, 175, 0 - - glass_icon_state = "banana" - glass_name = "glass of banana juice" - glass_desc = "The raw essence of a banana. HONK!" - - drink/nothing - name = "Nothing" - id = "nothing" - description = "Absolutely nothing." - - glass_icon_state = "nothing" - glass_name = "glass of nothing" - glass_desc = "Absolutely nothing." - - drink/potato_juice - name = "Potato Juice" - id = "potato" - description = "Juice of the potato. Bleh." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#302000" // rgb: 48, 32, 0 - - glass_icon_state = "glass_brown" - glass_name = "glass of potato juice" - glass_desc = "Juice from a potato. Bleh." - - drink/milk - name = "Milk" - id = "milk" - description = "An opaque white liquid produced by the mammary glands of mammals." - color = "#DFDFDF" // rgb: 223, 223, 223 - - glass_icon_state = "glass_white" - glass_name = "glass of milk" - glass_desc = "White and nutritious goodness!" - - on_mob_life(var/mob/living/M as mob) - if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) - holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) - ..() - return - - drink/milk/soymilk - name = "Soy Milk" - id = "soymilk" - description = "An opaque white liquid made from soybeans." - color = "#DFDFC7" // rgb: 223, 223, 199 - - glass_icon_state = "glass_white" - glass_name = "glass of soy milk" - glass_desc = "White and nutritious soy goodness!" - - drink/milk/cream - name = "Cream" - id = "cream" - description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" - color = "#DFD7AF" // rgb: 223, 215, 175 - - glass_icon_state = "glass_white" - glass_name = "glass of cream" - glass_desc = "Ewwww..." - - drink/grenadine - name = "Grenadine Syrup" - id = "grenadine" - description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?" - color = "#FF004F" // rgb: 255, 0, 79 - - glass_icon_state = "grenadineglass" - glass_name = "glass of grenadine syrup" - glass_desc = "Sweet and tangy, a bar syrup used to add color or flavor to drinks." - glass_center_of_mass = list("x"=17, "y"=6) - - drink/hot_coco - name = "Hot Chocolate" - id = "hot_coco" - description = "Made with love! And cocoa beans." - nutriment_factor = 2 * FOOD_METABOLISM - color = "#403010" // rgb: 64, 48, 16 - adj_temp = 5 - - glass_icon_state = "chocolateglass" - glass_name = "glass of hot chocolate" - glass_desc = "Made with love! And cocoa beans." - - drink/coffee - name = "Coffee" - id = "coffee" - description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." - color = "#482000" // rgb: 72, 32, 0 - adj_dizzy = -5 - adj_drowsy = -3 - adj_sleepy = -2 - adj_temp = 25 - - glass_icon_state = "hot_coffee" - glass_name = "cup of coffee" - glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - - on_mob_life(var/mob/living/M as mob) - ..() - M.make_jittery(5) - if(adj_temp > 0) - holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) - - holder.remove_reagent(src.id, 0.1) - - drink/coffee/icecoffee - name = "Iced Coffee" - id = "icecoffee" - description = "Coffee and ice, refreshing and cool." - color = "#102838" // rgb: 16, 40, 56 - adj_temp = -5 - - glass_icon_state = "icedcoffeeglass" - glass_name = "glass of iced coffee" - glass_desc = "A drink to perk you up and refresh you!" - - drink/coffee/soy_latte - name = "Soy Latte" - id = "soy_latte" - description = "A nice and tasty beverage while you are reading your hippie books." - color = "#664300" // rgb: 102, 67, 0 - adj_sleepy = 0 - adj_temp = 5 - - glass_icon_state = "soy_latte" - glass_name = "glass of soy latte" - glass_desc = "A nice and refrshing beverage while you are reading." - glass_center_of_mass = list("x"=15, "y"=9) - - on_mob_life(var/mob/living/M as mob) - ..() - M.sleeping = 0 - if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) - return - - drink/coffee/cafe_latte - name = "Cafe Latte" - id = "cafe_latte" - description = "A nice, strong and tasty beverage while you are reading." - color = "#664300" // rgb: 102, 67, 0 - adj_sleepy = 0 - adj_temp = 5 - - glass_icon_state = "cafe_latte" - glass_name = "glass of cafe latte" - glass_desc = "A nice, strong and refreshing beverage while you are reading." - glass_center_of_mass = list("x"=15, "y"=9) - - on_mob_life(var/mob/living/M as mob) - ..() - M.sleeping = 0 - if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) - return - - drink/tea - name = "Tea" - id = "tea" - description = "Tasty black tea, it has antioxidants, it's good for you!" - color = "#101000" // rgb: 16, 16, 0 - adj_dizzy = -2 - adj_drowsy = -1 - adj_sleepy = -3 - adj_temp = 20 - - glass_icon_state = "bigteacup" - glass_name = "cup of tea" - glass_desc = "Tasty black tea, it has antioxidants, it's good for you!" - - on_mob_life(var/mob/living/M as mob) - ..() - if(M.getToxLoss() && prob(20)) - M.adjustToxLoss(-1) - return - - drink/tea/icetea - name = "Iced Tea" - id = "icetea" - description = "No relation to a certain rap artist/ actor." - color = "#104038" // rgb: 16, 64, 56 - adj_temp = -5 - - glass_icon_state = "icedteaglass" - glass_name = "glass of iced tea" - glass_desc = "No relation to a certain rap artist/ actor." - glass_center_of_mass = list("x"=15, "y"=10) - - drink/cold - name = "Cold drink" - adj_temp = -5 - - drink/cold/tonic - name = "Tonic Water" - id = "tonic" - description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." - color = "#664300" // rgb: 102, 67, 0 - adj_dizzy = -5 - adj_drowsy = -3 - adj_sleepy = -2 - - glass_icon_state = "glass_clear" - glass_name = "glass of tonic water" - glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - - drink/cold/sodawater - name = "Soda Water" - id = "sodawater" - description = "A can of club soda. Why not make a scotch and soda?" - color = "#619494" // rgb: 97, 148, 148 - adj_dizzy = -5 - adj_drowsy = -3 - - glass_icon_state = "glass_clear" - glass_name = "glass of soda water" - glass_desc = "Soda water. Why not make a scotch and soda?" - - drink/cold/ice - name = "Ice" - id = "ice" - description = "Frozen water, your dentist wouldn't like you chewing this." - reagent_state = SOLID - color = "#619494" // rgb: 97, 148, 148 - - glass_icon_state = "iceglass" - glass_name = "glass of ice" - glass_desc = "Generally, you're supposed to put something else in there too..." - - drink/cold/space_cola - name = "Space Cola" - id = "cola" - description = "A refreshing beverage." - reagent_state = LIQUID - color = "#100800" // rgb: 16, 8, 0 - adj_drowsy = -3 - - glass_icon_state = "glass_brown" - glass_name = "glass of Space Cola" - glass_desc = "A glass of refreshing Space Cola" - - drink/cold/nuka_cola - name = "Nuka Cola" - id = "nuka_cola" - description = "Cola, cola never changes." - color = "#100800" // rgb: 16, 8, 0 - adj_sleepy = -2 - - glass_icon_state = "nuka_colaglass" - glass_name = "glass of Nuka-Cola" - glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" - glass_center_of_mass = list("x"=16, "y"=6) - - on_mob_life(var/mob/living/M as mob) - M.make_jittery(20) - M.druggy = max(M.druggy, 30) - M.dizziness +=5 - M.drowsyness = 0 - ..() - return - - drink/cold/spacemountainwind - name = "Mountain Wind" - id = "spacemountainwind" - description = "Blows right through you like a space wind." - color = "#102000" // rgb: 16, 32, 0 - adj_drowsy = -7 - adj_sleepy = -1 - - glass_icon_state = "Space_mountain_wind_glass" - glass_name = "glass of Space Mountain Wind" - glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - - drink/cold/dr_gibb - name = "Dr. Gibb" - id = "dr_gibb" - description = "A delicious blend of 42 different flavours" - color = "#102000" // rgb: 16, 32, 0 - adj_drowsy = -6 - - glass_icon_state = "dr_gibb_glass" - glass_name = "glass of Dr. Gibb" - glass_desc = "Dr. Gibb. Not as dangerous as the name might imply." - - drink/cold/space_up - name = "Space-Up" - id = "space_up" - description = "Tastes like a hull breach in your mouth." - color = "#202800" // rgb: 32, 40, 0 - adj_temp = -8 - - glass_icon_state = "space-up_glass" - glass_name = "glass of Space-up" - glass_desc = "Space-up. It helps keep your cool." - - drink/cold/lemon_lime - name = "Lemon Lime" - description = "A tangy substance made of 0.5% natural citrus!" - id = "lemon_lime" - color = "#878F00" // rgb: 135, 40, 0 - adj_temp = -8 - - glass_icon_state = "lemonlime" - glass_name = "glass of lemon lime soda" - glass_desc = "A tangy substance made of 0.5% natural citrus!" - - drink/cold/lemonade - name = "Lemonade" - description = "Oh the nostalgia..." - id = "lemonade" - color = "#FFFF00" // rgb: 255, 255, 0 - - glass_icon_state = "lemonadeglass" - glass_name = "glass of lemonade" - glass_desc = "Oh the nostalgia..." - - drink/cold/kiraspecial - name = "Kira Special" - description = "Long live the guy who everyone had mistaken for a girl. Baka!" - id = "kiraspecial" - color = "#CCCC99" // rgb: 204, 204, 153 - - glass_icon_state = "kiraspecial" - glass_name = "glass of Kira Special" - glass_desc = "Long live the guy who everyone had mistaken for a girl. Baka!" - glass_center_of_mass = list("x"=16, "y"=12) - - drink/cold/brownstar - name = "Brown Star" - description = "It's not what it sounds like..." - id = "brownstar" - color = "#9F3400" // rgb: 159, 052, 000 - adj_temp = - 2 - - glass_icon_state = "brownstar" - glass_name = "glass of Brown Star" - glass_desc = "It's not what it sounds like..." - - drink/cold/milkshake - name = "Milkshake" - description = "Glorious brainfreezing mixture." - id = "milkshake" - color = "#AEE5E4" // rgb" 174, 229, 228 - adj_temp = -9 - - glass_icon_state = "milkshake" - glass_name = "glass of milkshake" - glass_desc = "Glorious brainfreezing mixture." - glass_center_of_mass = list("x"=16, "y"=7) - - on_mob_life(var/mob/living/M as mob) - if(!M) - M = holder.my_atom - if(prob(1)) - M.emote("shiver") - M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature = max(M.bodytemperature - rand(10,20), 0) - holder.remove_reagent("capsaicin", 5) - holder.remove_reagent(src.id, FOOD_METABOLISM) - ..() - return - - drink/cold/rewriter - name = "Rewriter" - description = "The secret of the sanctuary of the Libarian..." - id = "rewriter" - color = "#485000" // rgb:72, 080, 0 - - glass_icon_state = "rewriter" - glass_name = "glass of Rewriter" - glass_desc = "The secret of the sanctuary of the Libarian..." - glass_center_of_mass = list("x"=16, "y"=9) - - on_mob_life(var/mob/living/M as mob) - ..() - M.make_jittery(5) - return - - - doctor_delight - name = "The Doctor's Delight" - id = "doctorsdelight" - description = "A gulp a day keeps the MediBot away. That's probably for the best." - reagent_state = LIQUID - color = "#FF8CFF" // rgb: 255, 140, 255 - nutriment_factor = 1 * FOOD_METABOLISM - - glass_icon_state = "doctorsdelightglass" - glass_name = "glass of The Doctor's Delight" - glass_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." - glass_center_of_mass = list("x"=16, "y"=8) - - on_mob_life(var/mob/living/M as mob) - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) - if(!M) M = holder.my_atom - if(M:getOxyLoss() && prob(50)) M:adjustOxyLoss(-2) - if(M:getBruteLoss() && prob(60)) M:heal_organ_damage(2,0) - if(M:getFireLoss() && prob(50)) M:heal_organ_damage(0,2) - if(M:getToxLoss() && prob(50)) M:adjustToxLoss(-2) - if(M.dizziness !=0) M.dizziness = max(0,M.dizziness-15) - if(M.confused !=0) M.confused = max(0,M.confused - 5) - ..() - return - -//////////////////////////////////////////////The ten friggen million reagents that get you drunk////////////////////////////////////////////// - - atomicbomb - name = "Atomic Bomb" - id = "atomicbomb" - description = "Nuclear proliferation never tasted so good." - reagent_state = LIQUID - color = "#666300" // rgb: 102, 99, 0 - - glass_icon_state = "atomicbombglass" - glass_name = "glass of Atomic Bomb" - glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - glass_center_of_mass = list("x"=15, "y"=7) - - on_mob_life(var/mob/living/M as mob) - M.druggy = max(M.druggy, 50) - M.confused = max(M.confused+2,0) - M.make_dizzy(10) - if (!M.stuttering) M.stuttering = 1 - M.stuttering += 3 - if(!data) data = 1 - data++ - switch(data) - if(51 to 200) - M.sleeping += 1 - if(201 to INFINITY) - M.sleeping += 1 - M.adjustToxLoss(2) - ..() - return - - gargle_blaster - name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" - description = "Whoah, this stuff looks volatile!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - glass_icon_state = "gargleblasterglass" - glass_name = "glass of Pan-Galactic Gargle Blaster" - glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." - glass_center_of_mass = list("x"=17, "y"=6) - - on_mob_life(var/mob/living/M as mob) - if(!data) data = 1 - data++ - M.dizziness +=6 - switch(data) - if(15 to 45) - M.stuttering = max(M.stuttering+3,0) - if(45 to 55) - if (prob(50)) - M.confused = max(M.confused+3,0) - if(55 to 200) - M.druggy = max(M.druggy, 55) - if(200 to INFINITY) - M.adjustToxLoss(2) - ..() - - neurotoxin - name = "Neurotoxin" - id = "neurotoxin" - description = "A strong neurotoxin that puts the subject into a death-like state." - reagent_state = LIQUID - color = "#2E2E61" // rgb: 46, 46, 97 - - glass_icon_state = "neurotoxinglass" - glass_name = "glass of Neurotoxin" - glass_desc = "A drink that is guaranteed to knock you silly." - glass_center_of_mass = list("x"=16, "y"=8) - - on_mob_life(var/mob/living/carbon/M as mob) - if(!M) M = holder.my_atom - M.weakened = max(M.weakened, 3) - if(!data) data = 1 - data++ - M.dizziness +=6 - switch(data) - if(15 to 45) - M.stuttering = max(M.stuttering+3,0) - if(45 to 55) - if (prob(50)) - M.confused = max(M.confused+3,0) - if(55 to 200) - M.druggy = max(M.druggy, 55) - if(200 to INFINITY) - M.adjustToxLoss(2) - ..() - - hippies_delight - name = "Hippies' Delight" - id = "hippiesdelight" - description = "You just don't get it maaaan." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - - glass_icon_state = "hippiesdelightglass" - glass_name = "glass of Hippie's Delight" - glass_desc = "A drink enjoyed by people during the 1960's." - glass_center_of_mass = list("x"=16, "y"=8) - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 50) - if(!data) data = 1 - data++ - switch(data) - if(1 to 5) - if (!M.stuttering) M.stuttering = 1 - M.make_dizzy(10) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(5 to 10) - if (!M.stuttering) M.stuttering = 1 - M.make_jittery(20) - M.make_dizzy(20) - M.druggy = max(M.druggy, 45) - if(prob(20)) M.emote(pick("twitch","giggle")) - if (10 to 200) - if (!M.stuttering) M.stuttering = 1 - M.make_jittery(40) - M.make_dizzy(40) - M.druggy = max(M.druggy, 60) - if(prob(30)) M.emote(pick("twitch","giggle")) - if(200 to INFINITY) - if (!M.stuttering) M.stuttering = 1 - M.make_jittery(60) - M.make_dizzy(60) - M.druggy = max(M.druggy, 75) - if(prob(40)) M.emote(pick("twitch","giggle")) - if(prob(30)) M.adjustToxLoss(2) - holder.remove_reagent(src.id, 0.2) - ..() - return - -/*boozepwr chart -1-2 = non-toxic alcohol -3 = medium-toxic -4 = the hard stuff -5 = potent mixes -<6 = deadly toxic -*/ - - ethanol - name = "Ethanol" //Parent class for all alcoholic reagents. - id = "ethanol" - description = "A well-known alcohol with a variety of applications." - reagent_state = LIQUID - nutriment_factor = 0 //So alcohol can fill you up! If they want to. - color = "#404030" // rgb: 64, 64, 48 - var/boozepwr = 5 //higher numbers mean the booze will have an effect faster. - var/dizzy_adj = 3 - var/adj_drowsy = 0 - var/adj_sleepy = 0 - var/slurr_adj = 3 - var/confused_adj = 2 - var/slur_start = 90 //amount absorbed after which mob starts slurring - var/confused_start = 150 //amount absorbed after which mob starts confusing directions - var/blur_start = 300 //amount absorbed after which mob starts getting blurred vision - var/pass_out = 400 //amount absorbed after which mob starts passing out - - glass_icon_state = "glass_clear" - glass_name = "glass of ethanol" - glass_desc = "A well-known alcohol with a variety of applications." - - on_mob_life(var/mob/living/M as mob, var/alien) - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, (alien ? FOOD_METABOLISM : ALCOHOL_METABOLISM)) // Catch-all for creatures without livers. - - if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) - if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) - - if(!src.data || (!isnum(src.data) && src.data.len)) data = 1 //if it doesn't exist we set it. if it's a list we're going to set it to 1 as well. This is to - src.data += boozepwr //avoid a runtime error associated with drinking blood mixed in drinks (demon's blood). - - var/d = data - - // make all the beverages work together - for(var/datum/reagent/ethanol/A in holder.reagent_list) - if(A != src && isnum(A.data)) d += A.data - - if(alien && alien == IS_SKRELL) //Skrell get very drunk very quickly. - d*=5 - - M.dizziness += dizzy_adj. - if(d >= slur_start && d < pass_out) - if (!M:slurring) M:slurring = 1 - M:slurring += slurr_adj - if(d >= confused_start && prob(33)) - if (!M:confused) M:confused = 1 - M.confused = max(M:confused+confused_adj,0) - if(d >= blur_start) - M.eye_blurry = max(M.eye_blurry, 10) - M:drowsyness = max(M:drowsyness, 0) - if(d >= pass_out) - M:paralysis = max(M:paralysis, 20) - M:drowsyness = max(M:drowsyness, 30) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"] - if (!L) - H.adjustToxLoss(5) - else if(istype(L)) - L.take_damage(0.1, 1) - H.adjustToxLoss(0.1) - ..() - return - - reaction_obj(var/obj/O, var/volume) - if(istype(O,/obj/item/weapon/paper)) - var/obj/item/weapon/paper/paperaffected = O - paperaffected.clearpaper() - usr << "The solution dissolves the ink on the paper." - if(istype(O,/obj/item/weapon/book)) - if(istype(O,/obj/item/weapon/book/tome)) - usr << "The solution does nothing. Whatever this is, it isn't normal ink." - return - if(volume >= 5) - var/obj/item/weapon/book/affectedbook = O - affectedbook.dat = null - usr << "The solution dissolves the ink on the book." - else - usr << "It wasn't enough..." - return - - reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel. - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - M.adjust_fire_stacks(volume / 15) - return - ethanol/beer - name = "Beer" - id = "beer" - description = "An alcoholic beverage made from malted grains, hops, yeast, and water." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1 - nutriment_factor = 1 * FOOD_METABOLISM - - glass_icon_state = "beerglass" - glass_name = "glass of beer" - glass_desc = "A freezing pint of beer" - glass_center_of_mass = list("x"=16, "y"=8) - - on_mob_life(var/mob/living/M as mob) - M:jitteriness = max(M:jitteriness-3,0) - ..() - return - - ethanol/kahlua - name = "Kahlua" - id = "kahlua" - description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1.5 - dizzy_adj = -5 - adj_drowsy = -3 - adj_sleepy = -2 - - glass_icon_state = "kahluaglass" - glass_name = "glass of RR coffee liquor" - glass_desc = "DAMN, THIS THING LOOKS ROBUST" - glass_center_of_mass = list("x"=15, "y"=7) - - on_mob_life(var/mob/living/M as mob) - M.make_jittery(5) - ..() - return - - ethanol/whiskey - name = "Whiskey" - id = "whiskey" - description = "A superb and well-aged single-malt whiskey. Damn." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - dizzy_adj = 4 - - glass_icon_state = "whiskeyglass" - glass_name = "glass of whiskey" - glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - glass_center_of_mass = list("x"=16, "y"=12) - - ethanol/specialwhiskey - name = "Special Blend Whiskey" - id = "specialwhiskey" - description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - dizzy_adj = 4 - slur_start = 30 //amount absorbed after which mob starts slurring - - glass_icon_state = "whiskeyglass" - glass_name = "glass of special blend whiskey" - glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." - glass_center_of_mass = list("x"=16, "y"=12) - - ethanol/thirteenloko - name = "Thirteen Loko" - id = "thirteenloko" - description = "A potent mixture of caffeine and alcohol." - color = "#102000" // rgb: 16, 32, 0 - boozepwr = 2 - nutriment_factor = 1 * FOOD_METABOLISM - - glass_icon_state = "thirteen_loko_glass" - glass_name = "glass of Thirteen Loko" - glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - - on_mob_life(var/mob/living/M as mob) - M:drowsyness = max(0,M:drowsyness-7) - if (M.bodytemperature > 310) - M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) - M.make_jittery(5) - ..() - return - - ethanol/vodka - name = "Vodka" - id = "vodka" - description = "Number one drink AND fueling choice for Russians worldwide." - color = "#0064C8" // rgb: 0, 100, 200 - boozepwr = 2 - - glass_icon_state = "ginvodkaglass" - glass_name = "glass of vodka" - glass_desc = "The glass contain wodka. Xynta." - glass_center_of_mass = list("x"=16, "y"=12) - - on_mob_life(var/mob/living/M as mob) - M.radiation = max(M.radiation-1,0) - ..() - return - - ethanol/bilk - name = "Bilk" - id = "bilk" - description = "This appears to be beer mixed with milk. Disgusting." - color = "#895C4C" // rgb: 137, 92, 76 - boozepwr = 1 - nutriment_factor = 2 * FOOD_METABOLISM - - glass_icon_state = "glass_brown" - glass_name = "glass of bilk" - glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - - ethanol/threemileisland - name = "Three Mile Island Iced Tea" - id = "threemileisland" - description = "Made for a woman, strong enough for a man." - color = "#666340" // rgb: 102, 99, 64 - boozepwr = 5 - - glass_icon_state = "threemileislandglass" - glass_name = "glass of Three Mile Island iced tea" - glass_desc = "A glass of this is sure to prevent a meltdown." - glass_center_of_mass = list("x"=16, "y"=2) - - on_mob_life(var/mob/living/M as mob) - M.druggy = max(M.druggy, 50) - ..() - return - - ethanol/gin - name = "Gin" - id = "gin" - description = "It's gin. In space. I say, good sir." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1 - dizzy_adj = 3 - - glass_icon_state = "ginvodkaglass" - glass_name = "glass of gin" - glass_desc = "A crystal clear glass of Griffeater gin." - glass_center_of_mass = list("x"=16, "y"=12) - - ethanol/tequilla - name = "Tequila" - id = "tequilla" - description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" - color = "#FFFF91" // rgb: 255, 255, 145 - boozepwr = 2 - - glass_icon_state = "tequillaglass" - glass_name = "glass of Tequilla" - glass_desc = "Now all that's missing is the weird colored shades!" - glass_center_of_mass = list("x"=16, "y"=12) - - ethanol/vermouth - name = "Vermouth" - id = "vermouth" - description = "You suddenly feel a craving for a martini..." - color = "#91FF91" // rgb: 145, 255, 145 - boozepwr = 1.5 - - glass_icon_state = "vermouthglass" - glass_name = "glass of vermouth" - glass_desc = "You wonder why you're even drinking this straight." - glass_center_of_mass = list("x"=16, "y"=12) - - ethanol/wine - name = "Wine" - id = "wine" - description = "An premium alchoholic beverage made from distilled grape juice." - color = "#7E4043" // rgb: 126, 64, 67 - boozepwr = 1.5 - dizzy_adj = 2 - slur_start = 65 //amount absorbed after which mob starts slurring - confused_start = 145 //amount absorbed after which mob starts confusing directions - - glass_icon_state = "wineglass" - glass_name = "glass of wine" - glass_desc = "A very classy looking drink." - glass_center_of_mass = list("x"=15, "y"=7) - - ethanol/cognac - name = "Cognac" - id = "cognac" - description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." - color = "#AB3C05" // rgb: 171, 60, 5 - boozepwr = 1.5 - dizzy_adj = 4 - confused_start = 115 //amount absorbed after which mob starts confusing directions - - glass_icon_state = "cognacglass" - glass_name = "glass of cognac" - glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." - glass_center_of_mass = list("x"=16, "y"=6) - - ethanol/hooch - name = "Hooch" - id = "hooch" - description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - dizzy_adj = 6 - slurr_adj = 5 - slur_start = 35 //amount absorbed after which mob starts slurring - confused_start = 90 //amount absorbed after which mob starts confusing directions - - glass_icon_state = "glass_brown2" - glass_name = "glass of Hooch" - glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - - ethanol/ale - name = "Ale" - id = "ale" - description = "A dark alchoholic beverage made by malted barley and yeast." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1 - - glass_icon_state = "aleglass" - glass_name = "glass of ale" - glass_desc = "A freezing pint of delicious ale" - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/absinthe - name = "Absinthe" - id = "absinthe" - description = "Watch out that the Green Fairy doesn't come for you!" - color = "#33EE00" // rgb: 51, 238, 0 - boozepwr = 4 - dizzy_adj = 5 - slur_start = 15 - confused_start = 30 - - glass_icon_state = "absintheglass" - glass_name = "glass of absinthe" - glass_desc = "Wormwood, anise, oh my." - glass_center_of_mass = list("x"=16, "y"=5) - - ethanol/pwine - name = "Poison Wine" - id = "pwine" - description = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" - color = "#000000" // rgb: 0, 0, 0 SHOCKER - boozepwr = 1 - dizzy_adj = 1 - slur_start = 1 - confused_start = 1 - - glass_icon_state = "pwineglass" - glass_name = "glass of ???" - glass_desc = "A black ichor with an oily purple sheer on top. Are you sure you should drink this?" - glass_center_of_mass = list("x"=16, "y"=5) - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.druggy = max(M.druggy, 50) - if(!data) data = 1 - data++ - switch(data) - if(1 to 25) - if (!M.stuttering) M.stuttering = 1 - M.make_dizzy(1) - M.hallucination = max(M.hallucination, 3) - if(prob(1)) M.emote(pick("twitch","giggle")) - if(25 to 75) - if (!M.stuttering) M.stuttering = 1 - M.hallucination = max(M.hallucination, 10) - M.make_jittery(2) - M.make_dizzy(2) - M.druggy = max(M.druggy, 45) - if(prob(5)) M.emote(pick("twitch","giggle")) - if (75 to 150) - if (!M.stuttering) M.stuttering = 1 - M.hallucination = max(M.hallucination, 60) - M.make_jittery(4) - M.make_dizzy(4) - M.druggy = max(M.druggy, 60) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(prob(30)) M.adjustToxLoss(2) - if (150 to 300) - if (!M.stuttering) M.stuttering = 1 - M.hallucination = max(M.hallucination, 60) - M.make_jittery(4) - M.make_dizzy(4) - M.druggy = max(M.druggy, 60) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(prob(30)) M.adjustToxLoss(2) - if(prob(5)) if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/heart/L = H.internal_organs_by_name["heart"] - if (L && istype(L)) - L.take_damage(5, 0) - if (300 to INFINITY) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/heart/L = H.internal_organs_by_name["heart"] - if (L && istype(L)) - L.take_damage(100, 0) - holder.remove_reagent(src.id, FOOD_METABOLISM) - - ethanol/rum - name = "Rum" - id = "rum" - description = "Yohoho and all that." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1.5 - - glass_icon_state = "rumglass" - glass_name = "glass of rum" - glass_desc = "Now you want to Pray for a pirate suit, don't you?" - glass_center_of_mass = list("x"=16, "y"=12) - - ethanol/deadrum - name = "Deadrum" - id = "rum" // duplicate ids? - description = "Popular with the sailors. Not very popular with everyone else." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1 - - glass_icon_state = "rumglass" - glass_name = "glass of rum" - glass_desc = "Now you want to Pray for a pirate suit, don't you?" - glass_center_of_mass = list("x"=16, "y"=12) - - on_mob_life(var/mob/living/M as mob) - ..() - M.dizziness +=5 - return - - ethanol/sake - name = "Sake" - id = "sake" - description = "Anime's favorite drink." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - - glass_icon_state = "ginvodkaglass" - glass_name = "glass of sake" - glass_desc = "A glass of sake." - glass_center_of_mass = list("x"=16, "y"=12) - -/////////////////////////////////////////////////////////////////cocktail entities////////////////////////////////////////////// - - - ethanol/goldschlager - name = "Goldschlager" - id = "goldschlager" - description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "ginvodkaglass" - glass_name = "glass of Goldschlager" - glass_desc = "100 proof that teen girls will drink anything with gold in it." - glass_center_of_mass = list("x"=16, "y"=12) - - ethanol/patron - name = "Patron" - id = "patron" - description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." - color = "#585840" // rgb: 88, 88, 64 - boozepwr = 1.5 - - glass_icon_state = "patronglass" - glass_name = "glass of Patron" - glass_desc = "Drinking patron in the bar, with all the subpar ladies." - glass_center_of_mass = list("x"=7, "y"=8) - - ethanol/gintonic - name = "Gin and Tonic" - id = "gintonic" - description = "An all time classic, mild cocktail." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1 - - glass_icon_state = "gintonicglass" - glass_name = "glass of gin and tonic" - glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." - glass_center_of_mass = list("x"=16, "y"=7) - - ethanol/cuba_libre - name = "Cuba Libre" - id = "cubalibre" - description = "Rum, mixed with cola. Viva la revolucion." - color = "#3E1B00" // rgb: 62, 27, 0 - boozepwr = 1.5 - - glass_icon_state = "cubalibreglass" - glass_name = "glass of Cuba Libre" - glass_desc = "A classic mix of rum and cola." - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/whiskey_cola - name = "Whiskey Cola" - id = "whiskeycola" - description = "Whiskey, mixed with cola. Surprisingly refreshing." - color = "#3E1B00" // rgb: 62, 27, 0 - boozepwr = 2 - - glass_icon_state = "whiskeycolaglass" - glass_name = "glass of whiskey cola" - glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/martini - name = "Classic Martini" - id = "martini" - description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - - glass_icon_state = "martiniglass" - glass_name = "glass of classic martini" - glass_desc = "Damn, the bartender even stirred it, not shook it." - glass_center_of_mass = list("x"=17, "y"=8) - - ethanol/vodkamartini - name = "Vodka Martini" - id = "vodkamartini" - description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 4 - - glass_icon_state = "martiniglass" - glass_name = "glass of vodka martini" - glass_desc ="A bastardisation of the classic martini. Still great." - glass_center_of_mass = list("x"=17, "y"=8) - - ethanol/white_russian - name = "White Russian" - id = "whiterussian" - description = "That's just, like, your opinion, man..." - color = "#A68340" // rgb: 166, 131, 64 - boozepwr = 3 - - glass_icon_state = "whiterussianglass" - glass_name = "glass of White Russian" - glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/screwdrivercocktail - name = "Screwdriver" - id = "screwdrivercocktail" - description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." - color = "#A68310" // rgb: 166, 131, 16 - boozepwr = 3 - - glass_icon_state = "screwdriverglass" - glass_name = "glass of Screwdriver" - glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - glass_center_of_mass = list("x"=15, "y"=10) - - ethanol/booger - name = "Booger" - id = "booger" - description = "Ewww..." - color = "#8CFF8C" // rgb: 140, 255, 140 - boozepwr = 1.5 - - glass_icon_state = "booger" - glass_name = "glass of Booger" - glass_desc = "Ewww..." - - ethanol/bloody_mary - name = "Bloody Mary" - id = "bloodymary" - description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "bloodymaryglass" - glass_name = "glass of Bloody Mary" - glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." - - ethanol/brave_bull - name = "Brave Bull" - id = "bravebull" - description = "It's just as effective as Dutch-Courage!" - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "bravebullglass" - glass_name = "glass of Brave Bull" - glass_desc = "Tequilla and coffee liquor, brought together in a mouthwatering mixture. Drink up." - glass_center_of_mass = list("x"=15, "y"=8) - - ethanol/tequilla_sunrise - name = "Tequila Sunrise" - id = "tequillasunrise" - description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" - color = "#FFE48C" // rgb: 255, 228, 140 - boozepwr = 2 - - glass_icon_state = "tequillasunriseglass" - glass_name = "glass of Tequilla Sunrise" - glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - - ethanol/toxins_special - name = "Toxins Special" - id = "phoronspecial" - description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 5 - - glass_icon_state = "toxinsspecialglass" - glass_name = "glass of Toxins Special" - glass_desc = "Whoah, this thing is on FIRE" - - on_mob_life(var/mob/living/M as mob) - if (M.bodytemperature < 330) - M.bodytemperature = min(330, M.bodytemperature + (15 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - return - - ethanol/beepsky_smash - name = "Beepsky Smash" - id = "beepskysmash" - description = "Deny drinking this and prepare for THE LAW." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 4 - - glass_icon_state = "beepskysmashglass" - glass_name = "Beepsky Smash" - glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - glass_center_of_mass = list("x"=18, "y"=10) - - on_mob_life(var/mob/living/M as mob) - M.Stun(2) - ..() - return - - ethanol/irish_cream - name = "Irish Cream" - id = "irishcream" - description = "Whiskey-imbued cream, what else would you expect from the Irish." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - - glass_icon_state = "irishcreamglass" - glass_name = "glass of Irish cream" - glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/manly_dorf - name = "The Manly Dorf" - id = "manlydorf" - description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - - glass_icon_state = "manlydorfglass" - glass_name = "glass of The Manly Dorf" - glass_desc = "A manly concotion made from Ale and Beer. Intended for true men only." - - ethanol/longislandicedtea - name = "Long Island Iced Tea" - id = "longislandicedtea" - description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 4 - - glass_icon_state = "longislandicedteaglass" - glass_name = "glass of Long Island iced tea" - glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/moonshine - name = "Moonshine" - id = "moonshine" - description = "You've really hit rock bottom now... your liver packed its bags and left last night." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 4 - - glass_icon_state = "glass_clear" - glass_name = "glass of moonshine" - glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - - ethanol/b52 - name = "B-52" - id = "b52" - description = "Coffee, Irish Cream, and cognac. You will get bombed." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 4 - - glass_icon_state = "b52glass" - glass_name = "glass of B-52" - glass_desc = "Kahlua, Irish cream, and congac. You will get bombed." - - ethanol/irishcoffee - name = "Irish Coffee" - id = "irishcoffee" - description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "irishcoffeeglass" - glass_name = "glass of Irish coffee" - glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - glass_center_of_mass = list("x"=15, "y"=10) - - ethanol/margarita - name = "Margarita" - id = "margarita" - description = "On the rocks with salt on the rim. Arriba~!" - color = "#8CFF8C" // rgb: 140, 255, 140 - boozepwr = 3 - - glass_icon_state = "margaritaglass" - glass_name = "glass of margarita" - glass_desc = "On the rocks with salt on the rim. Arriba~!" - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/black_russian - name = "Black Russian" - id = "blackrussian" - description = "For the lactose-intolerant. Still as classy as a White Russian." - color = "#360000" // rgb: 54, 0, 0 - boozepwr = 3 - - glass_icon_state = "blackrussianglass" - glass_name = "glass of Black Russian" - glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/manhattan - name = "Manhattan" - id = "manhattan" - description = "The Detective's undercover drink of choice. He never could stomach gin..." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "manhattanglass" - glass_name = "glass of Manhattan" - glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." - glass_center_of_mass = list("x"=17, "y"=8) - - ethanol/manhattan_proj - name = "Manhattan Project" - id = "manhattan_proj" - description = "A scientist's drink of choice, for pondering ways to blow up the station." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 5 - - glass_icon_state = "proj_manhattanglass" - glass_name = "glass of Manhattan Project" - glass_desc = "A scienitst drink of choice, for thinking how to blow up the station." - glass_center_of_mass = list("x"=17, "y"=8) - - on_mob_life(var/mob/living/M as mob) - M.druggy = max(M.druggy, 30) - ..() - return - - ethanol/whiskeysoda - name = "Whiskey Soda" - id = "whiskeysoda" - description = "For the more refined griffon." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "whiskeysodaglass2" - glass_name = "glass of whiskey soda" - glass_desc = "Ultimate refreshment." - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/antifreeze - name = "Anti-freeze" - id = "antifreeze" - description = "Ultimate refreshment." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 4 - - glass_icon_state = "antifreeze" - glass_name = "glass of Anti-freeze" - glass_desc = "The ultimate refreshment." - glass_center_of_mass = list("x"=16, "y"=8) - - on_mob_life(var/mob/living/M as mob) - if (M.bodytemperature < 330) - M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - return - - ethanol/barefoot - name = "Barefoot" - id = "barefoot" - description = "Barefoot and pregnant" - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1.5 - - glass_icon_state = "b&p" - glass_name = "glass of Barefoot" - glass_desc = "Barefoot and pregnant" - glass_center_of_mass = list("x"=17, "y"=8) - - ethanol/snowwhite - name = "Snow White" - id = "snowwhite" - description = "A cold refreshment" - color = "#FFFFFF" // rgb: 255, 255, 255 - boozepwr = 1.5 - - glass_icon_state = "snowwhite" - glass_name = "glass of Snow White" - glass_desc = "A cold refreshment." - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/melonliquor - name = "Melon Liquor" - id = "melonliquor" - description = "A relatively sweet and fruity 46 proof liquor." - color = "#138808" // rgb: 19, 136, 8 - boozepwr = 1 - - glass_icon_state = "emeraldglass" - glass_name = "glass of melon liquor" - glass_desc = "A relatively sweet and fruity 46 proof liquor." - glass_center_of_mass = list("x"=16, "y"=5) - - ethanol/bluecuracao - name = "Blue Curacao" - id = "bluecuracao" - description = "Exotically blue, fruity drink, distilled from oranges." - color = "#0000CD" // rgb: 0, 0, 205 - boozepwr = 1.5 - - glass_icon_state = "curacaoglass" - glass_name = "glass of blue curacao" - glass_desc = "Exotically blue, fruity drink, distilled from oranges." - glass_center_of_mass = list("x"=16, "y"=5) - - ethanol/suidream - name = "Sui Dream" - id = "suidream" - description = "Comprised of: White soda, blue curacao, melon liquor." - color = "#00A86B" // rgb: 0, 168, 107 - boozepwr = 0.5 - - glass_icon_state = "sdreamglass" - glass_name = "glass of Sui Dream" - glass_desc = "A froofy, fruity, and sweet mixed drink. Understanding the name only brings shame." - glass_center_of_mass = list("x"=16, "y"=5) - - ethanol/demonsblood - name = "Demons Blood" - id = "demonsblood" - description = "AHHHH!!!!" - color = "#820000" // rgb: 130, 0, 0 - boozepwr = 3 - - glass_icon_state = "demonsblood" - glass_name = "glass of Demons' Blood" - glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up." - glass_center_of_mass = list("x"=16, "y"=2) - - ethanol/vodkatonic - name = "Vodka and Tonic" - id = "vodkatonic" - description = "For when a gin and tonic isn't russian enough." - color = "#0064C8" // rgb: 0, 100, 200 - boozepwr = 3 - dizzy_adj = 4 - slurr_adj = 3 - - glass_icon_state = "vodkatonicglass" - glass_name = "glass of vodka and tonic" - glass_desc = "For when a gin and tonic isn't Russian enough." - glass_center_of_mass = list("x"=16, "y"=7) - - ethanol/ginfizz - name = "Gin Fizz" - id = "ginfizz" - description = "Refreshingly lemony, deliciously dry." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1.5 - dizzy_adj = 4 - slurr_adj = 3 - - glass_icon_state = "ginfizzglass" - glass_name = "glass of gin fizz" - glass_desc = "Refreshingly lemony, deliciously dry." - glass_center_of_mass = list("x"=16, "y"=7) - - ethanol/bahama_mama - name = "Bahama mama" - id = "bahama_mama" - description = "Tropical cocktail." - color = "#FF7F3B" // rgb: 255, 127, 59 - boozepwr = 2 - - glass_icon_state = "bahama_mama" - glass_name = "glass of Bahama Mama" - glass_desc = "Tropical cocktail" - glass_center_of_mass = list("x"=16, "y"=5) - - ethanol/singulo - name = "Singulo" - id = "singulo" - description = "A blue-space beverage!" - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 5 - dizzy_adj = 15 - slurr_adj = 15 - - glass_icon_state = "singulo" - glass_name = "glass of Singulo" - glass_desc = "A blue-space beverage." - glass_center_of_mass = list("x"=17, "y"=4) - - ethanol/sbiten - name = "Sbiten" - id = "sbiten" - description = "A spicy Vodka! Might be a little hot for the little guys!" - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "sbitenglass" - glass_name = "glass of Sbiten" - glass_desc = "A spicy mix of Vodka and Spice. Very hot." - glass_center_of_mass = list("x"=17, "y"=8) - - on_mob_life(var/mob/living/M as mob) - if (M.bodytemperature < 360) - M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - return - - ethanol/devilskiss - name = "Devils Kiss" - id = "devilskiss" - description = "Creepy time!" - color = "#A68310" // rgb: 166, 131, 16 - boozepwr = 3 - - glass_icon_state = "devilskiss" - glass_name = "glass of Devil's Kiss" - glass_desc = "Creepy time!" - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/red_mead - name = "Red Mead" - id = "red_mead" - description = "The true Viking's drink! Even though it has a strange red color." - color = "#C73C00" // rgb: 199, 60, 0 - boozepwr = 1.5 - - glass_icon_state = "red_meadglass" - glass_name = "glass of red mead" - glass_desc = "A true Viking's beverage, though its color is strange." - glass_center_of_mass = list("x"=17, "y"=10) - - ethanol/mead - name = "Mead" - id = "mead" - description = "A Viking's drink, though a cheap one." - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1.5 - nutriment_factor = 1 * FOOD_METABOLISM - - glass_icon_state = "meadglass" - glass_name = "glass of mead" - glass_desc = "A Viking's beverage, though a cheap one." - glass_center_of_mass = list("x"=17, "y"=10) - - ethanol/iced_beer - name = "Iced Beer" - id = "iced_beer" - description = "A beer which is so cold the air around it freezes." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 1 - - glass_icon_state = "iced_beerglass" - glass_name = "glass of iced beer" - glass_desc = "A beer so frosty, the air around it freezes." - glass_center_of_mass = list("x"=16, "y"=7) - - on_mob_life(var/mob/living/M as mob) - if(M.bodytemperature > 270) - M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() - return - - ethanol/grog - name = "Grog" - id = "grog" - description = "Watered down rum, NanoTrasen approves!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 0.5 - - glass_icon_state = "grogglass" - glass_name = "glass of grog" - glass_desc = "A fine and cepa drink for Space." - - ethanol/aloe - name = "Aloe" - id = "aloe" - description = "So very, very, very good." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "aloe" - glass_name = "glass of Aloe" - glass_desc = "Very, very, very good." - glass_center_of_mass = list("x"=17, "y"=8) - - ethanol/andalusia - name = "Andalusia" - id = "andalusia" - description = "A nice, strangely named drink." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 3 - - glass_icon_state = "andalusia" - glass_name = "glass of Andalusia" - glass_desc = "A nice, strange named drink." - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/alliescocktail - name = "Allies Cocktail" - id = "alliescocktail" - description = "A drink made from your allies, not as sweet as when made from your enemies." - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - - glass_icon_state = "alliescocktail" - glass_name = "glass of Allies cocktail" - glass_desc = "A drink made from your allies." - glass_center_of_mass = list("x"=17, "y"=8) - - ethanol/acid_spit - name = "Acid Spit" - id = "acidspit" - description = "A drink for the daring, can be deadly if incorrectly prepared!" - reagent_state = LIQUID - color = "#365000" // rgb: 54, 80, 0 - boozepwr = 1.5 - - glass_icon_state = "acidspitglass" - glass_name = "glass of Acid Spit" - glass_desc = "A drink from Nanotrasen. Made from live aliens." - glass_center_of_mass = list("x"=16, "y"=7) - - ethanol/amasec - name = "Amasec" - id = "amasec" - description = "Official drink of the NanoTrasen Gun-Club!" - reagent_state = LIQUID - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 2 - - glass_icon_state = "amasecglass" - glass_name = "glass of Amasec" - glass_desc = "Always handy before COMBAT!!!" - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/changelingsting - name = "Changeling Sting" - id = "changelingsting" - description = "You take a tiny sip and feel a burning sensation..." - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 5 - - glass_icon_state = "changelingsting" - glass_name = "glass of Changeling Sting" - glass_desc = "A stingy drink." - - ethanol/irishcarbomb - name = "Irish Car Bomb" - id = "irishcarbomb" - description = "Mmm, tastes like chocolate cake..." - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 3 - dizzy_adj = 5 - - glass_icon_state = "irishcarbomb" - glass_name = "glass of Irish Car Bomb" - glass_desc = "An irish car bomb." - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/syndicatebomb - name = "Syndicate Bomb" - id = "syndicatebomb" - description = "Tastes like terrorism!" - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 5 - - glass_icon_state = "syndicatebomb" - glass_name = "glass of Syndicate Bomb" - glass_desc = "Tastes like terrorism!" - glass_center_of_mass = list("x"=16, "y"=4) - - ethanol/erikasurprise - name = "Erika Surprise" - id = "erikasurprise" - description = "The surprise is it's green!" - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 3 - - glass_icon_state = "erikasurprise" - glass_name = "glass of Erika Surprise" - glass_desc = "The surprise is, it's green!" - glass_center_of_mass = list("x"=16, "y"=9) - - ethanol/driestmartini - name = "Driest Martini" - id = "driestmartini" - description = "Only for the experienced. You think you see sand floating in the glass." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 4 - - glass_icon_state = "driestmartiniglass" - glass_name = "glass of Driest Martini" - glass_desc = "Only for the experienced. You think you see sand floating in the glass." - glass_center_of_mass = list("x"=17, "y"=8) - - ethanol/bananahonk - name = "Banana Mama" - id = "bananahonk" - description = "A drink from Clown Heaven." - nutriment_factor = 1 * REAGENTS_METABOLISM - color = "#FFFF91" // rgb: 255, 255, 140 - boozepwr = 4 - - glass_icon_state = "bananahonkglass" - glass_name = "glass of Banana Honk" - glass_desc = "A drink from Banana Heaven." - glass_center_of_mass = list("x"=16, "y"=8) - - ethanol/silencer - name = "Silencer" - id = "silencer" - description = "A drink from Mime Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - boozepwr = 4 - - glass_icon_state = "silencerglass" - glass_name = "glass of Silencer" - glass_desc = "A drink from mime Heaven." - glass_center_of_mass = list("x"=16, "y"=9) - - on_mob_life(var/mob/living/M as mob) - if(!data) data = 1 - data++ - M.dizziness +=10 - if(data >= 55 && data <115) - if (!M.stuttering) M.stuttering = 1 - M.stuttering += 10 - else if(data >= 115 && prob(33)) - M.confused = max(M.confused+15,15) - ..() - return - -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM +/datum/reagent + var/name = "Reagent" + var/id = "reagent" + var/description = "" + var/datum/reagents/holder = null + var/reagent_state = SOLID + var/list/data = null + var/volume = 0 + var/nutriment_factor = 0 + var/custom_metabolism = REAGENTS_METABOLISM + var/overdose = 0 + var/overdose_dam = 1 + var/scannable = 0 //shows up on health analyzers + var/glass_icon_state = null + var/glass_name = null + var/glass_desc = null + var/glass_center_of_mass = null + //var/list/viruses = list() + var/color = "#000000" // rgb: 0, 0, 0, 0 - supports alpha channels + var/color_weight = 1 + +/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //By default we have a chance to transfer some + if(!istype(M, /mob/living)) return 0 + var/datum/reagent/self = src + src = null //of the reagent to the mob on TOUCHING it. + + if(self.holder) //for catching rare runtimes + if(!istype(self.holder.my_atom, /obj/effect/effect/smoke/chem)) + // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl + + if(method == TOUCH) + + var/chance = 1 + var/block = 0 + + for(var/obj/item/clothing/C in M.get_equipped_items()) + if(C.permeability_coefficient < chance) chance = C.permeability_coefficient + if(istype(C, /obj/item/clothing/suit/bio_suit)) + // bio suits are just about completely fool-proof - Doohl + // kind of a hacky way of making bio suits more resistant to chemicals but w/e + if(prob(75)) + block = 1 + + if(istype(C, /obj/item/clothing/head/bio_hood)) + if(prob(75)) + block = 1 + + chance = chance * 100 + + if(prob(chance) && !block) + if(M.reagents) + M.reagents.add_reagent(self.id,self.volume/2) + return 1 + +/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object + src = null //if it can hold reagents. nope! + //if(O.reagents) + // O.reagents.add_reagent(id,volume/3) + return + +/datum/reagent/proc/reaction_turf(var/turf/T, var/volume) + src = null + return + +/datum/reagent/proc/on_mob_life(var/mob/living/M as mob, var/alien) + if(!istype(M, /mob/living)) + return //Noticed runtime errors from pacid trying to damage ghosts, this should fix. --NEO + if( (overdose > 0) && (volume >= overdose))//Overdosing, wooo + M.adjustToxLoss(overdose_dam) + holder.remove_reagent(src.id, custom_metabolism) //By default it slowly disappears. + return + +/datum/reagent/proc/on_move(var/mob/M) + return + +// Called after add_reagents creates a new reagent. +/datum/reagent/proc/on_new(var/data) + return + +// Called when two reagents of the same are mixing. <-- Blatant lies +/datum/reagent/proc/on_merge(var/newdata, var/newamount) + return + +/datum/reagent/proc/on_update(var/atom/A) + return + +/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references + ..() + holder = null + +/datum/reagent/woodpulp + name = "Wood Pulp" + id = "woodpulp" + description = "A mass of wood fibers." + reagent_state = LIQUID + color = "#B97A57" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm new file mode 100644 index 0000000000..36749ef408 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -0,0 +1,225 @@ +/datum/reagent/blood + data = new/list("donor"=null,"viruses"=null,"species"="Human","blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = list()) + name = "Blood" + id = "blood" + reagent_state = LIQUID + color = "#C80000" // rgb: 200, 0, 0 + + glass_icon_state = "glass_red" + glass_name = "glass of tomato juice" + glass_desc = "Are you sure this is tomato juice?" + +/datum/reagent/blood/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + var/datum/reagent/blood/self = src + src = null + if(self.data && self.data["viruses"]) + for(var/datum/disease/D in self.data["viruses"]) + //var/datum/disease/virus = new D.type(0, D, 1) + // We don't spread. + if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS) continue + + if(method == TOUCH) + M.contract_disease(D) + else //injected + M.contract_disease(D, 1, 0) + if(self.data && self.data["virus2"] && istype(M, /mob/living/carbon))//infecting... + var/list/vlist = self.data["virus2"] + if (vlist.len) + for (var/ID in vlist) + var/datum/disease2/disease/V = vlist[ID] + + if(method == TOUCH) + infect_virus2(M,V.getcopy()) + else + infect_virus2(M,V.getcopy(),1) //injected, force infection! + if(self.data && self.data["antibodies"] && istype(M, /mob/living/carbon))//... and curing + var/mob/living/carbon/C = M + C.antibodies |= self.data["antibodies"] + +/datum/reagent/blood/on_merge(var/newdata, var/newamount) + if(!data || !newdata) + return + if(newdata["blood_colour"]) + color = newdata["blood_colour"] + if(data && newdata) + if(data["viruses"] || newdata["viruses"]) + + var/list/mix1 = data["viruses"] + var/list/mix2 = newdata["viruses"] + + // Stop issues with the list changing during mixing. + var/list/to_mix = list() + + for(var/datum/disease/advance/AD in mix1) + to_mix += AD + for(var/datum/disease/advance/AD in mix2) + to_mix += AD + + var/datum/disease/advance/AD = Advance_Mix(to_mix) + if(AD) + var/list/preserve = list(AD) + for(var/D in data["viruses"]) + if(!istype(D, /datum/disease/advance)) + preserve += D + data["viruses"] = preserve + return ..() + +/datum/reagent/blood/on_update(var/atom/A) + if(data["blood_colour"]) + color = data["blood_colour"] + return ..() + +/datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place + if(!istype(T)) return + var/datum/reagent/blood/self = src + src = null + if(!(volume >= 3)) return + + if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) + blood_splatter(T,self,1) + else if(istype(self.data["donor"], /mob/living/carbon/alien)) + var/obj/effect/decal/cleanable/blood/B = blood_splatter(T,self,1) + if(B) B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" + if(volume >= 5 && !istype(T.loc, /area/chapel)) //blood desanctifies non-chapel tiles + T.holy = 0 + return + +/* Must check the transfering of reagents and their data first. They all can point to one disease datum. + +/datum/reagent/blood/Destroy() + if(src.data["virus"]) + var/datum/disease/D = src.data["virus"] + D.cure(0) + ..() +*/ + +/datum/reagent/vaccine + //data must contain virus type + name = "Vaccine" + id = "vaccine" + reagent_state = LIQUID + color = "#C81040" // rgb: 200, 16, 64 + +/datum/reagent/vaccine/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + var/datum/reagent/vaccine/self = src + src = null + if(self.data&&method == INGEST) + for(var/datum/disease/D in M.viruses) + if(istype(D, /datum/disease/advance)) + var/datum/disease/advance/A = D + if(A.GetDiseaseID() == self.data) + D.cure() + else + if(D.type == self.data) + D.cure() + + M.resistances += self.data + return + +#define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L) +/datum/reagent/water + name = "Water" + id = "water" + description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." + reagent_state = LIQUID + color = "#0064C877" // rgb: 0, 100, 200 + custom_metabolism = 0.01 + + glass_icon_state = "glass_clear" + glass_name = "glass of water" + glass_desc = "The father of all refreshments." + +/datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + + //If the turf is hot enough, remove some heat + var/datum/gas_mixture/environment = T.return_air() + var/min_temperature = T0C + 100 //100C, the boiling point of water + + if (environment && environment.temperature > min_temperature) //abstracted as steam or something + var/removed_heat = between(0, volume*WATER_LATENT_HEAT, -environment.get_thermal_energy_change(min_temperature)) + environment.add_thermal_energy(-removed_heat) + if (prob(5)) + T.visible_message("\red The water sizzles as it lands on \the [T]!") + + else //otherwise, the turf gets wet + if(volume >= 3) + if(T.wet >= 1) return + T.wet = 1 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") + T.overlays += T.wet_overlay + + src = null + spawn(800) + if (!istype(T)) return + if(T.wet >= 2) return + T.wet = 0 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + + //Put out fires. + var/hotspot = (locate(/obj/fire) in T) + if(hotspot) + qdel(hotspot) + if(environment) + environment.react() //react at the new temperature + +/datum/reagent/water/reaction_obj(var/obj/O, var/volume) + var/turf/T = get_turf(O) + var/hotspot = (locate(/obj/fire) in T) + if(hotspot && !istype(T, /turf/space)) + var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles ) + lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) + lowertemp.react() + T.assume_air(lowertemp) + qdel(hotspot) + if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) + var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O + if(!cube.wrapped) + cube.Expand() + +/datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if (istype(M, /mob/living/carbon/slime)) + var/mob/living/carbon/slime/S = M + S.apply_water(volume) + if(method == TOUCH && isliving(M)) + M.adjust_fire_stacks(-(volume / 10)) + if(M.fire_stacks <= 0) + M.ExtinguishMob() + return + +/datum/reagent/fuel + name = "Welding fuel" + id = "fuel" + description = "Required for welders. Flamable." + reagent_state = LIQUID + color = "#660000" // rgb: 102, 0, 0 + overdose = REAGENTS_OVERDOSE + + glass_icon_state = "dr_gibb_glass" + glass_name = "glass of welder fuel" + glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption." + +/datum/reagent/fuel/reaction_obj(var/obj/O, var/volume) + var/turf/the_turf = get_turf(O) + if(!the_turf) + return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO + new /obj/effect/decal/cleanable/liquid_fuel(the_turf, volume) +/datum/reagent/fuel/reaction_turf(var/turf/T, var/volume) + new /obj/effect/decal/cleanable/liquid_fuel(T, volume) + return +/datum/reagent/fuel/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1) + ..() + return +/datum/reagent/fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm new file mode 100644 index 0000000000..c12ad11ebf --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -0,0 +1,405 @@ +/datum/reagent/aluminum + name = "Aluminum" + id = "aluminum" + description = "A silvery white and ductile member of the boron group of chemical elements." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + +/datum/reagent/carbon + name = "Carbon" + id = "carbon" + description = "A chemical element, the builing block of life." + reagent_state = SOLID + color = "#1C1300" // rgb: 30, 20, 0 + + custom_metabolism = 0.01 + +/datum/reagent/carbon/reaction_turf(var/turf/T, var/volume) + src = null + if(!istype(T, /turf/space)) + var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, T) + if (!dirtoverlay) + dirtoverlay = new/obj/effect/decal/cleanable/dirt(T) + dirtoverlay.alpha = volume*30 + else + dirtoverlay.alpha = min(dirtoverlay.alpha+volume*30, 255) + +/datum/reagent/chlorine + name = "Chlorine" + id = "chlorine" + description = "A chemical element with a characteristic odour." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/chlorine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.take_organ_damage(1*REM, 0) + ..() + return + +/datum/reagent/copper + name = "Copper" + id = "copper" + description = "A highly ductile metal." + color = "#6E3B08" // rgb: 110, 59, 8 + + custom_metabolism = 0.01 + +/datum/reagent/ethanol + name = "Ethanol" //Parent class for all alcoholic reagents. + id = "ethanol" + description = "A well-known alcohol with a variety of applications." + reagent_state = LIQUID + nutriment_factor = 0 //So alcohol can fill you up! If they want to. + color = "#404030" // rgb: 64, 64, 48 + var/boozepwr = 5 //higher numbers mean the booze will have an effect faster. + var/dizzy_adj = 3 + var/adj_drowsy = 0 + var/adj_sleepy = 0 + var/slurr_adj = 3 + var/confused_adj = 2 + var/slur_start = 90 //amount absorbed after which mob starts slurring + var/confused_start = 150 //amount absorbed after which mob starts confusing directions + var/blur_start = 300 //amount absorbed after which mob starts getting blurred vision + var/pass_out = 400 //amount absorbed after which mob starts passing out + + glass_icon_state = "glass_clear" + glass_name = "glass of ethanol" + glass_desc = "A well-known alcohol with a variety of applications." + +/datum/reagent/ethanol/on_mob_life(var/mob/living/M as mob, var/alien) + M:nutrition += nutriment_factor + holder.remove_reagent(src.id, (alien ? FOOD_METABOLISM : ALCOHOL_METABOLISM)) // Catch-all for creatures without livers. + + if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) + if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) + + if(!src.data || (!isnum(src.data) && src.data.len)) data = 1 //if it doesn't exist we set it. if it's a list we're going to set it to 1 as well. This is to + src.data += boozepwr //avoid a runtime error associated with drinking blood mixed in drinks (demon's blood). + + var/d = data + + // make all the beverages work together + for(var/datum/reagent/ethanol/A in holder.reagent_list) + if(A != src && isnum(A.data)) d += A.data + + if(alien && alien == IS_SKRELL) //Skrell get very drunk very quickly. + d*=5 + + M.dizziness += dizzy_adj. + if(d >= slur_start && d < pass_out) + if (!M:slurring) M:slurring = 1 + M:slurring += slurr_adj + if(d >= confused_start && prob(33)) + if (!M:confused) M:confused = 1 + M.confused = max(M:confused+confused_adj,0) + if(d >= blur_start) + M.eye_blurry = max(M.eye_blurry, 10) + M:drowsyness = max(M:drowsyness, 0) + if(d >= pass_out) + M:paralysis = max(M:paralysis, 20) + M:drowsyness = max(M:drowsyness, 30) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"] + if (!L) + H.adjustToxLoss(5) + else if(istype(L)) + L.take_damage(0.1, 1) + H.adjustToxLoss(0.1) + ..() + return + +/datum/reagent/ethanol/reaction_obj(var/obj/O, var/volume) + if(istype(O,/obj/item/weapon/paper)) + var/obj/item/weapon/paper/paperaffected = O + paperaffected.clearpaper() + usr << "The solution dissolves the ink on the paper." + if(istype(O,/obj/item/weapon/book)) + if(istype(O,/obj/item/weapon/book/tome)) + usr << "The solution does nothing. Whatever this is, it isn't normal ink." + return + if(volume >= 5) + var/obj/item/weapon/book/affectedbook = O + affectedbook.dat = null + usr << "The solution dissolves the ink on the book." + else + usr << "It wasn't enough..." + return + +/datum/reagent/ethanol/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel. + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 15) + return + +/datum/reagent/fluorine + name = "Fluorine" + id = "fluorine" + description = "A highly-reactive chemical element." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/fluorine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(1*REM) + ..() + return + +/datum/reagent/hydrogen + name = "Hydrogen" + id = "hydrogen" + description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + + custom_metabolism = 0.01 + +/datum/reagent/iron + name = "Iron" + id = "iron" + description = "Pure iron is a metal." + reagent_state = SOLID + color = "#353535" + overdose = REAGENTS_OVERDOSE + +/datum/reagent/lithium + name = "Lithium" + id = "lithium" + description = "A chemical element, used as antidepressant." + reagent_state = SOLID + color = "#808080" // rgb: 128, 128, 128 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/lithium/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.canmove && !M.restrained() && istype(M.loc, /turf/space)) + step(M, pick(cardinal)) + if(prob(5)) M.emote(pick("twitch","drool","moan")) + ..() + return + +/datum/reagent/mercury + name = "Mercury" + id = "mercury" + description = "A chemical element." + reagent_state = LIQUID + color = "#484848" // rgb: 72, 72, 72 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/mercury/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.canmove && !M.restrained() && istype(M.loc, /turf/space)) + step(M, pick(cardinal)) + if(prob(5)) M.emote(pick("twitch","drool","moan")) + M.adjustBrainLoss(2) + ..() + return + +/datum/reagent/nitrogen + name = "Nitrogen" + id = "nitrogen" + description = "A colorless, odorless, tasteless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + + custom_metabolism = 0.01 + +/datum/reagent/nitrogen/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2) return + if(alien && alien == IS_VOX) + M.adjustOxyLoss(-2*REM) + holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. + return + ..() + +/datum/reagent/oxygen + name = "Oxygen" + id = "oxygen" + description = "A colorless, odorless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + + custom_metabolism = 0.01 + +/datum/reagent/oxygen/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2) return + if(alien && alien == IS_VOX) + M.adjustToxLoss(REAGENTS_METABOLISM) + holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears. + return + ..() + +/datum/reagent/phosphorus + name = "Phosphorus" + id = "phosphorus" + description = "A chemical element, the backbone of biological energy carriers." + reagent_state = SOLID + color = "#832828" // rgb: 131, 40, 40 + + custom_metabolism = 0.01 + +/datum/reagent/potassium + name = "Potassium" + id = "potassium" + description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." + reagent_state = SOLID + color = "#A0A0A0" // rgb: 160, 160, 160 + + custom_metabolism = 0.01 + +/datum/reagent/radium + name = "Radium" + id = "radium" + description = "Radium is an alkaline earth metal. It is extremely radioactive." + reagent_state = SOLID + color = "#C7C7C7" // rgb: 199,199,199 + +/datum/reagent/radium/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.apply_effect(2*REM,IRRADIATE,0) + // radium may increase your chances to cure a disease + if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs + var/mob/living/carbon/C = M + if(C.virus2.len) + for (var/ID in C.virus2) + var/datum/disease2/disease/V = C.virus2[ID] + if(prob(5)) + C.antibodies |= V.antigen + if(prob(50)) + M.radiation += 50 // curing it that way may kill you instead + var/absorbed + var/obj/item/organ/diona/nutrients/rad_organ = locate() in C.internal_organs + if(rad_organ && !rad_organ.is_broken()) + absorbed = 1 + if(!absorbed) + M.adjustToxLoss(100) + ..() + return + +/datum/reagent/radium/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 3) + if(!istype(T, /turf/space)) + var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T) + if(!glow) + new /obj/effect/decal/cleanable/greenglow(T) + return + +/datum/reagent/toxin/acid + name = "Sulphuric acid" + id = "sacid" + description = "A very corrosive mineral acid with the molecular formula H2SO4." + reagent_state = LIQUID + color = "#DB5008" // rgb: 219, 80, 8 + toxpwr = 1 + var/meltprob = 10 + +/datum/reagent/toxin/acid/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.take_organ_damage(0, 1*REM) + ..() + return + +/datum/reagent/toxin/acid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//magic numbers everywhere + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(H.head) + if(prob(meltprob) && !H.head.unacidable) + H << "Your headgear melts away but protects you from the acid!" + qdel(H.head) + H.update_inv_head(0) + H.update_hair(0) + else + H << "Your headgear protects you from the acid." + return + + if(H.wear_mask) + if(prob(meltprob) && !H.wear_mask.unacidable) + H << "Your mask melts away but protects you from the acid!" + qdel (H.wear_mask) + H.update_inv_wear_mask(0) + H.update_hair(0) + else + H << "Your mask protects you from the acid." + return + + if(H.glasses) //Doesn't protect you from the acid but can melt anyways! + if(prob(meltprob) && !H.glasses.unacidable) + H << "Your glasses melts away!" + qdel (H.glasses) + H.update_inv_glasses(0) + + if(!M.unacidable) + if(istype(M, /mob/living/carbon/human) && volume >= 10) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + if(affecting.take_damage(4*toxpwr, 2*toxpwr)) + H.UpdateDamageIcon() + if(prob(meltprob)) //Applies disfigurement + if (!(H.species && (H.species.flags & NO_PAIN))) + H.emote("scream") + H.status_flags |= DISFIGURED + else + M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) // uses min() and volume to make sure they aren't being sprayed in trace amounts (1 unit != insta rape) -- Doohl + else + if(!M.unacidable) + M.take_organ_damage(min(6*toxpwr, volume * toxpwr)) + +/datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume) + if((istype(O,/obj/item) || istype(O,/obj/effect/plant)) && prob(meltprob * 3)) + if(!O.unacidable) + var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) + I.desc = "Looks like this was \an [O] some time ago." + for(var/mob/M in viewers(5, O)) + M << "\red \the [O] melts." + qdel(O) + +/datum/reagent/silicon + name = "Silicon" + id = "silicon" + description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + +/datum/reagent/sodium + name = "Sodium" + id = "sodium" + description = "A chemical element, readily reacts with water." + reagent_state = SOLID + color = "#808080" // rgb: 128, 128, 128 + + custom_metabolism = 0.01 + +/datum/reagent/sugar + name = "Sugar" + id = "sugar" + description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255, 255, 255 + + glass_icon_state = "iceglass" + glass_name = "glass of sugar" + glass_desc = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." + +/datum/reagent/sugar/on_mob_life(var/mob/living/M as mob) + M.nutrition += 1*REM + ..() + return + +/datum/reagent/sulfur + name = "Sulfur" + id = "sulfur" + description = "A chemical element with a pungent smell." + reagent_state = SOLID + color = "#BF8C00" // rgb: 191, 140, 0 + + custom_metabolism = 0.01 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm new file mode 100644 index 0000000000..afb6585e1b --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -0,0 +1,2191 @@ + +/datum/reagent/nutriment + name = "Nutriment" + id = "nutriment" + description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." + reagent_state = SOLID + nutriment_factor = 15 * REAGENTS_METABOLISM + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/nutriment/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(50)) M.heal_organ_damage(1,0) + M.nutrition += nutriment_factor // For hunger and fatness + ..() + return + +/datum/reagent/nutriment/protein // Bad for Skrell! + name = "animal protein" + id = "protein" + color = "#440000" + +/datum/reagent/nutriment/protein/on_mob_life(var/mob/living/M, var/alien) + if(alien && alien == IS_SKRELL) + M.adjustToxLoss(0.5) + M.nutrition -= nutriment_factor + ..() + +/datum/reagent/nutriment/egg // Also bad for skrell. Not a child of protein because it might mess up, not sure. + name = "egg yolk" + id = "egg" + color = "#FFFFAA" + +/datum/reagent/nutriment/egg/on_mob_life(var/mob/living/M, var/alien) + if(alien && alien == IS_SKRELL) + M.adjustToxLoss(0.5) + M.nutrition -= nutriment_factor + ..() + +/datum/reagent/flour + name = "flour" + id = "flour" + description = "This is what you rub all over yourself to pretend to be a ghost." + reagent_state = SOLID + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#FFFFFF" // rgb: 0, 0, 0 + +/datum/reagent/flour/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/flour/reaction_turf(var/turf/T, var/volume) + src = null + if(!istype(T, /turf/space)) + new /obj/effect/decal/cleanable/flour(T) + +/datum/reagent/coco + name = "Coco Powder" + id = "coco" + description = "A fatty, bitter paste made from coco beans." + reagent_state = SOLID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/coco/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/soysauce + name = "Soysauce" + id = "soysauce" + description = "A salty sauce made from the soy plant." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#792300" // rgb: 121, 35, 0 + +/datum/reagent/ketchup + name = "Ketchup" + id = "ketchup" + description = "Ketchup, catsup, whatever. It's tomato paste." + reagent_state = LIQUID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#731008" // rgb: 115, 16, 8 + +/datum/reagent/rice + name = "Rice" + id = "rice" + description = "Enjoy the great taste of nothing." + reagent_state = SOLID + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#FFFFFF" // rgb: 0, 0, 0 + +/datum/reagent/rice/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/cherryjelly + name = "Cherry Jelly" + id = "cherryjelly" + description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." + reagent_state = LIQUID + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#801E28" // rgb: 128, 30, 40 + +/datum/reagent/cherryjelly/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/cornoil + name = "Corn Oil" + id = "cornoil" + description = "An oil derived from various types of corn." + reagent_state = LIQUID + nutriment_factor = 20 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/cornoil/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/cornoil/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + src = null + if(volume >= 3) + if(T.wet >= 1) return + T.wet = 1 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") + T.overlays += T.wet_overlay + + spawn(800) + if (!istype(T)) return + if(T.wet >= 2) return + T.wet = 0 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + var/hotspot = (locate(/obj/fire) in T) + if(hotspot) + var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles ) + lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) + lowertemp.react() + T.assume_air(lowertemp) + qdel(hotspot) + +/datum/reagent/virus_food + name = "Virus Food" + id = "virusfood" + description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#899613" // rgb: 137, 150, 19 + +/datum/reagent/virus_food/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.nutrition += nutriment_factor*REM + ..() + return + +/datum/reagent/sprinkles + name = "Sprinkles" + id = "sprinkles" + description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#FF00FF" // rgb: 255, 0, 255 + +/datum/reagent/sprinkles/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + /*if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + */ + ..() + +/datum/reagent/toxin/minttoxin + name = "Mint Toxin" + id = "minttoxin" + description = "Useful for dealing with undesirable customers." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + toxpwr = 0 + +/datum/reagent/toxin/minttoxin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if (FAT in M.mutations) + M.gib() + ..() + return + +/datum/reagent/lipozine + name = "Lipozine" // The anti-nutriment. + id = "lipozine" + description = "A chemical compound that causes a powerful fat-burning reaction." + reagent_state = LIQUID + nutriment_factor = 10 * REAGENTS_METABOLISM + color = "#BBEDA4" // rgb: 187, 237, 164 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/lipozine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.nutrition = max(M.nutrition - nutriment_factor, 0) + M.overeatduration = 0 + if(M.nutrition < 0)//Prevent from going into negatives. + M.nutrition = 0 + ..() + return + +/datum/reagent/sodiumchloride + name = "Table Salt" + id = "sodiumchloride" + description = "A salt made of sodium chloride. Commonly used to season food." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255,255,255 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/blackpepper + name = "Black Pepper" + id = "blackpepper" + description = "A powder ground from peppercorns. *AAAACHOOO*" + reagent_state = SOLID + // no color (ie, black) + +/datum/reagent/enzyme + name = "Universal Enzyme" + id = "enzyme" + description = "A universal enzyme used in the preperation of certain chemicals and foods." + reagent_state = LIQUID + color = "#365E30" // rgb: 54, 94, 48 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/frostoil + name = "Frost Oil" + id = "frostoil" + description = "A special oil that noticably chills the body. Extracted from Ice Peppers." + reagent_state = LIQUID + color = "#B31008" // rgb: 139, 166, 233 + +/datum/reagent/frostoil/on_mob_life(var/mob/living/M as mob) + if(!M) + M = holder.my_atom + M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) + if(prob(1)) + M.emote("shiver") + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature = max(M.bodytemperature - rand(10,20), 0) + holder.remove_reagent("capsaicin", 5) + holder.remove_reagent(src.id, FOOD_METABOLISM) + ..() + return + +/datum/reagent/frostoil/reaction_turf(var/turf/simulated/T, var/volume) + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(15,30)) + +/datum/reagent/capsaicin + name = "Capsaicin Oil" + id = "capsaicin" + description = "This is what makes chilis hot." + reagent_state = LIQUID + color = "#B31008" // rgb: 179, 16, 8 + +/datum/reagent/capsaicin/on_mob_life(var/mob/living/M as mob) + if(!M) + M = holder.my_atom + if(!data) + data = 1 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && !(H.species.flags & (NO_PAIN | IS_SYNTHETIC)) ) + switch(data) + if(1 to 2) + H << "\red Your insides feel uncomfortably hot !" + if(2 to 20) + if(prob(5)) + H << "\red Your insides feel uncomfortably hot !" + if(20 to INFINITY) + H.apply_effect(2,AGONY,0) + if(prob(5)) + H.visible_message("[H] [pick("dry heaves!","coughs!","splutters!")]") + H << "\red You feel like your insides are burning !" + else if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(10,25) + holder.remove_reagent("frostoil", 5) + holder.remove_reagent(src.id, FOOD_METABOLISM) + data++ + ..() + return + +/datum/reagent/condensedcapsaicin + name = "Condensed Capsaicin" + id = "condensedcapsaicin" + description = "A chemical agent used for self-defense and in police work." + reagent_state = LIQUID + color = "#B31008" // rgb: 179, 16, 8 + +/datum/reagent/condensedcapsaicin/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/victim = M + var/mouth_covered = 0 + var/eyes_covered = 0 + var/obj/item/safe_thing = null + if( victim.wear_mask ) + if ( victim.wear_mask.flags & MASKCOVERSEYES ) + eyes_covered = 1 + safe_thing = victim.wear_mask + if ( victim.wear_mask.flags & MASKCOVERSMOUTH ) + mouth_covered = 1 + safe_thing = victim.wear_mask + if( victim.head ) + if ( victim.head.flags & MASKCOVERSEYES ) + eyes_covered = 1 + safe_thing = victim.head + if ( victim.head.flags & MASKCOVERSMOUTH ) + mouth_covered = 1 + safe_thing = victim.head + if(victim.glasses) + eyes_covered = 1 + if ( !safe_thing ) + safe_thing = victim.glasses + if ( eyes_covered && mouth_covered ) + victim << "\red Your [safe_thing] protects you from the pepperspray!" + return + else if ( eyes_covered ) // Reduced effects if partially protected + victim << "\red Your [safe_thing] protect you from most of the pepperspray!" + victim.eye_blurry = max(M.eye_blurry, 15) + victim.eye_blind = max(M.eye_blind, 5) + victim.Stun(5) + victim.Weaken(5) + //victim.Paralyse(10) + //victim.drop_item() + return + else if ( mouth_covered ) // Mouth cover is better than eye cover + victim << "\red Your [safe_thing] protects your face from the pepperspray!" + if (!(victim.species && (victim.species.flags & NO_PAIN))) + victim.emote("scream") + victim.eye_blurry = max(M.eye_blurry, 5) + return + else // Oh dear :D + if (!(victim.species && (victim.species.flags & NO_PAIN))) + victim.emote("scream") + victim << "\red You're sprayed directly in the eyes with pepperspray!" + victim.eye_blurry = max(M.eye_blurry, 25) + victim.eye_blind = max(M.eye_blind, 10) + victim.Stun(5) + victim.Weaken(5) + //victim.Paralyse(10) + //victim.drop_item() + +/datum/reagent/condensedcapsaicin/on_mob_life(var/mob/living/M as mob) + if(!M) + M = holder.my_atom + if(!data) + data = 1 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && !(H.species.flags & (NO_PAIN | IS_SYNTHETIC)) ) + switch(data) + if(1) + H << "\red You feel like your insides are burning !" + if(2 to INFINITY) + H.apply_effect(4,AGONY,0) + if(prob(5)) + H.visible_message("[H] [pick("dry heaves!","coughs!","splutters!")]") + H << "\red You feel like your insides are burning !" + else if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(15,30) + holder.remove_reagent("frostoil", 5) + holder.remove_reagent(src.id, FOOD_METABOLISM) + data++ + ..() + return + +/datum/reagent/drink + name = "Drink" + id = "drink" + description = "Uh, some kind of drink." + reagent_state = LIQUID + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#E78108" // rgb: 231, 129, 8 + var/adj_dizzy = 0 + var/adj_drowsy = 0 + var/adj_sleepy = 0 + var/adj_temp = 0 + +/datum/reagent/drink/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) + // Drinks should be used up faster than other reagents. + holder.remove_reagent(src.id, FOOD_METABOLISM) + if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy) + if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) + if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) + if (adj_temp) + if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 + M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) + + ..() + return + +/datum/reagent/drink/banana + name = "Banana Juice" + id = "banana" + description = "The raw essence of a banana." + color = "#C3AF00" // rgb: 195, 175, 0 + + glass_icon_state = "banana" + glass_name = "glass of banana juice" + glass_desc = "The raw essence of a banana. HONK!" + +/datum/reagent/drink/berryjuice + name = "Berry Juice" + id = "berryjuice" + description = "A delicious blend of several different kinds of berries." + color = "#990066" // rgb: 153, 0, 102 + + glass_icon_state = "berryjuice" + glass_name = "glass of berry juice" + glass_desc = "Berry juice. Or maybe it's jam. Who cares?" + +/datum/reagent/drink/carrotjuice + name = "Carrot juice" + id = "carrotjuice" + description = "It is just like a carrot but without crunching." + color = "#FF8C00" // rgb: 255, 140, 0 + + glass_icon_state = "carrotjuice" + glass_name = "glass of carrot juice" + glass_desc = "It is just like a carrot but without crunching." + +/datum/reagent/drink/carrotjuice/on_mob_life(var/mob/living/M as mob) + ..() + M.eye_blurry = max(M.eye_blurry-1 , 0) + M.eye_blind = max(M.eye_blind-1 , 0) + if(!data) data = 1 + switch(data) + if(1 to 20) + //nothing + if(21 to INFINITY) + if (prob(data-10)) + M.disabilities &= ~NEARSIGHTED + data++ + return + +/datum/reagent/drink/grapejuice + name = "Grape Juice" + id = "grapejuice" + description = "It's grrrrrape!" + color = "#863333" // rgb: 134, 51, 51 + + glass_icon_state = "grapejuice" + glass_name = "glass of grape juice" + glass_desc = "It's grrrrrape!" + +/datum/reagent/drink/lemonjuice + name = "Lemon Juice" + id = "lemonjuice" + description = "This juice is VERY sour." + color = "#AFAF00" // rgb: 175, 175, 0 + + glass_icon_state = "lemonjuice" + glass_name = "glass of lemon juice" + glass_desc = "Sour..." + +/datum/reagent/drink/limejuice + name = "Lime Juice" + id = "limejuice" + description = "The sweet-sour juice of limes." + color = "#365E30" // rgb: 54, 94, 48 + + glass_icon_state = "glass_green" + glass_name = "glass of lime juice" + glass_desc = "A glass of sweet-sour lime juice" + +/datum/reagent/drink/limejuice/on_mob_life(var/mob/living/M as mob) + ..() + if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1*REM) + return + +/datum/reagent/drink/orangejuice + name = "Orange juice" + id = "orangejuice" + description = "Both delicious AND rich in Vitamin C, what more do you need?" + color = "#E78108" // rgb: 231, 129, 8 + + glass_icon_state = "glass_orange" + glass_name = "glass of orange juice" + glass_desc = "Vitamins! Yay!" + +/datum/reagent/drink/orangejuice/on_mob_life(var/mob/living/M as mob) + ..() + if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1) + return + +/datum/reagent/drink/poisonberryjuice + name = "Poison Berry Juice" + id = "poisonberryjuice" + description = "A tasty juice blended from various kinds of very deadly and toxic berries." + color = "#863353" // rgb: 134, 51, 83 + + glass_icon_state = "poisonberryjuice" + glass_name = "glass of poison berry juice" + glass_desc = "A glass of deadly juice." + +/datum/reagent/drink/poisonberryjuice/on_mob_life(var/mob/living/M as mob) + ..() + M.adjustToxLoss(1) + return + +/datum/reagent/drink/potato_juice + name = "Potato Juice" + id = "potato" + description = "Juice of the potato. Bleh." + nutriment_factor = 2 * FOOD_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + + glass_icon_state = "glass_brown" + glass_name = "glass of potato juice" + glass_desc = "Juice from a potato. Bleh." + +/datum/reagent/drink/tomatojuice + name = "Tomato Juice" + id = "tomatojuice" + description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" + color = "#731008" // rgb: 115, 16, 8 + + glass_icon_state = "glass_red" + glass_name = "glass of tomato juice" + glass_desc = "Are you sure this is tomato juice?" + +/datum/reagent/drink/tomatojuice/on_mob_life(var/mob/living/M as mob) + ..() + if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1) + return + +/datum/reagent/drink/watermelonjuice + name = "Watermelon Juice" + id = "watermelonjuice" + description = "Delicious juice made from watermelon." + color = "#B83333" // rgb: 184, 51, 51 + + glass_icon_state = "glass_red" + glass_name = "glass of watermelon juice" + glass_desc = "Delicious juice made from watermelon." + +/datum/reagent/drink/milk + name = "Milk" + id = "milk" + description = "An opaque white liquid produced by the mammary glands of mammals." + color = "#DFDFDF" // rgb: 223, 223, 223 + + glass_icon_state = "glass_white" + glass_name = "glass of milk" + glass_desc = "White and nutritious goodness!" + +/datum/reagent/drink/milk/on_mob_life(var/mob/living/M as mob) + if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) + holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) + ..() + return + +/datum/reagent/drink/milk/cream + name = "Cream" + id = "cream" + description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" + color = "#DFD7AF" // rgb: 223, 215, 175 + + glass_icon_state = "glass_white" + glass_name = "glass of cream" + glass_desc = "Ewwww..." + +/datum/reagent/drink/milk/soymilk + name = "Soy Milk" + id = "soymilk" + description = "An opaque white liquid made from soybeans." + color = "#DFDFC7" // rgb: 223, 223, 199 + + glass_icon_state = "glass_white" + glass_name = "glass of soy milk" + glass_desc = "White and nutritious soy goodness!" + +/datum/reagent/drink/tea + name = "Tea" + id = "tea" + description = "Tasty black tea, it has antioxidants, it's good for you!" + color = "#101000" // rgb: 16, 16, 0 + adj_dizzy = -2 + adj_drowsy = -1 + adj_sleepy = -3 + adj_temp = 20 + + glass_icon_state = "bigteacup" + glass_name = "cup of tea" + glass_desc = "Tasty black tea, it has antioxidants, it's good for you!" + +/datum/reagent/drink/tea/on_mob_life(var/mob/living/M as mob) + ..() + if(M.getToxLoss() && prob(20)) + M.adjustToxLoss(-1) + return + +/datum/reagent/drink/tea/icetea + name = "Iced Tea" + id = "icetea" + description = "No relation to a certain rap artist/ actor." + color = "#104038" // rgb: 16, 64, 56 + adj_temp = -5 + + glass_icon_state = "icedteaglass" + glass_name = "glass of iced tea" + glass_desc = "No relation to a certain rap artist/ actor." + glass_center_of_mass = list("x"=15, "y"=10) + +/datum/reagent/drink/coffee + name = "Coffee" + id = "coffee" + description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." + color = "#482000" // rgb: 72, 32, 0 + adj_dizzy = -5 + adj_drowsy = -3 + adj_sleepy = -2 + adj_temp = 25 + + glass_icon_state = "hot_coffee" + glass_name = "cup of coffee" + glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + +/datum/reagent/drink/coffee/on_mob_life(var/mob/living/M as mob) + ..() + M.make_jittery(5) + if(adj_temp > 0) + holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) + + holder.remove_reagent(src.id, 0.1) + +/datum/reagent/drink/coffee/icecoffee + name = "Iced Coffee" + id = "icecoffee" + description = "Coffee and ice, refreshing and cool." + color = "#102838" // rgb: 16, 40, 56 + adj_temp = -5 + + glass_icon_state = "icedcoffeeglass" + glass_name = "glass of iced coffee" + glass_desc = "A drink to perk you up and refresh you!" + +/datum/reagent/drink/coffee/soy_latte + name = "Soy Latte" + id = "soy_latte" + description = "A nice and tasty beverage while you are reading your hippie books." + color = "#664300" // rgb: 102, 67, 0 + adj_sleepy = 0 + adj_temp = 5 + + glass_icon_state = "soy_latte" + glass_name = "glass of soy latte" + glass_desc = "A nice and refrshing beverage while you are reading." + glass_center_of_mass = list("x"=15, "y"=9) + +/datum/reagent/drink/coffee/soy_latte/on_mob_life(var/mob/living/M as mob) + ..() + M.sleeping = 0 + if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) + return + +/datum/reagent/drink/coffee/cafe_latte + name = "Cafe Latte" + id = "cafe_latte" + description = "A nice, strong and tasty beverage while you are reading." + color = "#664300" // rgb: 102, 67, 0 + adj_sleepy = 0 + adj_temp = 5 + + glass_icon_state = "cafe_latte" + glass_name = "glass of cafe latte" + glass_desc = "A nice, strong and refreshing beverage while you are reading." + glass_center_of_mass = list("x"=15, "y"=9) + +/datum/reagent/drink/coffee/cafe_latte/on_mob_life(var/mob/living/M as mob) + ..() + M.sleeping = 0 + if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) + return + +/datum/reagent/hot_coco // there's also drink/hot_coco for whatever reason + name = "Hot Chocolate" + id = "hot_coco" + description = "Made with love! And cocoa beans." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#403010" // rgb: 64, 48, 16 + + glass_icon_state = "chocolateglass" + glass_name = "glass of hot chocolate" + glass_desc = "Made with love! And cocoa beans." + +/datum/reagent/hot_coco/on_mob_life(var/mob/living/M as mob) + if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 + M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/drink/hot_coco + name = "Hot Chocolate" + id = "hot_coco" + description = "Made with love! And cocoa beans." + nutriment_factor = 2 * FOOD_METABOLISM + color = "#403010" // rgb: 64, 48, 16 + adj_temp = 5 + + glass_icon_state = "chocolateglass" + glass_name = "glass of hot chocolate" + glass_desc = "Made with love! And cocoa beans." + +/datum/reagent/drink/cold/sodawater + name = "Soda Water" + id = "sodawater" + description = "A can of club soda. Why not make a scotch and soda?" + color = "#619494" // rgb: 97, 148, 148 + adj_dizzy = -5 + adj_drowsy = -3 + + glass_icon_state = "glass_clear" + glass_name = "glass of soda water" + glass_desc = "Soda water. Why not make a scotch and soda?" + +/datum/reagent/drink/grapesoda + name = "Grape Soda" + id = "grapesoda" + description = "Grapes made into a fine drank." + color = "#421C52" // rgb: 98, 57, 53 + adj_drowsy = -3 + + glass_icon_state = "gsodaglass" + glass_name = "glass of grape soda" + glass_desc = "Looks like a delicious drink!" + +/datum/reagent/drink/cold/tonic + name = "Tonic Water" + id = "tonic" + description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." + color = "#664300" // rgb: 102, 67, 0 + adj_dizzy = -5 + adj_drowsy = -3 + adj_sleepy = -2 + + glass_icon_state = "glass_clear" + glass_name = "glass of tonic water" + glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." + +/datum/reagent/drink/cold/lemonade + name = "Lemonade" + description = "Oh the nostalgia..." + id = "lemonade" + color = "#FFFF00" // rgb: 255, 255, 0 + + glass_icon_state = "lemonadeglass" + glass_name = "glass of lemonade" + glass_desc = "Oh the nostalgia..." + +/datum/reagent/drink/cold/kiraspecial + name = "Kira Special" + description = "Long live the guy who everyone had mistaken for a girl. Baka!" + id = "kiraspecial" + color = "#CCCC99" // rgb: 204, 204, 153 + + glass_icon_state = "kiraspecial" + glass_name = "glass of Kira Special" + glass_desc = "Long live the guy who everyone had mistaken for a girl. Baka!" + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/drink/cold/brownstar + name = "Brown Star" + description = "It's not what it sounds like..." + id = "brownstar" + color = "#9F3400" // rgb: 159, 052, 000 + adj_temp = - 2 + + glass_icon_state = "brownstar" + glass_name = "glass of Brown Star" + glass_desc = "It's not what it sounds like..." + +/datum/reagent/drink/cold/milkshake + name = "Milkshake" + description = "Glorious brainfreezing mixture." + id = "milkshake" + color = "#AEE5E4" // rgb" 174, 229, 228 + adj_temp = -9 + + glass_icon_state = "milkshake" + glass_name = "glass of milkshake" + glass_desc = "Glorious brainfreezing mixture." + glass_center_of_mass = list("x"=16, "y"=7) + +/datum/reagent/drink/cold/milkshake/on_mob_life(var/mob/living/M as mob) + if(!M) + M = holder.my_atom + if(prob(1)) + M.emote("shiver") + M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature = max(M.bodytemperature - rand(10,20), 0) + holder.remove_reagent("capsaicin", 5) + holder.remove_reagent(src.id, FOOD_METABOLISM) + ..() + return + +/datum/reagent/drink/cold/rewriter + name = "Rewriter" + description = "The secret of the sanctuary of the Libarian..." + id = "rewriter" + color = "#485000" // rgb:72, 080, 0 + + glass_icon_state = "rewriter" + glass_name = "glass of Rewriter" + glass_desc = "The secret of the sanctuary of the Libarian..." + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/drink/cold/rewriter/on_mob_life(var/mob/living/M as mob) + ..() + M.make_jittery(5) + return + +/datum/reagent/drink/cold/nuka_cola + name = "Nuka Cola" + id = "nuka_cola" + description = "Cola, cola never changes." + color = "#100800" // rgb: 16, 8, 0 + adj_sleepy = -2 + + glass_icon_state = "nuka_colaglass" + glass_name = "glass of Nuka-Cola" + glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" + glass_center_of_mass = list("x"=16, "y"=6) + +/datum/reagent/drink/cold/nuka_cola/on_mob_life(var/mob/living/M as mob) + M.make_jittery(20) + M.druggy = max(M.druggy, 30) + M.dizziness +=5 + M.drowsyness = 0 + ..() + return + +/datum/reagent/drink/grenadine + name = "Grenadine Syrup" + id = "grenadine" + description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?" + color = "#FF004F" // rgb: 255, 0, 79 + + glass_icon_state = "grenadineglass" + glass_name = "glass of grenadine syrup" + glass_desc = "Sweet and tangy, a bar syrup used to add color or flavor to drinks." + glass_center_of_mass = list("x"=17, "y"=6) + +/datum/reagent/drink/cold/space_cola + name = "Space Cola" + id = "cola" + description = "A refreshing beverage." + reagent_state = LIQUID + color = "#100800" // rgb: 16, 8, 0 + adj_drowsy = -3 + + glass_icon_state = "glass_brown" + glass_name = "glass of Space Cola" + glass_desc = "A glass of refreshing Space Cola" + +/datum/reagent/drink/cold/spacemountainwind + name = "Mountain Wind" + id = "spacemountainwind" + description = "Blows right through you like a space wind." + color = "#102000" // rgb: 16, 32, 0 + adj_drowsy = -7 + adj_sleepy = -1 + + glass_icon_state = "Space_mountain_wind_glass" + glass_name = "glass of Space Mountain Wind" + glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." + +/datum/reagent/drink/cold/dr_gibb + name = "Dr. Gibb" + id = "dr_gibb" + description = "A delicious blend of 42 different flavours" + color = "#102000" // rgb: 16, 32, 0 + adj_drowsy = -6 + + glass_icon_state = "dr_gibb_glass" + glass_name = "glass of Dr. Gibb" + glass_desc = "Dr. Gibb. Not as dangerous as the name might imply." + +/datum/reagent/drink/cold/space_up + name = "Space-Up" + id = "space_up" + description = "Tastes like a hull breach in your mouth." + color = "#202800" // rgb: 32, 40, 0 + adj_temp = -8 + + glass_icon_state = "space-up_glass" + glass_name = "glass of Space-up" + glass_desc = "Space-up. It helps keep your cool." + +/datum/reagent/drink/cold/lemon_lime + name = "Lemon Lime" + description = "A tangy substance made of 0.5% natural citrus!" + id = "lemon_lime" + color = "#878F00" // rgb: 135, 40, 0 + adj_temp = -8 + + glass_icon_state = "lemonlime" + glass_name = "glass of lemon lime soda" + glass_desc = "A tangy substance made of 0.5% natural citrus!" + +/datum/reagent/doctor_delight + name = "The Doctor's Delight" + id = "doctorsdelight" + description = "A gulp a day keeps the MediBot away. That's probably for the best." + reagent_state = LIQUID + color = "#FF8CFF" // rgb: 255, 140, 255 + nutriment_factor = 1 * FOOD_METABOLISM + + glass_icon_state = "doctorsdelightglass" + glass_name = "glass of The Doctor's Delight" + glass_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/doctor_delight/on_mob_life(var/mob/living/M as mob) + M:nutrition += nutriment_factor + holder.remove_reagent(src.id, FOOD_METABOLISM) + if(!M) M = holder.my_atom + if(M:getOxyLoss() && prob(50)) M:adjustOxyLoss(-2) + if(M:getBruteLoss() && prob(60)) M:heal_organ_damage(2,0) + if(M:getFireLoss() && prob(50)) M:heal_organ_damage(0,2) + if(M:getToxLoss() && prob(50)) M:adjustToxLoss(-2) + if(M.dizziness !=0) M.dizziness = max(0,M.dizziness-15) + if(M.confused !=0) M.confused = max(0,M.confused - 5) + ..() + return + +/datum/reagent/dry_ramen + name = "Dry Ramen" + id = "dry_ramen" + description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." + reagent_state = SOLID + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/dry_ramen/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + ..() + return + +/datum/reagent/hot_ramen + name = "Hot Ramen" + id = "hot_ramen" + description = "The noodles are boiled, the flavors are artificial, just like being back in school." + reagent_state = LIQUID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/hot_ramen/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 + M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT)) + ..() + return + +/datum/reagent/hell_ramen + name = "Hell Ramen" + id = "hell_ramen" + description = "The noodles are boiled, the flavors are artificial, just like being back in school." + reagent_state = LIQUID + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + +/datum/reagent/hell_ramen/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT + ..() + return + +/datum/reagent/drink/cold/ice + name = "Ice" + id = "ice" + description = "Frozen water, your dentist wouldn't like you chewing this." + reagent_state = SOLID + color = "#619494" // rgb: 97, 148, 148 + + glass_icon_state = "iceglass" + glass_name = "glass of ice" + glass_desc = "Generally, you're supposed to put something else in there too..." + +/datum/reagent/drink/nothing + name = "Nothing" + id = "nothing" + description = "Absolutely nothing." + + glass_icon_state = "nothing" + glass_name = "glass of nothing" + glass_desc = "Absolutely nothing." + +/datum/reagent/drink/cold + name = "Cold drink" + adj_temp = -5 + +/datum/reagent/ethanol/absinthe + name = "Absinthe" + id = "absinthe" + description = "Watch out that the Green Fairy doesn't come for you!" + color = "#33EE00" // rgb: 51, 238, 0 + boozepwr = 4 + dizzy_adj = 5 + slur_start = 15 + confused_start = 30 + + glass_icon_state = "absintheglass" + glass_name = "glass of absinthe" + glass_desc = "Wormwood, anise, oh my." + glass_center_of_mass = list("x"=16, "y"=5) + +/datum/reagent/ethanol/ale + name = "Ale" + id = "ale" + description = "A dark alchoholic beverage made by malted barley and yeast." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1 + + glass_icon_state = "aleglass" + glass_name = "glass of ale" + glass_desc = "A freezing pint of delicious ale" + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/beer + name = "Beer" + id = "beer" + description = "An alcoholic beverage made from malted grains, hops, yeast, and water." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1 + nutriment_factor = 1 * FOOD_METABOLISM + + glass_icon_state = "beerglass" + glass_name = "glass of beer" + glass_desc = "A freezing pint of beer" + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/beer/on_mob_life(var/mob/living/M as mob) + M:jitteriness = max(M:jitteriness-3,0) + ..() + return + +/datum/reagent/ethanol/bluecuracao + name = "Blue Curacao" + id = "bluecuracao" + description = "Exotically blue, fruity drink, distilled from oranges." + color = "#0000CD" // rgb: 0, 0, 205 + boozepwr = 1.5 + + glass_icon_state = "curacaoglass" + glass_name = "glass of blue curacao" + glass_desc = "Exotically blue, fruity drink, distilled from oranges." + glass_center_of_mass = list("x"=16, "y"=5) + +/datum/reagent/ethanol/cognac + name = "Cognac" + id = "cognac" + description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." + color = "#AB3C05" // rgb: 171, 60, 5 + boozepwr = 1.5 + dizzy_adj = 4 + confused_start = 115 //amount absorbed after which mob starts confusing directions + + glass_icon_state = "cognacglass" + glass_name = "glass of cognac" + glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." + glass_center_of_mass = list("x"=16, "y"=6) + +/datum/reagent/ethanol/deadrum + name = "Deadrum" + id = "rum" // duplicate ids? + description = "Popular with the sailors. Not very popular with everyone else." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1 + + glass_icon_state = "rumglass" + glass_name = "glass of rum" + glass_desc = "Now you want to Pray for a pirate suit, don't you?" + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/deadrum/on_mob_life(var/mob/living/M as mob) + ..() + M.dizziness +=5 + return + +/datum/reagent/ethanol/gin + name = "Gin" + id = "gin" + description = "It's gin. In space. I say, good sir." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1 + dizzy_adj = 3 + + glass_icon_state = "ginvodkaglass" + glass_name = "glass of gin" + glass_desc = "A crystal clear glass of Griffeater gin." + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/kahlua + name = "Kahlua" + id = "kahlua" + description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1.5 + dizzy_adj = -5 + adj_drowsy = -3 + adj_sleepy = -2 + + glass_icon_state = "kahluaglass" + glass_name = "glass of RR coffee liquor" + glass_desc = "DAMN, THIS THING LOOKS ROBUST" + glass_center_of_mass = list("x"=15, "y"=7) + +/datum/reagent/ethanol/kahlua/on_mob_life(var/mob/living/M as mob) + M.make_jittery(5) + ..() + return + +/datum/reagent/ethanol/melonliquor + name = "Melon Liquor" + id = "melonliquor" + description = "A relatively sweet and fruity 46 proof liquor." + color = "#138808" // rgb: 19, 136, 8 + boozepwr = 1 + + glass_icon_state = "emeraldglass" + glass_name = "glass of melon liquor" + glass_desc = "A relatively sweet and fruity 46 proof liquor." + glass_center_of_mass = list("x"=16, "y"=5) + +/datum/reagent/ethanol/rum + name = "Rum" + id = "rum" + description = "Yohoho and all that." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1.5 + + glass_icon_state = "rumglass" + glass_name = "glass of rum" + glass_desc = "Now you want to Pray for a pirate suit, don't you?" + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/sake + name = "Sake" + id = "sake" + description = "Anime's favorite drink." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + + glass_icon_state = "ginvodkaglass" + glass_name = "glass of sake" + glass_desc = "A glass of sake." + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/tequilla + name = "Tequila" + id = "tequilla" + description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" + color = "#FFFF91" // rgb: 255, 255, 145 + boozepwr = 2 + + glass_icon_state = "tequillaglass" + glass_name = "glass of Tequilla" + glass_desc = "Now all that's missing is the weird colored shades!" + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/thirteenloko + name = "Thirteen Loko" + id = "thirteenloko" + description = "A potent mixture of caffeine and alcohol." + color = "#102000" // rgb: 16, 32, 0 + boozepwr = 2 + nutriment_factor = 1 * FOOD_METABOLISM + + glass_icon_state = "thirteen_loko_glass" + glass_name = "glass of Thirteen Loko" + glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." + +/datum/reagent/ethanol/thirteenloko/on_mob_life(var/mob/living/M as mob) + M:drowsyness = max(0,M:drowsyness-7) + if (M.bodytemperature > 310) + M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + M.make_jittery(5) + ..() + return + +/datum/reagent/ethanol/vermouth + name = "Vermouth" + id = "vermouth" + description = "You suddenly feel a craving for a martini..." + color = "#91FF91" // rgb: 145, 255, 145 + boozepwr = 1.5 + + glass_icon_state = "vermouthglass" + glass_name = "glass of vermouth" + glass_desc = "You wonder why you're even drinking this straight." + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/vodka + name = "Vodka" + id = "vodka" + description = "Number one drink AND fueling choice for Russians worldwide." + color = "#0064C8" // rgb: 0, 100, 200 + boozepwr = 2 + + glass_icon_state = "ginvodkaglass" + glass_name = "glass of vodka" + glass_desc = "The glass contain wodka. Xynta." + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/vodka/on_mob_life(var/mob/living/M as mob) + M.radiation = max(M.radiation-1,0) + ..() + return + +/datum/reagent/ethanol/whiskey + name = "Whiskey" + id = "whiskey" + description = "A superb and well-aged single-malt whiskey. Damn." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + dizzy_adj = 4 + + glass_icon_state = "whiskeyglass" + glass_name = "glass of whiskey" + glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/ethanol/wine + name = "Wine" + id = "wine" + description = "An premium alchoholic beverage made from distilled grape juice." + color = "#7E4043" // rgb: 126, 64, 67 + boozepwr = 1.5 + dizzy_adj = 2 + slur_start = 65 //amount absorbed after which mob starts slurring + confused_start = 145 //amount absorbed after which mob starts confusing directions + + glass_icon_state = "wineglass" + glass_name = "glass of wine" + glass_desc = "A very classy looking drink." + glass_center_of_mass = list("x"=15, "y"=7) + +/datum/reagent/ethanol/acid_spit + name = "Acid Spit" + id = "acidspit" + description = "A drink for the daring, can be deadly if incorrectly prepared!" + reagent_state = LIQUID + color = "#365000" // rgb: 54, 80, 0 + boozepwr = 1.5 + + glass_icon_state = "acidspitglass" + glass_name = "glass of Acid Spit" + glass_desc = "A drink from Nanotrasen. Made from live aliens." + glass_center_of_mass = list("x"=16, "y"=7) + +/datum/reagent/ethanol/alliescocktail + name = "Allies Cocktail" + id = "alliescocktail" + description = "A drink made from your allies, not as sweet as when made from your enemies." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + + glass_icon_state = "alliescocktail" + glass_name = "glass of Allies cocktail" + glass_desc = "A drink made from your allies." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/aloe + name = "Aloe" + id = "aloe" + description = "So very, very, very good." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "aloe" + glass_name = "glass of Aloe" + glass_desc = "Very, very, very good." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/amasec + name = "Amasec" + id = "amasec" + description = "Official drink of the NanoTrasen Gun-Club!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + +/datum/reagent/ethanol/andalusia + name = "Andalusia" + id = "andalusia" + description = "A nice, strangely named drink." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "andalusia" + glass_name = "glass of Andalusia" + glass_desc = "A nice, strange named drink." + glass_center_of_mass = list("x"=16, "y"=9) + + glass_icon_state = "amasecglass" + glass_name = "glass of Amasec" + glass_desc = "Always handy before COMBAT!!!" + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/ethanol/antifreeze + name = "Anti-freeze" + id = "antifreeze" + description = "Ultimate refreshment." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 4 + + glass_icon_state = "antifreeze" + glass_name = "glass of Anti-freeze" + glass_desc = "The ultimate refreshment." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/antifreeze/on_mob_life(var/mob/living/M as mob) + if (M.bodytemperature < 330) + M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + return + +/datum/reagent/atomicbomb + name = "Atomic Bomb" + id = "atomicbomb" + description = "Nuclear proliferation never tasted so good." + reagent_state = LIQUID + color = "#666300" // rgb: 102, 99, 0 + + glass_icon_state = "atomicbombglass" + glass_name = "glass of Atomic Bomb" + glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + glass_center_of_mass = list("x"=15, "y"=7) + +/datum/reagent/atomicbomb/on_mob_life(var/mob/living/M as mob) + M.druggy = max(M.druggy, 50) + M.confused = max(M.confused+2,0) + M.make_dizzy(10) + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 3 + if(!data) data = 1 + data++ + switch(data) + if(51 to 200) + M.sleeping += 1 + if(201 to INFINITY) + M.sleeping += 1 + M.adjustToxLoss(2) + ..() + return + +/datum/reagent/ethanol/b52 + name = "B-52" + id = "b52" + description = "Coffee, Irish Cream, and cognac. You will get bombed." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 4 + + glass_icon_state = "b52glass" + glass_name = "glass of B-52" + glass_desc = "Kahlua, Irish cream, and congac. You will get bombed." + +/datum/reagent/ethanol/bahama_mama + name = "Bahama mama" + id = "bahama_mama" + description = "Tropical cocktail." + color = "#FF7F3B" // rgb: 255, 127, 59 + boozepwr = 2 + + glass_icon_state = "bahama_mama" + glass_name = "glass of Bahama Mama" + glass_desc = "Tropical cocktail" + glass_center_of_mass = list("x"=16, "y"=5) + +/datum/reagent/ethanol/bananahonk + name = "Banana Mama" + id = "bananahonk" + description = "A drink from Clown Heaven." + nutriment_factor = 1 * REAGENTS_METABOLISM + color = "#FFFF91" // rgb: 255, 255, 140 + boozepwr = 4 + + glass_icon_state = "bananahonkglass" + glass_name = "glass of Banana Honk" + glass_desc = "A drink from Banana Heaven." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/barefoot + name = "Barefoot" + id = "barefoot" + description = "Barefoot and pregnant" + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1.5 + + glass_icon_state = "b&p" + glass_name = "glass of Barefoot" + glass_desc = "Barefoot and pregnant" + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/beepsky_smash + name = "Beepsky Smash" + id = "beepskysmash" + description = "Deny drinking this and prepare for THE LAW." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 4 + + glass_icon_state = "beepskysmashglass" + glass_name = "Beepsky Smash" + glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + glass_center_of_mass = list("x"=18, "y"=10) + +/datum/reagent/ethanol/beepsky_smash/on_mob_life(var/mob/living/M as mob) + M.Stun(2) + ..() + return + +/datum/reagent/ethanol/bilk + name = "Bilk" + id = "bilk" + description = "This appears to be beer mixed with milk. Disgusting." + color = "#895C4C" // rgb: 137, 92, 76 + boozepwr = 1 + nutriment_factor = 2 * FOOD_METABOLISM + + glass_icon_state = "glass_brown" + glass_name = "glass of bilk" + glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + +/datum/reagent/ethanol/black_russian + name = "Black Russian" + id = "blackrussian" + description = "For the lactose-intolerant. Still as classy as a White Russian." + color = "#360000" // rgb: 54, 0, 0 + boozepwr = 3 + + glass_icon_state = "blackrussianglass" + glass_name = "glass of Black Russian" + glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/ethanol/bloody_mary + name = "Bloody Mary" + id = "bloodymary" + description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "bloodymaryglass" + glass_name = "glass of Bloody Mary" + glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + +/datum/reagent/ethanol/booger + name = "Booger" + id = "booger" + description = "Ewww..." + color = "#8CFF8C" // rgb: 140, 255, 140 + boozepwr = 1.5 + + glass_icon_state = "booger" + glass_name = "glass of Booger" + glass_desc = "Ewww..." + +/datum/reagent/ethanol/brave_bull + name = "Brave Bull" + id = "bravebull" + description = "It's just as effective as Dutch-Courage!" + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "bravebullglass" + glass_name = "glass of Brave Bull" + glass_desc = "Tequilla and coffee liquor, brought together in a mouthwatering mixture. Drink up." + glass_center_of_mass = list("x"=15, "y"=8) + +/datum/reagent/ethanol/changelingsting + name = "Changeling Sting" + id = "changelingsting" + description = "You take a tiny sip and feel a burning sensation..." + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 5 + + glass_icon_state = "changelingsting" + glass_name = "glass of Changeling Sting" + glass_desc = "A stingy drink." + +/datum/reagent/ethanol/martini + name = "Classic Martini" + id = "martini" + description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + + glass_icon_state = "martiniglass" + glass_name = "glass of classic martini" + glass_desc = "Damn, the bartender even stirred it, not shook it." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/cuba_libre + name = "Cuba Libre" + id = "cubalibre" + description = "Rum, mixed with cola. Viva la revolucion." + color = "#3E1B00" // rgb: 62, 27, 0 + boozepwr = 1.5 + + glass_icon_state = "cubalibreglass" + glass_name = "glass of Cuba Libre" + glass_desc = "A classic mix of rum and cola." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/demonsblood + name = "Demons Blood" + id = "demonsblood" + description = "AHHHH!!!!" + color = "#820000" // rgb: 130, 0, 0 + boozepwr = 3 + + glass_icon_state = "demonsblood" + glass_name = "glass of Demons' Blood" + glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up." + glass_center_of_mass = list("x"=16, "y"=2) + +/datum/reagent/ethanol/devilskiss + name = "Devils Kiss" + id = "devilskiss" + description = "Creepy time!" + color = "#A68310" // rgb: 166, 131, 16 + boozepwr = 3 + + glass_icon_state = "devilskiss" + glass_name = "glass of Devil's Kiss" + glass_desc = "Creepy time!" + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/driestmartini + name = "Driest Martini" + id = "driestmartini" + description = "Only for the experienced. You think you see sand floating in the glass." + nutriment_factor = 1 * FOOD_METABOLISM + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 4 + + glass_icon_state = "driestmartiniglass" + glass_name = "glass of Driest Martini" + glass_desc = "Only for the experienced. You think you see sand floating in the glass." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/ginfizz + name = "Gin Fizz" + id = "ginfizz" + description = "Refreshingly lemony, deliciously dry." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1.5 + dizzy_adj = 4 + slurr_adj = 3 + + glass_icon_state = "ginfizzglass" + glass_name = "glass of gin fizz" + glass_desc = "Refreshingly lemony, deliciously dry." + glass_center_of_mass = list("x"=16, "y"=7) + +/datum/reagent/ethanol/grog + name = "Grog" + id = "grog" + description = "Watered down rum, NanoTrasen approves!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 0.5 + + glass_icon_state = "grogglass" + glass_name = "glass of grog" + glass_desc = "A fine and cepa drink for Space." + +/datum/reagent/ethanol/erikasurprise + name = "Erika Surprise" + id = "erikasurprise" + description = "The surprise is it's green!" + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 3 + + glass_icon_state = "erikasurprise" + glass_name = "glass of Erika Surprise" + glass_desc = "The surprise is, it's green!" + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/gargle_blaster + name = "Pan-Galactic Gargle Blaster" + id = "gargleblaster" + description = "Whoah, this stuff looks volatile!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + + glass_icon_state = "gargleblasterglass" + glass_name = "glass of Pan-Galactic Gargle Blaster" + glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." + glass_center_of_mass = list("x"=17, "y"=6) + +/datum/reagent/gargle_blaster/on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.dizziness +=6 + switch(data) + if(15 to 45) + M.stuttering = max(M.stuttering+3,0) + if(45 to 55) + if (prob(50)) + M.confused = max(M.confused+3,0) + if(55 to 200) + M.druggy = max(M.druggy, 55) + if(200 to INFINITY) + M.adjustToxLoss(2) + ..() + +/datum/reagent/ethanol/gintonic + name = "Gin and Tonic" + id = "gintonic" + description = "An all time classic, mild cocktail." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1 + + glass_icon_state = "gintonicglass" + glass_name = "glass of gin and tonic" + glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." + glass_center_of_mass = list("x"=16, "y"=7) + +/datum/reagent/ethanol/goldschlager + name = "Goldschlager" + id = "goldschlager" + description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "ginvodkaglass" + glass_name = "glass of Goldschlager" + glass_desc = "100 proof that teen girls will drink anything with gold in it." + glass_center_of_mass = list("x"=16, "y"=12) + +/datum/reagent/hippies_delight + name = "Hippies' Delight" + id = "hippiesdelight" + description = "You just don't get it maaaan." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + + glass_icon_state = "hippiesdelightglass" + glass_name = "glass of Hippie's Delight" + glass_desc = "A drink enjoyed by people during the 1960's." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/hippies_delight/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.druggy = max(M.druggy, 50) + if(!data) data = 1 + data++ + switch(data) + if(1 to 5) + if (!M.stuttering) M.stuttering = 1 + M.make_dizzy(10) + if(prob(10)) M.emote(pick("twitch","giggle")) + if(5 to 10) + if (!M.stuttering) M.stuttering = 1 + M.make_jittery(20) + M.make_dizzy(20) + M.druggy = max(M.druggy, 45) + if(prob(20)) M.emote(pick("twitch","giggle")) + if (10 to 200) + if (!M.stuttering) M.stuttering = 1 + M.make_jittery(40) + M.make_dizzy(40) + M.druggy = max(M.druggy, 60) + if(prob(30)) M.emote(pick("twitch","giggle")) + if(200 to INFINITY) + if (!M.stuttering) M.stuttering = 1 + M.make_jittery(60) + M.make_dizzy(60) + M.druggy = max(M.druggy, 75) + if(prob(40)) M.emote(pick("twitch","giggle")) + if(prob(30)) M.adjustToxLoss(2) + holder.remove_reagent(src.id, 0.2) + ..() + return + +/datum/reagent/ethanol/hooch + name = "Hooch" + id = "hooch" + description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + dizzy_adj = 6 + slurr_adj = 5 + slur_start = 35 //amount absorbed after which mob starts slurring + confused_start = 90 //amount absorbed after which mob starts confusing directions + + glass_icon_state = "glass_brown2" + glass_name = "glass of Hooch" + glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + +/datum/reagent/ethanol/iced_beer + name = "Iced Beer" + id = "iced_beer" + description = "A beer which is so cold the air around it freezes." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1 + + glass_icon_state = "iced_beerglass" + glass_name = "glass of iced beer" + glass_desc = "A beer so frosty, the air around it freezes." + glass_center_of_mass = list("x"=16, "y"=7) + +/datum/reagent/ethanol/iced_beer/on_mob_life(var/mob/living/M as mob) + if(M.bodytemperature > 270) + M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + return + +/datum/reagent/ethanol/irishcarbomb + name = "Irish Car Bomb" + id = "irishcarbomb" + description = "Mmm, tastes like chocolate cake..." + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 3 + dizzy_adj = 5 + + glass_icon_state = "irishcarbomb" + glass_name = "glass of Irish Car Bomb" + glass_desc = "An irish car bomb." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/irish_cream + name = "Irish Cream" + id = "irishcream" + description = "Whiskey-imbued cream, what else would you expect from the Irish." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + + glass_icon_state = "irishcreamglass" + glass_name = "glass of Irish cream" + glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/ethanol/longislandicedtea + name = "Long Island Iced Tea" + id = "longislandicedtea" + description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 4 + + glass_icon_state = "longislandicedteaglass" + glass_name = "glass of Long Island iced tea" + glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/manhattan + name = "Manhattan" + id = "manhattan" + description = "The Detective's undercover drink of choice. He never could stomach gin..." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "manhattanglass" + glass_name = "glass of Manhattan" + glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/manhattan_proj + name = "Manhattan Project" + id = "manhattan_proj" + description = "A scientist's drink of choice, for pondering ways to blow up the station." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 5 + + glass_icon_state = "proj_manhattanglass" + glass_name = "glass of Manhattan Project" + glass_desc = "A scienitst drink of choice, for thinking how to blow up the station." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/manhattan_proj/on_mob_life(var/mob/living/M as mob) + M.druggy = max(M.druggy, 30) + ..() + return + +/datum/reagent/ethanol/manly_dorf + name = "The Manly Dorf" + id = "manlydorf" + description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + + glass_icon_state = "manlydorfglass" + glass_name = "glass of The Manly Dorf" + glass_desc = "A manly concotion made from Ale and Beer. Intended for true men only." + +/datum/reagent/ethanol/margarita + name = "Margarita" + id = "margarita" + description = "On the rocks with salt on the rim. Arriba~!" + color = "#8CFF8C" // rgb: 140, 255, 140 + boozepwr = 3 + + glass_icon_state = "margaritaglass" + glass_name = "glass of margarita" + glass_desc = "On the rocks with salt on the rim. Arriba~!" + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/mead + name = "Mead" + id = "mead" + description = "A Viking's drink, though a cheap one." + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 1.5 + nutriment_factor = 1 * FOOD_METABOLISM + + glass_icon_state = "meadglass" + glass_name = "glass of mead" + glass_desc = "A Viking's beverage, though a cheap one." + glass_center_of_mass = list("x"=17, "y"=10) + +/datum/reagent/ethanol/moonshine + name = "Moonshine" + id = "moonshine" + description = "You've really hit rock bottom now... your liver packed its bags and left last night." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 4 + + glass_icon_state = "glass_clear" + glass_name = "glass of moonshine" + glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + +/datum/reagent/neurotoxin + name = "Neurotoxin" + id = "neurotoxin" + description = "A strong neurotoxin that puts the subject into a death-like state." + reagent_state = LIQUID + color = "#2E2E61" // rgb: 46, 46, 97 + + glass_icon_state = "neurotoxinglass" + glass_name = "glass of Neurotoxin" + glass_desc = "A drink that is guaranteed to knock you silly." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/neurotoxin/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + M.weakened = max(M.weakened, 3) + if(!data) data = 1 + data++ + M.dizziness +=6 + switch(data) + if(15 to 45) + M.stuttering = max(M.stuttering+3,0) + if(45 to 55) + if (prob(50)) + M.confused = max(M.confused+3,0) + if(55 to 200) + M.druggy = max(M.druggy, 55) + if(200 to INFINITY) + M.adjustToxLoss(2) + ..() + +/datum/reagent/ethanol/patron + name = "Patron" + id = "patron" + description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." + color = "#585840" // rgb: 88, 88, 64 + boozepwr = 1.5 + + glass_icon_state = "patronglass" + glass_name = "glass of Patron" + glass_desc = "Drinking patron in the bar, with all the subpar ladies." + glass_center_of_mass = list("x"=7, "y"=8) + +/datum/reagent/ethanol/pwine + name = "Poison Wine" + id = "pwine" + description = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" + color = "#000000" // rgb: 0, 0, 0 SHOCKER + boozepwr = 1 + dizzy_adj = 1 + slur_start = 1 + confused_start = 1 + + glass_icon_state = "pwineglass" + glass_name = "glass of ???" + glass_desc = "A black ichor with an oily purple sheer on top. Are you sure you should drink this?" + glass_center_of_mass = list("x"=16, "y"=5) + +/datum/reagent/ethanol/pwine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.druggy = max(M.druggy, 50) + if(!data) data = 1 + data++ + switch(data) + if(1 to 25) + if (!M.stuttering) M.stuttering = 1 + M.make_dizzy(1) + M.hallucination = max(M.hallucination, 3) + if(prob(1)) M.emote(pick("twitch","giggle")) + if(25 to 75) + if (!M.stuttering) M.stuttering = 1 + M.hallucination = max(M.hallucination, 10) + M.make_jittery(2) + M.make_dizzy(2) + M.druggy = max(M.druggy, 45) + if(prob(5)) M.emote(pick("twitch","giggle")) + if (75 to 150) + if (!M.stuttering) M.stuttering = 1 + M.hallucination = max(M.hallucination, 60) + M.make_jittery(4) + M.make_dizzy(4) + M.druggy = max(M.druggy, 60) + if(prob(10)) M.emote(pick("twitch","giggle")) + if(prob(30)) M.adjustToxLoss(2) + if (150 to 300) + if (!M.stuttering) M.stuttering = 1 + M.hallucination = max(M.hallucination, 60) + M.make_jittery(4) + M.make_dizzy(4) + M.druggy = max(M.druggy, 60) + if(prob(10)) M.emote(pick("twitch","giggle")) + if(prob(30)) M.adjustToxLoss(2) + if(prob(5)) if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/heart/L = H.internal_organs_by_name["heart"] + if (L && istype(L)) + L.take_damage(5, 0) + if (300 to INFINITY) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/heart/L = H.internal_organs_by_name["heart"] + if (L && istype(L)) + L.take_damage(100, 0) + holder.remove_reagent(src.id, FOOD_METABOLISM) + +/datum/reagent/ethanol/red_mead + name = "Red Mead" + id = "red_mead" + description = "The true Viking's drink! Even though it has a strange red color." + color = "#C73C00" // rgb: 199, 60, 0 + boozepwr = 1.5 + + glass_icon_state = "red_meadglass" + glass_name = "glass of red mead" + glass_desc = "A true Viking's beverage, though its color is strange." + glass_center_of_mass = list("x"=17, "y"=10) + +/datum/reagent/ethanol/sbiten + name = "Sbiten" + id = "sbiten" + description = "A spicy Vodka! Might be a little hot for the little guys!" + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "sbitenglass" + glass_name = "glass of Sbiten" + glass_desc = "A spicy mix of Vodka and Spice. Very hot." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/sbiten/on_mob_life(var/mob/living/M as mob) + if (M.bodytemperature < 360) + M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + return + +/datum/reagent/ethanol/screwdrivercocktail + name = "Screwdriver" + id = "screwdrivercocktail" + description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." + color = "#A68310" // rgb: 166, 131, 16 + boozepwr = 3 + + glass_icon_state = "screwdriverglass" + glass_name = "glass of Screwdriver" + glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + glass_center_of_mass = list("x"=15, "y"=10) + +/datum/reagent/ethanol/silencer + name = "Silencer" + id = "silencer" + description = "A drink from Mime Heaven." + nutriment_factor = 1 * FOOD_METABOLISM + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 4 + + glass_icon_state = "silencerglass" + glass_name = "glass of Silencer" + glass_desc = "A drink from mime Heaven." + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/ethanol/silencer/on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.dizziness +=10 + if(data >= 55 && data <115) + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 10 + else if(data >= 115 && prob(33)) + M.confused = max(M.confused+15,15) + ..() + return + +/datum/reagent/ethanol/singulo + name = "Singulo" + id = "singulo" + description = "A blue-space beverage!" + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 5 + dizzy_adj = 15 + slurr_adj = 15 + + glass_icon_state = "singulo" + glass_name = "glass of Singulo" + glass_desc = "A blue-space beverage." + glass_center_of_mass = list("x"=17, "y"=4) + +/datum/reagent/ethanol/snowwhite + name = "Snow White" + id = "snowwhite" + description = "A cold refreshment" + color = "#FFFFFF" // rgb: 255, 255, 255 + boozepwr = 1.5 + + glass_icon_state = "snowwhite" + glass_name = "glass of Snow White" + glass_desc = "A cold refreshment." + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/ethanol/suidream + name = "Sui Dream" + id = "suidream" + description = "Comprised of: White soda, blue curacao, melon liquor." + color = "#00A86B" // rgb: 0, 168, 107 + boozepwr = 0.5 + + glass_icon_state = "sdreamglass" + glass_name = "glass of Sui Dream" + glass_desc = "A froofy, fruity, and sweet mixed drink. Understanding the name only brings shame." + glass_center_of_mass = list("x"=16, "y"=5) + +/datum/reagent/ethanol/syndicatebomb + name = "Syndicate Bomb" + id = "syndicatebomb" + description = "Tastes like terrorism!" + color = "#2E6671" // rgb: 46, 102, 113 + boozepwr = 5 + + glass_icon_state = "syndicatebomb" + glass_name = "glass of Syndicate Bomb" + glass_desc = "Tastes like terrorism!" + glass_center_of_mass = list("x"=16, "y"=4) + +/datum/reagent/ethanol/tequilla_sunrise + name = "Tequila Sunrise" + id = "tequillasunrise" + description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" + color = "#FFE48C" // rgb: 255, 228, 140 + boozepwr = 2 + + glass_icon_state = "tequillasunriseglass" + glass_name = "glass of Tequilla Sunrise" + glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + +/datum/reagent/ethanol/threemileisland + name = "Three Mile Island Iced Tea" + id = "threemileisland" + description = "Made for a woman, strong enough for a man." + color = "#666340" // rgb: 102, 99, 64 + boozepwr = 5 + + glass_icon_state = "threemileislandglass" + glass_name = "glass of Three Mile Island iced tea" + glass_desc = "A glass of this is sure to prevent a meltdown." + glass_center_of_mass = list("x"=16, "y"=2) + +/datum/reagent/ethanol/threemileisland/on_mob_life(var/mob/living/M as mob) + M.druggy = max(M.druggy, 50) + ..() + return + +/datum/reagent/ethanol/toxins_special + name = "Toxins Special" + id = "phoronspecial" + description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 5 + + glass_icon_state = "toxinsspecialglass" + glass_name = "glass of Toxins Special" + glass_desc = "Whoah, this thing is on FIRE" + +/datum/reagent/ethanol/toxins_special/on_mob_life(var/mob/living/M as mob) + if (M.bodytemperature < 330) + M.bodytemperature = min(330, M.bodytemperature + (15 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 + ..() + return + +/datum/reagent/ethanol/vodkamartini + name = "Vodka Martini" + id = "vodkamartini" + description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 4 + + glass_icon_state = "martiniglass" + glass_name = "glass of vodka martini" + glass_desc ="A bastardisation of the classic martini. Still great." + glass_center_of_mass = list("x"=17, "y"=8) + +/datum/reagent/ethanol/vodkatonic + name = "Vodka and Tonic" + id = "vodkatonic" + description = "For when a gin and tonic isn't russian enough." + color = "#0064C8" // rgb: 0, 100, 200 + boozepwr = 3 + dizzy_adj = 4 + slurr_adj = 3 + + glass_icon_state = "vodkatonicglass" + glass_name = "glass of vodka and tonic" + glass_desc = "For when a gin and tonic isn't Russian enough." + glass_center_of_mass = list("x"=16, "y"=7) + +/datum/reagent/ethanol/white_russian + name = "White Russian" + id = "whiterussian" + description = "That's just, like, your opinion, man..." + color = "#A68340" // rgb: 166, 131, 64 + boozepwr = 3 + + glass_icon_state = "whiterussianglass" + glass_name = "glass of White Russian" + glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/ethanol/whiskey_cola + name = "Whiskey Cola" + id = "whiskeycola" + description = "Whiskey, mixed with cola. Surprisingly refreshing." + color = "#3E1B00" // rgb: 62, 27, 0 + boozepwr = 2 + + glass_icon_state = "whiskeycolaglass" + glass_name = "glass of whiskey cola" + glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/ethanol/whiskeysoda + name = "Whiskey Soda" + id = "whiskeysoda" + description = "For the more refined griffon." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 3 + + glass_icon_state = "whiskeysodaglass2" + glass_name = "glass of whiskey soda" + glass_desc = "Ultimate refreshment." + glass_center_of_mass = list("x"=16, "y"=9) + +/datum/reagent/ethanol/specialwhiskey + name = "Special Blend Whiskey" + id = "specialwhiskey" + description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." + color = "#664300" // rgb: 102, 67, 0 + boozepwr = 2 + dizzy_adj = 4 + slur_start = 30 //amount absorbed after which mob starts slurring + + glass_icon_state = "whiskeyglass" + glass_name = "glass of special blend whiskey" + glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." + glass_center_of_mass = list("x"=16, "y"=12) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm new file mode 100644 index 0000000000..11ea8f23a6 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -0,0 +1,603 @@ +/datum/reagent/inaprovaline + name = "Inaprovaline" + id = "inaprovaline" + description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients." + reagent_state = LIQUID + color = "#00BFFF" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE*2 + scannable = 1 + +/datum/reagent/inaprovaline/on_mob_life(var/mob/living/M as mob, var/alien) + if(!M) M = holder.my_atom + + if(alien && alien == IS_VOX) + M.adjustToxLoss(REAGENTS_METABOLISM) + else + if(M.losebreath >= 10) + M.losebreath = max(10, M.losebreath-5) + + holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) + return + +/datum/reagent/bicaridine + name = "Bicaridine" + id = "bicaridine" + description = "Bicaridine is an analgesic medication and can be used to treat blunt trauma." + reagent_state = LIQUID + color = "#BF0000" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/bicaridine/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2.0) + return + if(!M) M = holder.my_atom + if(alien != IS_DIONA) + M.heal_organ_damage(2*REM,0) + ..() + return + +/datum/reagent/kelotane + name = "Kelotane" + id = "kelotane" + description = "Kelotane is a drug used to treat burns." + reagent_state = LIQUID + color = "#FFA800" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/kelotane/on_mob_life(var/mob/living/M as mob) + if(M.stat == 2.0) + return + if(!M) M = holder.my_atom + //This needs a diona check but if one is added they won't be able to heal burn damage at all. + M.heal_organ_damage(0,2*REM) + ..() + return + +/datum/reagent/dermaline + name = "Dermaline" + id = "dermaline" + description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue." + reagent_state = LIQUID + color = "#FF8000" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE/2 + scannable = 1 + +/datum/reagent/dermaline/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2.0) //THE GUY IS **DEAD**! BEREFT OF ALL LIFE HE RESTS IN PEACE etc etc. He does NOT metabolise shit anymore, god DAMN + return + if(!M) M = holder.my_atom + if(!alien || alien != IS_DIONA) + M.heal_organ_damage(0,3*REM) + ..() + return + +/datum/reagent/anti_toxin + name = "Dylovene" + id = "anti_toxin" + description = "Dylovene is a broad-spectrum antitoxin." + reagent_state = LIQUID + color = "#00A000" // rgb: 200, 165, 220 + scannable = 1 + +/datum/reagent/anti_toxin/on_mob_life(var/mob/living/M as mob, var/alien) + if(!M) M = holder.my_atom + if(!alien || alien != IS_DIONA) + M.reagents.remove_all_type(/datum/reagent/toxin, 1*REM, 0, 1) + M.drowsyness = max(M.drowsyness-2*REM, 0) + M.hallucination = max(0, M.hallucination - 5*REM) + M.adjustToxLoss(-2*REM) + ..() + return + +/datum/reagent/dexalin + name = "Dexalin" + id = "dexalin" + description = "Dexalin is used in the treatment of oxygen deprivation." + reagent_state = LIQUID + color = "#0080FF" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/dexalin/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2.0) + return //See above, down and around. --Agouri + if(!M) M = holder.my_atom + + if(alien && alien == IS_VOX) + M.adjustToxLoss(2*REM) + else if(!alien || alien != IS_DIONA) + M.adjustOxyLoss(-2*REM) + + holder.remove_reagent("lexorin", 2*REM) + ..() + return + +/datum/reagent/dexalinp + name = "Dexalin Plus" + id = "dexalinp" + description = "Dexalin Plus is used in the treatment of oxygen deprivation. It is highly effective." + reagent_state = LIQUID + color = "#0040FF" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE/2 + scannable = 1 + +/datum/reagent/dexalinp/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2.0) + return + if(!M) M = holder.my_atom + + if(alien && alien == IS_VOX) + M.adjustOxyLoss() + else if(!alien || alien != IS_DIONA) + M.adjustOxyLoss(-M.getOxyLoss()) + + holder.remove_reagent("lexorin", 2*REM) + ..() + return + +/datum/reagent/tricordrazine + name = "Tricordrazine" + id = "tricordrazine" + description = "Tricordrazine is a highly potent stimulant, originally derived from cordrazine. Can be used to treat a wide range of injuries." + reagent_state = LIQUID + color = "#8040FF" // rgb: 200, 165, 220 + scannable = 1 + +/datum/reagent/tricordrazine/on_mob_life(var/mob/living/M as mob, var/alien) + if(M.stat == 2.0) + return + if(!M) M = holder.my_atom + if(!alien || alien != IS_DIONA) + if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM) + if(M.getBruteLoss() && prob(80)) M.heal_organ_damage(1*REM,0) + if(M.getFireLoss() && prob(80)) M.heal_organ_damage(0,1*REM) + if(M.getToxLoss() && prob(80)) M.adjustToxLoss(-1*REM) + ..() + return + +/datum/reagent/cryoxadone + name = "Cryoxadone" + id = "cryoxadone" + description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." + reagent_state = LIQUID + color = "#8080FF" // rgb: 200, 165, 220 + scannable = 1 + +/datum/reagent/cryoxadone/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.bodytemperature < 170) + M.adjustCloneLoss(-1) + M.adjustOxyLoss(-1) + M.heal_organ_damage(1,1) + M.adjustToxLoss(-1) + ..() + return + +/datum/reagent/clonexadone + name = "Clonexadone" + id = "clonexadone" + description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' the cloning process when used in conjunction with a cryo tube." + reagent_state = LIQUID + color = "#80BFFF" // rgb: 200, 165, 220 + scannable = 1 + +/datum/reagent/clonexadone/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.bodytemperature < 170) + M.adjustCloneLoss(-3) + M.adjustOxyLoss(-3) + M.heal_organ_damage(3,3) + M.adjustToxLoss(-3) + ..() + return + +/datum/reagent/paracetamol + name = "Paracetamol" + id = "paracetamol" + description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller." + reagent_state = LIQUID + color = "#C8A5DC" + overdose = 60 + scannable = 1 + custom_metabolism = 0.025 // Lasts 10 minutes for 15 units + +/datum/reagent/paracetamol/on_mob_life(var/mob/living/M as mob) + if (volume > overdose) + M.hallucination = max(M.hallucination, 2) + ..() + return + +/datum/reagent/tramadol + name = "Tramadol" + id = "tramadol" + description = "A simple, yet effective painkiller." + reagent_state = LIQUID + color = "#CB68FC" + overdose = 30 + scannable = 1 + custom_metabolism = 0.025 // Lasts 10 minutes for 15 units + +/datum/reagent/tramadol/on_mob_life(var/mob/living/M as mob) + if (volume > overdose) + M.hallucination = max(M.hallucination, 2) + ..() + return + +/datum/reagent/oxycodone + name = "Oxycodone" + id = "oxycodone" + description = "An effective and very addictive painkiller." + reagent_state = LIQUID + color = "#800080" + overdose = 20 + custom_metabolism = 0.25 // Lasts 10 minutes for 15 units + +/datum/reagent/oxycodone/on_mob_life(var/mob/living/M as mob) + if (volume > overdose) + M.druggy = max(M.druggy, 10) + M.hallucination = max(M.hallucination, 3) + ..() + return + +/datum/reagent/synaptizine + name = "Synaptizine" + id = "synaptizine" + description = "Synaptizine is used to treat various diseases." + reagent_state = LIQUID + color = "#99CCFF" // rgb: 200, 165, 220 + custom_metabolism = 0.01 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.drowsyness = max(M.drowsyness-5, 0) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + holder.remove_reagent("mindbreaker", 5) + M.hallucination = max(0, M.hallucination - 10) + if(prob(60)) M.adjustToxLoss(1) + ..() + return + +/datum/reagent/alkysine + name = "Alkysine" + id = "alkysine" + description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." + reagent_state = LIQUID + color = "#FFFF66" // rgb: 200, 165, 220 + custom_metabolism = 0.05 + overdose = REAGENTS_OVERDOSE + scannable = 1 +/datum/reagent/alkysine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustBrainLoss(-3*REM) + ..() + return + +/datum/reagent/imidazoline + name = "Imidazoline" + id = "imidazoline" + description = "Heals eye damage" + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/imidazoline/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.eye_blurry = max(M.eye_blurry-5 , 0) + M.eye_blind = max(M.eye_blind-5 , 0) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] + if(E && istype(E)) + if(E.damage > 0) + E.damage = max(E.damage - 1, 0) + ..() + return + +/datum/reagent/peridaxon + name = "Peridaxon" + id = "peridaxon" + description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." + reagent_state = LIQUID + color = "#561EC3" // rgb: 200, 165, 220 + overdose = 10 + scannable = 1 + +/datum/reagent/peridaxon/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + //Peridaxon heals only non-robotic organs + for(var/obj/item/organ/I in H.internal_organs) + if((I.damage > 0) && (I.robotic != 2)) + I.damage = max(I.damage - 0.20, 0) + ..() + return + +/datum/reagent/ryetalyn + name = "Ryetalyn" + id = "ryetalyn" + description = "Ryetalyn can cure all genetic abnomalities via a catalytic process." + reagent_state = SOLID + color = "#004000" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/ryetalyn/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + + var/needs_update = M.mutations.len > 0 + + M.mutations = list() + M.disabilities = 0 + M.sdisabilities = 0 + + // Might need to update appearance for hulk etc. + if(needs_update && ishuman(M)) + var/mob/living/carbon/human/H = M + H.update_mutations() + + ..() + return + +/datum/reagent/hyperzine + name = "Hyperzine" + id = "hyperzine" + description = "Hyperzine is a highly effective, long lasting, muscle stimulant." + reagent_state = LIQUID + color = "#FF3300" // rgb: 200, 165, 220 + custom_metabolism = 0.03 + overdose = REAGENTS_OVERDOSE/2 + +/datum/reagent/hyperzine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(5)) M.emote(pick("twitch","blink_r","shiver")) + ..() + return + +/datum/reagent/ethylredoxrazine // FUCK YOU, ALCOHOL + name = "Ethylredoxrazine" + id = "ethylredoxrazine" + description = "A powerful oxidizer that reacts with ethanol." + reagent_state = SOLID + color = "#605048" // rgb: 96, 80, 72 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/ethylredoxrazine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.dizziness = 0 + M.drowsyness = 0 + M.stuttering = 0 + M.confused = 0 + M.reagents.remove_all_type(/datum/reagent/ethanol, 1*REM, 0, 1) + ..() + return + +/datum/reagent/hyronalin + name = "Hyronalin" + id = "hyronalin" + description = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." + reagent_state = LIQUID + color = "#408000" // rgb: 200, 165, 220 + custom_metabolism = 0.05 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/hyronalin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.radiation = max(M.radiation-3*REM,0) + ..() + return + +/datum/reagent/arithrazine + name = "Arithrazine" + id = "arithrazine" + description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." + reagent_state = LIQUID + color = "#008000" // rgb: 200, 165, 220 + custom_metabolism = 0.05 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/arithrazine/on_mob_life(var/mob/living/M as mob) + if(M.stat == 2.0) + return //See above, down and around. --Agouri + if(!M) M = holder.my_atom + M.radiation = max(M.radiation-7*REM,0) + M.adjustToxLoss(-1*REM) + if(prob(15)) + M.take_organ_damage(1, 0) + ..() + return + +/datum/reagent/spaceacillin + name = "Spaceacillin" + id = "spaceacillin" + description = "An all-purpose antiviral agent." + reagent_state = LIQUID + color = "#C1C1C1" // rgb: 200, 165, 220 + custom_metabolism = 0.01 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/spaceacillin/on_mob_life(var/mob/living/M as mob) + ..() + return + +/datum/reagent/sterilizine + name = "Sterilizine" + id = "sterilizine" + description = "Sterilizes wounds in preparation for surgery." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + + //makes you squeaky clean +/datum/reagent/sterilizine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if (method == TOUCH) + M.germ_level -= min(volume*20, M.germ_level) + +/datum/reagent/sterilizine/reaction_obj(var/obj/O, var/volume) + O.germ_level -= min(volume*20, O.germ_level) + +/datum/reagent/sterilizine/reaction_turf(var/turf/T, var/volume) + T.germ_level -= min(volume*20, T.germ_level) + +/* reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + src = null + if (method==TOUCH) + if(istype(M, /mob/living/carbon/human)) + if(M.health >= -100 && M.health <= 0) + M.crit_op_stage = 0.0 + if (method==INGEST) + usr << "Well, that was stupid." + M.adjustToxLoss(3) + return + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.radiation += 3 + ..() + return +*/ + +/datum/reagent/leporazine + name = "Leporazine" + id = "leporazine" + description = "Leporazine can be use to stabilize an individuals body temperature." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/leporazine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.bodytemperature > 310) + M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) + else if(M.bodytemperature < 311) + M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) + ..() + return + +#define ANTIDEPRESSANT_MESSAGE_DELAY 5*60*10 + +/datum/reagent/antidepressant/methylphenidate + name = "Methylphenidate" + id = "methylphenidate" + description = "Improves the ability to concentrate." + reagent_state = LIQUID + color = "#BF80BF" + custom_metabolism = 0.01 + data = 0 + + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(src.volume <= 0.1) if(data != -1) + data = -1 + M << "\red You lose focus.." + else + if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) + data = world.time + M << "\blue Your mind feels focused and undivided." + ..() + return + +/datum/chemical_reaction/methylphenidate + name = "Methylphenidate" + id = "methylphenidate" + result = "methylphenidate" + required_reagents = list("mindbreaker" = 1, "hydrogen" = 1) + result_amount = 3 + +/datum/reagent/antidepressant/citalopram + name = "Citalopram" + id = "citalopram" + description = "Stabilizes the mind a little." + reagent_state = LIQUID + color = "#FF80FF" + custom_metabolism = 0.01 + data = 0 + + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(src.volume <= 0.1) if(data != -1) + data = -1 + M << "\red Your mind feels a little less stable.." + else + if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) + data = world.time + M << "\blue Your mind feels stable.. a little stable." + ..() + return + +/datum/chemical_reaction/citalopram + name = "Citalopram" + id = "citalopram" + result = "citalopram" + required_reagents = list("mindbreaker" = 1, "carbon" = 1) + result_amount = 3 + + +/datum/reagent/antidepressant/paroxetine + name = "Paroxetine" + id = "paroxetine" + description = "Stabilizes the mind greatly, but has a chance of adverse effects." + reagent_state = LIQUID + color = "#FF80BF" + custom_metabolism = 0.01 + data = 0 + + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(src.volume <= 0.1) if(data != -1) + data = -1 + M << "\red Your mind feels much less stable.." + else + if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) + data = world.time + if(prob(90)) + M << "\blue Your mind feels much more stable." + else + M << "\red Your mind breaks apart.." + M.hallucination += 200 + ..() + return + +/datum/chemical_reaction/paroxetine + name = "Paroxetine" + id = "paroxetine" + result = "paroxetine" + required_reagents = list("mindbreaker" = 1, "oxygen" = 1, "inaprovaline" = 1) + result_amount = 3 + +/datum/reagent/rezadone + name = "Rezadone" + id = "rezadone" + description = "A powder derived from fish toxin, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." + reagent_state = SOLID + color = "#669900" // rgb: 102, 153, 0 + overdose = REAGENTS_OVERDOSE + scannable = 1 + +/datum/reagent/rezadone/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + data++ + switch(data) + if(1 to 15) + M.adjustCloneLoss(-1) + M.heal_organ_damage(1,1) + if(15 to 35) + M.adjustCloneLoss(-2) + M.heal_organ_damage(2,1) + M.status_flags &= ~DISFIGURED + if(35 to INFINITY) + M.adjustToxLoss(1) + M.make_dizzy(5) + M.make_jittery(5) + + ..() + return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm new file mode 100644 index 0000000000..847c3ce458 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -0,0 +1,389 @@ +/datum/reagent/crayon_dust + name = "Crayon dust" + id = "crayon_dust" + description = "Intensely coloured powder obtained by grinding crayons." + reagent_state = LIQUID + color = "#888888" + overdose = 5 + +/datum/reagent/crayon_dust/red + name = "Red crayon dust" + id = "crayon_dust_red" + color = "#FE191A" + +/datum/reagent/crayon_dust/orange + name = "Orange crayon dust" + id = "crayon_dust_orange" + color = "#FFBE4F" + +/datum/reagent/crayon_dust/yellow + name = "Yellow crayon dust" + id = "crayon_dust_yellow" + color = "#FDFE7D" + +/datum/reagent/crayon_dust/green + name = "Green crayon dust" + id = "crayon_dust_green" + color = "#18A31A" + +/datum/reagent/crayon_dust/blue + name = "Blue crayon dust" + id = "crayon_dust_blue" + color = "#247CFF" + +/datum/reagent/crayon_dust/purple + name = "Purple crayon dust" + id = "crayon_dust_purple" + color = "#CC0099" + +/datum/reagent/crayon_dust/grey //Mime + name = "Grey crayon dust" + id = "crayon_dust_grey" + color = "#808080" + +/datum/reagent/crayon_dust/brown //Rainbow + name = "Brown crayon dust" + id = "crayon_dust_brown" + color = "#846F35" + +/datum/reagent/paint + name = "Paint" + id = "paint" + description = "This paint will stick to almost any object." + reagent_state = LIQUID + color = "#808080" + overdose = 15 + color_weight = 20 + +/datum/reagent/paint/New() + ..() + data = color + +/datum/reagent/paint/reaction_turf(var/turf/T, var/volume) + ..() + if(istype(T) && !istype(T, /turf/space)) + T.color = color + +/datum/reagent/paint/reaction_obj(var/obj/O, var/volume) + ..() + if(istype(O,/obj)) + O.color = color + +/datum/reagent/paint/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + ..() + if(istype(M,/mob) && !istype(M,/mob/dead)) + //painting ghosts: not allowed + M.color = color + +/datum/reagent/paint/on_merge(var/newdata, var/newamount) + if(!data || !newdata) + return + var/list/colors = list(0, 0, 0, 0) + var/tot_w = 0 + + var/hex1 = uppertext(color) + var/hex2 = uppertext(newdata) + if(length(hex1) == 7) + hex1 += "FF" + if(length(hex2) == 7) + hex2 += "FF" + if(length(hex1) != 9 || length(hex2) != 9) + return + colors[1] += hex2num(copytext(hex1, 2, 4)) * volume + colors[2] += hex2num(copytext(hex1, 4, 6)) * volume + colors[3] += hex2num(copytext(hex1, 6, 8)) * volume + colors[4] += hex2num(copytext(hex1, 8, 10)) * volume + tot_w += volume + colors[1] += hex2num(copytext(hex2, 2, 4)) * newamount + colors[2] += hex2num(copytext(hex2, 4, 6)) * newamount + colors[3] += hex2num(copytext(hex2, 6, 8)) * newamount + colors[4] += hex2num(copytext(hex2, 8, 10)) * newamount + tot_w += newamount + + color = rgb(colors[1] / tot_w, colors[2] / tot_w, colors[3] / tot_w, colors[4] / tot_w) + data = color + return + +/datum/reagent/adminordrazine //An OP chemical for admins + name = "Adminordrazine" + id = "adminordrazine" + description = "It's magic. We don't have to explain it." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + + glass_icon_state = "golden_cup" + glass_name = "golden cup" + glass_desc = "It's magic. We don't have to explain it." + +/datum/reagent/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom ///This can even heal dead people. + M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) + M.setCloneLoss(0) + M.setOxyLoss(0) + M.radiation = 0 + M.heal_organ_damage(5,5) + M.adjustToxLoss(-5) + M.hallucination = 0 + M.setBrainLoss(0) + M.disabilities = 0 + M.sdisabilities = 0 + M.eye_blurry = 0 + M.eye_blind = 0 + M.SetWeakened(0) + M.SetStunned(0) + M.SetParalysis(0) + M.silent = 0 + M.dizziness = 0 + M.drowsyness = 0 + M.stuttering = 0 + M.confused = 0 + M.sleeping = 0 + M.jitteriness = 0 + for(var/datum/disease/D in M.viruses) + D.spread = "Remissive" + D.stage-- + if(D.stage < 1) + D.cure() + ..() + return + +/datum/reagent/gold + name = "Gold" + id = "gold" + description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." + reagent_state = SOLID + color = "#F7C430" // rgb: 247, 196, 48 + +/datum/reagent/silver + name = "Silver" + id = "silver" + description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." + reagent_state = SOLID + color = "#D0D0D0" // rgb: 208, 208, 208 + +/datum/reagent/uranium + name ="Uranium" + id = "uranium" + description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." + reagent_state = SOLID + color = "#B8B8C0" // rgb: 184, 184, 192 + +/datum/reagent/uranium/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.apply_effect(1,IRRADIATE,0) + ..() + return + +/datum/reagent/uranium/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 3) + if(!istype(T, /turf/space)) + var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T) + if(!glow) + new /obj/effect/decal/cleanable/greenglow(T) + return + +/datum/reagent/adrenaline + name = "Adrenaline" + id = "adrenaline" + description = "Adrenaline is a hormone used as a drug to treat cardiac arrest and other cardiac dysrhythmias resulting in diminished or absent cardiac output." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + +/datum/reagent/adrenaline/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.SetParalysis(0) + M.SetWeakened(0) + M.adjustToxLoss(rand(3)) + ..() + return + +/datum/reagent/water/holywater + name = "Holy Water" + id = "holywater" + description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." + color = "#E0E8EF" // rgb: 224, 232, 239 + + glass_icon_state = "glass_clear" + glass_name = "glass of holy water" + glass_desc = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." + +/datum/reagent/water/holywater/on_mob_life(var/mob/living/M as mob) + if(ishuman(M)) + if(M.mind && cult.is_antagonist(M.mind) && prob(10)) + cult.remove_antagonist(M.mind) + holder.remove_reagent(src.id, 10 * REAGENTS_METABOLISM) //high metabolism to prevent extended uncult rolls. + return + +/datum/reagent/water/holywater/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 5) + T.holy = 1 + return + +/datum/reagent/ammonia + name = "Ammonia" + id = "ammonia" + description = "A caustic substance commonly used in fertilizer or household cleaners." + reagent_state = GAS + color = "#404030" // rgb: 64, 64, 48 + +/datum/reagent/diethylamine + name = "Diethylamine" + id = "diethylamine" + description = "A secondary amine, mildly corrosive." + reagent_state = LIQUID + color = "#604030" // rgb: 96, 64, 48 + +/datum/reagent/fluorosurfactant//foam precursor + name = "Fluorosurfactant" + id = "fluorosurfactant" + description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." + reagent_state = LIQUID + color = "#9E6B38" // rgb: 158, 107, 56 + +/datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. + name = "Foaming agent" + id = "foaming_agent" + description = "A agent that yields metallic foam when mixed with light metal and a strong acid." + reagent_state = SOLID + color = "#664B63" // rgb: 102, 75, 99 + +/datum/reagent/thermite + name = "Thermite" + id = "thermite" + description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." + reagent_state = SOLID + color = "#673910" // rgb: 103, 57, 16 + +/datum/reagent/thermite/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 5) + if(istype(T, /turf/simulated/wall)) + var/turf/simulated/wall/W = T + W.thermite = 1 + W.overlays += image('icons/effects/effects.dmi',icon_state = "#673910") + return + +/datum/reagent/thermite/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustFireLoss(1) + ..() + return + +/datum/reagent/space_cleaner + name = "Space cleaner" + id = "cleaner" + description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" + reagent_state = LIQUID + color = "#A5F0EE" // rgb: 165, 240, 238 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume) + if(istype(O,/obj/effect/decal/cleanable)) + qdel(O) + else + if(O) + O.clean_blood() + +/datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume) + if(volume >= 1) + if(istype(T, /turf/simulated)) + var/turf/simulated/S = T + S.dirt = 0 + T.clean_blood() + for(var/obj/effect/decal/cleanable/C in T.contents) + src.reaction_obj(C, volume) + qdel(C) + + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(5,10)) + +/datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(C.r_hand) + C.r_hand.clean_blood() + if(C.l_hand) + C.l_hand.clean_blood() + if(C.wear_mask) + if(C.wear_mask.clean_blood()) + C.update_inv_wear_mask(0) + if(ishuman(M)) + var/mob/living/carbon/human/H = C + if(H.head) + if(H.head.clean_blood()) + H.update_inv_head(0) + if(H.wear_suit) + if(H.wear_suit.clean_blood()) + H.update_inv_wear_suit(0) + else if(H.w_uniform) + if(H.w_uniform.clean_blood()) + H.update_inv_w_uniform(0) + if(H.shoes) + if(H.shoes.clean_blood()) + H.update_inv_shoes(0) + else + H.clean_blood(1) + return + M.clean_blood() + +/datum/reagent/lube + name = "Space Lube" + id = "lube" + description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." + reagent_state = LIQUID + color = "#009CA8" // rgb: 0, 156, 168 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + src = null + if(volume >= 1) + if(T.wet >= 2) return + T.wet = 2 + spawn(800) + if (!istype(T)) return + T.wet = 0 + if(T.wet_overlay) + T.overlays -= T.wet_overlay + T.wet_overlay = null + return + +/datum/reagent/silicate + name = "Silicate" + id = "silicate" + description = "A compound that can be used to reinforce glass." + reagent_state = LIQUID + color = "#C7FFFF" // rgb: 199, 255, 255 + +/datum/reagent/silicate/reaction_obj(var/obj/O, var/volume) + src = null + if(istype(O,/obj/structure/window)) + var/obj/structure/window/W = O + W.apply_silicate(volume) + return + +/datum/reagent/glycerol + name = "Glycerol" + id = "glycerol" + description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." + reagent_state = LIQUID + color = "#808080" // rgb: 128, 128, 128 + + custom_metabolism = 0.01 + +/datum/reagent/nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." + reagent_state = LIQUID + color = "#808080" // rgb: 128, 128, 128 + + custom_metabolism = 0.01 + +/datum/reagent/ultraglue + name = "Ultra Glue" + id = "glue" + description = "An extremely powerful bonding agent." + color = "#FFFFCC" // rgb: 255, 255, 204 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm new file mode 100644 index 0000000000..bea079a755 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -0,0 +1,594 @@ +/datum/reagent/toxin + name = "Toxin" + id = "toxin" + description = "A toxic chemical." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + var/toxpwr = 0.7 // Toxins are really weak, but without being treated, last very long. + custom_metabolism = 0.1 + +/datum/reagent/toxin/on_mob_life(var/mob/living/M as mob,var/alien) + if(!M) M = holder.my_atom + if(toxpwr) + M.adjustToxLoss(toxpwr*REM) + if(alien) ..() // Kind of a catch-all for aliens without the liver. Because this does not metabolize 'naturally', only removed by the liver. + return + +/datum/reagent/plasticide + name = "Plasticide" + id = "plasticide" + description = "Liquid plastic, do not eat." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + custom_metabolism = 0.01 + +/datum/reagent/plasticide/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + // Toxins are really weak, but without being treated, last very long. + M.adjustToxLoss(0.2) + ..() + return + +/datum/reagent/toxin/amatoxin + name = "Amatoxin" + id = "amatoxin" + description = "A powerful poison derived from certain species of mushroom." + reagent_state = LIQUID + color = "#792300" // rgb: 121, 35, 0 + toxpwr = 1 + +/datum/reagent/toxin/carpotoxin + name = "Carpotoxin" + id = "carpotoxin" + description = "A deadly neurotoxin produced by the dreaded space carp." + reagent_state = LIQUID + color = "#003333" // rgb: 0, 51, 51 + toxpwr = 2 + +/datum/reagent/toxin/phoron + name = "Phoron" + id = "phoron" + description = "Phoron in its liquid form." + reagent_state = LIQUID + color = "#9D14DB" + toxpwr = 3 + +/datum/reagent/toxin/phoron/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + holder.remove_reagent("inaprovaline", 2*REM) + ..() + return + +/datum/reagent/toxin/phoron/reaction_obj(var/obj/O, var/volume) + src = null + /*if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg/slime)) + var/obj/item/weapon/reagent_containers/food/snacks/egg/slime/egg = O + if (egg.grown) + egg.Hatch()*/ + if((!O) || (!volume)) return 0 + var/turf/the_turf = get_turf(O) + the_turf.assume_gas("volatile_fuel", volume, T20C) + +/datum/reagent/toxin/phoron/reaction_turf(var/turf/T, var/volume) + src = null + T.assume_gas("volatile_fuel", volume, T20C) + return + +/datum/reagent/toxin/phoron/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 5) + return + +/datum/reagent/toxin/cyanide //Fast and Lethal + name = "Cyanide" + id = "cyanide" + description = "A highly toxic chemical." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + toxpwr = 4 + custom_metabolism = 0.4 + +/datum/reagent/toxin/cyanide/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustOxyLoss(4*REM) + M.sleeping += 1 + ..() + return + +/datum/reagent/toxin/potassium_chloride + name = "Potassium Chloride" + id = "potassium_chloride" + description = "A delicious salt that stops the heart when injected into cardiac muscle." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255,255,255 + toxpwr = 0 + overdose = 30 + +/datum/reagent/toxin/potassium_chloride/on_mob_life(var/mob/living/carbon/M as mob) + var/mob/living/carbon/human/H = M + if(H.stat != 1) + if (volume >= overdose) + if(H.losebreath >= 10) + H.losebreath = max(10, H.losebreath-10) + H.adjustOxyLoss(2) + H.Weaken(10) + ..() + return + +/datum/reagent/toxin/potassium_chlorophoride + name = "Potassium Chlorophoride" + id = "potassium_chlorophoride" + description = "A specific chemical based on Potassium Chloride to stop the heart for surgery. Not safe to eat!" + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255,255,255 + toxpwr = 2 + overdose = 20 + +/datum/reagent/toxin/potassium_chlorophoride/on_mob_life(var/mob/living/carbon/M as mob) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.stat != 1) + if(H.losebreath >= 10) + H.losebreath = max(10, M.losebreath-10) + H.adjustOxyLoss(2) + H.Weaken(10) + ..() + return + +/datum/reagent/toxin/zombiepowder + name = "Zombie Powder" + id = "zombiepowder" + description = "A strong neurotoxin that puts the subject into a death-like state." + reagent_state = SOLID + color = "#669900" // rgb: 102, 153, 0 + toxpwr = 0.5 + +/datum/reagent/toxin/zombiepowder/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + M.status_flags |= FAKEDEATH + M.adjustOxyLoss(0.5*REM) + M.Weaken(10) + M.silent = max(M.silent, 10) + M.tod = worldtime2text() + ..() + return + +/datum/reagent/toxin/zombiepowder/Destroy() + if(holder && ismob(holder.my_atom)) + var/mob/M = holder.my_atom + M.status_flags &= ~FAKEDEATH + ..() + +//Reagents used for plant fertilizers. +/datum/reagent/toxin/fertilizer + name = "fertilizer" + id = "fertilizer" + description = "A chemical mix good for growing plants with." + reagent_state = LIQUID + toxpwr = 0.2 //It's not THAT poisonous. + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/toxin/fertilizer/eznutrient + name = "EZ Nutrient" + id = "eznutrient" + +/datum/reagent/toxin/fertilizer/left4zed + name = "Left-4-Zed" + id = "left4zed" + +/datum/reagent/toxin/fertilizer/robustharvest + name = "Robust Harvest" + id = "robustharvest" + +/datum/reagent/toxin/plantbgone + name = "Plant-B-Gone" + id = "plantbgone" + description = "A harmful toxic mixture to kill plantlife. Do not ingest!" + reagent_state = LIQUID + color = "#49002E" // rgb: 73, 0, 46 + toxpwr = 1 + + // Clear off wallrot fungi +/datum/reagent/toxin/plantbgone/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") qdel(E) + + for(var/mob/O in viewers(W, null)) + O.show_message(text("\blue The fungi are completely dissolved by the solution!"), 1) + +/datum/reagent/toxin/plantbgone/reaction_obj(var/obj/O, var/volume) + if(istype(O,/obj/effect/alien/weeds/)) + var/obj/effect/alien/weeds/alien_weeds = O + alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast + alien_weeds.healthcheck() + else if(istype(O,/obj/effect/plant)) + var/obj/effect/plant/plant = O + plant.die_off() + else if(istype(O,/obj/machinery/portable_atmospherics/hydroponics)) + var/obj/machinery/portable_atmospherics/hydroponics/tray = O + + if(tray.seed) + tray.health -= rand(30,50) + if(tray.pestlevel > 0) + tray.pestlevel -= 2 + if(tray.weedlevel > 0) + tray.weedlevel -= 3 + tray.toxins += 4 + tray.check_level_sanity() + tray.update_icon() + +/datum/reagent/toxin/plantbgone/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + src = null + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(!C.wear_mask) // If not wearing a mask + C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.dna) + if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage + H.adjustToxLoss(50) + +/datum/reagent/toxin/acid/polyacid + name = "Polytrinic acid" + id = "pacid" + description = "Polytrinic acid is a an extremely corrosive chemical substance." + reagent_state = LIQUID + color = "#8E18A9" // rgb: 142, 24, 169 + toxpwr = 2 + meltprob = 30 + +/datum/reagent/toxin/lexorin + name = "Lexorin" + id = "lexorin" + description = "Lexorin temporarily stops respiration. Causes tissue damage." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + toxpwr = 0 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/toxin/lexorin/on_mob_life(var/mob/living/M as mob) + if(M.stat == 2.0) + return + if(!M) M = holder.my_atom + if(prob(33)) + M.take_organ_damage(1*REM, 0) + if(M.losebreath < 15) + M.losebreath++ + ..() + return + +/datum/reagent/toxin/mutagen + name = "Unstable mutagen" + id = "mutagen" + description = "Might cause unpredictable mutations. Keep away from children." + reagent_state = LIQUID + color = "#13BC5E" // rgb: 19, 188, 94 + toxpwr = 0 + +/datum/reagent/toxin/mutagen/reaction_mob(var/mob/living/carbon/M, var/method=TOUCH, var/volume) + if(!..()) return + if(!istype(M) || !M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. + src = null + if((method==TOUCH && prob(33)) || method==INGEST) + randmuti(M) + if(prob(98)) randmutb(M) + else randmutg(M) + domutcheck(M, null) + M.UpdateAppearance() + return + +/datum/reagent/toxin/mutagen/on_mob_life(var/mob/living/carbon/M) + if(!istype(M)) return + if(!M) M = holder.my_atom + M.apply_effect(10,IRRADIATE,0) + ..() + return + +/datum/reagent/toxin/slimejelly + name = "Slime Jelly" + id = "slimejelly" + description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." + reagent_state = LIQUID + color = "#801E28" // rgb: 128, 30, 40 + toxpwr = 0 + +/datum/reagent/toxin/slimejelly/on_mob_life(var/mob/living/M as mob) + if(prob(10)) + M << "\red Your insides are burning!" + M.adjustToxLoss(rand(20,60)*REM) + else if(prob(40)) + M.heal_organ_damage(5*REM,0) + ..() + return + +/datum/reagent/toxin/stoxin + name = "Soporific" + id = "stoxin" + description = "An effective hypnotic used to treat insomnia." + reagent_state = LIQUID + color = "#009CA8" // rgb: 232, 149, 204 + toxpwr = 0 + custom_metabolism = 0.1 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/toxin/stoxin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + switch(data) + if(1 to 12) + if(prob(5)) M.emote("yawn") + if(12 to 15) + M.eye_blurry = max(M.eye_blurry, 10) + if(15 to 49) + if(prob(50)) + M.Weaken(2) + M.drowsyness = max(M.drowsyness, 20) + if(50 to INFINITY) + M.sleeping = max(M.sleeping, 20) + M.drowsyness = max(M.drowsyness, 60) + data++ + ..() + return + +/datum/reagent/toxin/chloralhydrate + name = "Chloral Hydrate" + id = "chloralhydrate" + description = "A powerful sedative." + reagent_state = SOLID + color = "#000067" // rgb: 0, 0, 103 + toxpwr = 1 + custom_metabolism = 0.1 //Default 0.2 + overdose = 15 + overdose_dam = 5 + +/datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + data++ + switch(data) + if(1) + M.confused += 2 + M.drowsyness += 2 + if(2 to 20) + M.Weaken(30) + M.eye_blurry = max(M.eye_blurry, 10) + if(20 to INFINITY) + M.sleeping = max(M.sleeping, 30) + ..() + return + +/datum/reagent/toxin/beer2 //disguised as normal beer for use by emagged brobots + name = "Beer" + id = "beer2" + description = "An alcoholic beverage made from malted grains, hops, yeast, and water. The fermentation appears to be incomplete." //If the players manage to analyze this, they deserve to know something is wrong. + reagent_state = LIQUID + color = "#664300" // rgb: 102, 67, 0 + custom_metabolism = 0.15 // Sleep toxins should always be consumed pretty fast + overdose = REAGENTS_OVERDOSE/2 + + glass_icon_state = "beerglass" + glass_name = "glass of beer" + glass_desc = "A freezing pint of beer" + glass_center_of_mass = list("x"=16, "y"=8) + +/datum/reagent/toxin/beer2/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!data) data = 1 + switch(data) + if(1) + M.confused += 2 + M.drowsyness += 2 + if(2 to 50) + M.sleeping += 1 + if(51 to INFINITY) + M.sleeping += 1 + M.adjustToxLoss((data - 50)*REM) + data++ + ..() + return + +/datum/reagent/space_drugs + name = "Space drugs" + id = "space_drugs" + description = "An illegal chemical compound used as drug." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.druggy = max(M.druggy, 15) + if(isturf(M.loc) && !istype(M.loc, /turf/space)) + if(M.canmove && !M.restrained()) + if(prob(10)) step(M, pick(cardinal)) + if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) + holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) + return + +/datum/reagent/serotrotium + name = "Serotrotium" + id = "serotrotium" + description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." + reagent_state = LIQUID + color = "#202040" // rgb: 20, 20, 40 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob) + if(ishuman(M)) + if(prob(7)) M.emote(pick("twitch","drool","moan","gasp")) + holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM) + return + +/datum/reagent/cryptobiolin + name = "Cryptobiolin" + id = "cryptobiolin" + description = "Cryptobiolin causes confusion and dizzyness." + reagent_state = LIQUID + color = "#000055" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/cryptobiolin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.make_dizzy(1) + if(!M.confused) M.confused = 1 + M.confused = max(M.confused, 20) + holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) + ..() + return + +/datum/reagent/impedrezene + name = "Impedrezene" + id = "impedrezene" + description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/impedrezene/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.jitteriness = max(M.jitteriness-5,0) + if(prob(80)) M.adjustBrainLoss(1*REM) + if(prob(50)) M.drowsyness = max(M.drowsyness, 3) + if(prob(10)) M.emote("drool") + ..() + return + +/datum/reagent/toxin/mindbreaker + name = "Mindbreaker Toxin" + id = "mindbreaker" + description = "A powerful hallucinogen, it can cause fatal effects in users." + reagent_state = LIQUID + color = "#B31008" // rgb: 139, 166, 233 + toxpwr = 0 + custom_metabolism = 0.05 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/toxin/mindbreaker/on_mob_life(var/mob/living/M) + if(!M) M = holder.my_atom + M.hallucination += 10 + ..() + return + +/datum/reagent/psilocybin + name = "Psilocybin" + id = "psilocybin" + description = "A strong psycotropic derived from certain species of mushroom." + color = "#E700E7" // rgb: 231, 0, 231 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/psilocybin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.druggy = max(M.druggy, 30) + if(!data) data = 1 + switch(data) + if(1 to 5) + if (!M.stuttering) M.stuttering = 1 + M.make_dizzy(5) + if(prob(10)) M.emote(pick("twitch","giggle")) + if(5 to 10) + if (!M.stuttering) M.stuttering = 1 + M.make_jittery(10) + M.make_dizzy(10) + M.druggy = max(M.druggy, 35) + if(prob(20)) M.emote(pick("twitch","giggle")) + if (10 to INFINITY) + if (!M.stuttering) M.stuttering = 1 + M.make_jittery(20) + M.make_dizzy(20) + M.druggy = max(M.druggy, 40) + if(prob(30)) M.emote(pick("twitch","giggle")) + holder.remove_reagent(src.id, 0.2) + data++ + ..() + return + +/datum/reagent/nicotine + name = "Nicotine" + id = "nicotine" + description = "A highly addictive stimulant extracted from the tobacco plant." + reagent_state = LIQUID + color = "#181818" // rgb: 24, 24, 24 + +/datum/reagent/slimetoxin + name = "Mutation Toxin" + id = "mutationtoxin" + description = "A corruptive toxin produced by slimes." + reagent_state = LIQUID + color = "#13BC5E" // rgb: 19, 188, 94 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/slimetoxin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(ishuman(M)) + var/mob/living/carbon/human/human = M + if(human.species.name != "Slime") + M << "Your flesh rapidly mutates!" + human.set_species("Slime") + ..() + return + +/datum/reagent/aslimetoxin + name = "Advanced Mutation Toxin" + id = "amutationtoxin" + description = "An advanced corruptive toxin produced by slimes." + reagent_state = LIQUID + color = "#13BC5E" // rgb: 19, 188, 94 + overdose = REAGENTS_OVERDOSE + +/datum/reagent/aslimetoxin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(istype(M, /mob/living/carbon) && M.stat != DEAD) + M << "\red Your flesh rapidly mutates!" + if(M.monkeyizing) return + M.monkeyizing = 1 + M.canmove = 0 + M.icon = null + M.overlays.Cut() + M.invisibility = 101 + for(var/obj/item/W in M) + if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something + qdel(W) + continue + W.layer = initial(W.layer) + W.loc = M.loc + W.dropped(M) + var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(M.loc) + new_mob.a_intent = I_HURT + new_mob.universal_speak = 1 + if(M.mind) + M.mind.transfer_to(new_mob) + else + new_mob.key = M.key + qdel(M) + ..() + return + +/datum/reagent/nanites + name = "Nanomachines" + id = "nanites" + description = "Microscopic construction robots." + reagent_state = LIQUID + color = "#535E66" // rgb: 83, 94, 102 + +/datum/reagent/nanites/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + src = null + if( (prob(10) && method==TOUCH) || method==INGEST) + M.contract_disease(new /datum/disease/robotic_transformation(0),1) + +/datum/reagent/xenomicrobes + name = "Xenomicrobes" + id = "xenomicrobes" + description = "Microbes with an entirely alien cellular structure." + reagent_state = LIQUID + color = "#535E66" // rgb: 83, 94, 102 + +/datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + src = null + if( (prob(10) && method==TOUCH) || method==INGEST) + M.contract_disease(new /datum/disease/xeno_transformation(0),1) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index fc8c129140..d569061037 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1,2257 +1,2280 @@ -/////////////////////////////////////////////////////////////////////////////////// -datum - chemical_reaction - var/name = null - var/id = null - var/result = null - var/resultcolor = null //for paint - var/list/required_reagents = new/list() - var/list/required_catalysts = new/list() - - // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things - var/atom/required_container = null // the container required for the reaction to happen - var/required_other = 0 // an integer required for the reaction to happen - - var/result_amount = 0 - var/secondary = 0 // set to nonzero if secondary reaction - var/list/secondary_results = list() //additional reagents produced by the reaction - var/requires_heating = 0 - - proc - on_reaction(var/datum/reagents/holder, var/created_volume) - return - - //I recommend you set the result amount to the total volume of all components. - - explosion_potassium - name = "Explosion" - id = "explosion_potassium" - result = null - required_reagents = list("water" = 1, "potassium" = 1) - result_amount = 2 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) - e.holder_damage(holder.my_atom) - if(isliving(holder.my_atom)) - e.amount *= 0.5 - var/mob/living/L = holder.my_atom - if(L.stat!=DEAD) - e.amount *= 0.5 - e.start() - holder.clear_reagents() - return - - emp_pulse - name = "EMP Pulse" - id = "emp_pulse" - result = null - required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense - result_amount = 2 - - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. - // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(created_volume / 24), round(created_volume / 14), 1) - holder.clear_reagents() - return - - silicate - name = "Silicate" - id = "silicate" - result = "silicate" - required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 3 - - stoxin - name = "Soporific" - id = "stoxin" - result = "stoxin" - required_reagents = list("chloralhydrate" = 1, "sugar" = 4) - result_amount = 5 - - sterilizine - name = "Sterilizine" - id = "sterilizine" - result = "sterilizine" - required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "chlorine" = 1) - result_amount = 3 - - inaprovaline - name = "Inaprovaline" - id = "inaprovaline" - result = "inaprovaline" - required_reagents = list("oxygen" = 1, "carbon" = 1, "sugar" = 1) - result_amount = 3 - - anti_toxin - name = "Dylovene" - id = "anti_toxin" - result = "anti_toxin" - required_reagents = list("silicon" = 1, "potassium" = 1, "nitrogen" = 1) - result_amount = 3 - - mutagen - name = "Unstable mutagen" - id = "mutagen" - result = "mutagen" - required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) - result_amount = 3 - - tramadol - name = "Tramadol" - id = "tramadol" - result = "tramadol" - required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1) - result_amount = 3 - - paracetamol - name = "Paracetamol" - id = "paracetamol" - result = "paracetamol" - required_reagents = list("tramadol" = 1, "sugar" = 1, "water" = 1) - result_amount = 3 - - oxycodone - name = "Oxycodone" - id = "oxycodone" - result = "oxycodone" - required_reagents = list("ethanol" = 1, "tramadol" = 1) - required_catalysts = list("phoron" = 1) - result_amount = 1 - - //cyanide - // name = "Cyanide" - // id = "cyanide" - // result = "cyanide" - // required_reagents = list("hydrogen" = 1, "carbon" = 1, "nitrogen" = 1) - // result_amount = 1 - - water //I can't believe we never had this. - name = "Water" - id = "water" - result = "water" - required_reagents = list("oxygen" = 1, "hydrogen" = 2) - result_amount = 1 - - thermite - name = "Thermite" - id = "thermite" - result = "thermite" - required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) - result_amount = 3 - - lexorin - name = "Lexorin" - id = "lexorin" - result = "lexorin" - required_reagents = list("phoron" = 1, "hydrogen" = 1, "nitrogen" = 1) - result_amount = 3 - - space_drugs - name = "Space Drugs" - id = "space_drugs" - result = "space_drugs" - required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) - result_amount = 3 - - lube - name = "Space Lube" - id = "lube" - result = "lube" - required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 4 - - pacid - name = "Polytrinic acid" - id = "pacid" - result = "pacid" - required_reagents = list("sacid" = 1, "chlorine" = 1, "potassium" = 1) - result_amount = 3 - - synaptizine - name = "Synaptizine" - id = "synaptizine" - result = "synaptizine" - required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) - result_amount = 3 - - hyronalin - name = "Hyronalin" - id = "hyronalin" - result = "hyronalin" - required_reagents = list("radium" = 1, "anti_toxin" = 1) - result_amount = 2 - - arithrazine - name = "Arithrazine" - id = "arithrazine" - result = "arithrazine" - required_reagents = list("hyronalin" = 1, "hydrogen" = 1) - result_amount = 2 - - impedrezene - name = "Impedrezene" - id = "impedrezene" - result = "impedrezene" - required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) - result_amount = 2 - - kelotane - name = "Kelotane" - id = "kelotane" - result = "kelotane" - required_reagents = list("silicon" = 1, "carbon" = 1) - result_amount = 2 - - peridaxon - name = "Peridaxon" - id = "peridaxon" - result = "peridaxon" - required_reagents = list("bicaridine" = 2, "clonexadone" = 2) - required_catalysts = list("phoron" = 5) - result_amount = 2 - - virus_food - name = "Virus Food" - id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 1, "milk" = 1) - result_amount = 5 - - leporazine - name = "Leporazine" - id = "leporazine" - result = "leporazine" - required_reagents = list("silicon" = 1, "copper" = 1) - required_catalysts = list("phoron" = 5) - result_amount = 2 - - cryptobiolin - name = "Cryptobiolin" - id = "cryptobiolin" - result = "cryptobiolin" - required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1) - result_amount = 3 - - tricordrazine - name = "Tricordrazine" - id = "tricordrazine" - result = "tricordrazine" - required_reagents = list("inaprovaline" = 1, "anti_toxin" = 1) - result_amount = 2 - - alkysine - name = "Alkysine" - id = "alkysine" - result = "alkysine" - required_reagents = list("chlorine" = 1, "nitrogen" = 1, "anti_toxin" = 1) - result_amount = 2 - - dexalin - name = "Dexalin" - id = "dexalin" - result = "dexalin" - required_reagents = list("oxygen" = 2, "phoron" = 0.1) - required_catalysts = list("phoron" = 5) - result_amount = 1 - - dermaline - name = "Dermaline" - id = "dermaline" - result = "dermaline" - required_reagents = list("oxygen" = 1, "phosphorus" = 1, "kelotane" = 1) - result_amount = 3 - - dexalinp - name = "Dexalin Plus" - id = "dexalinp" - result = "dexalinp" - required_reagents = list("dexalin" = 1, "carbon" = 1, "iron" = 1) - result_amount = 3 - - bicaridine - name = "Bicaridine" - id = "bicaridine" - result = "bicaridine" - required_reagents = list("inaprovaline" = 1, "carbon" = 1) - result_amount = 2 - - hyperzine - name = "Hyperzine" - id = "hyperzine" - result = "hyperzine" - required_reagents = list("sugar" = 1, "phosphorus" = 1, "sulfur" = 1,) - result_amount = 3 - - ryetalyn - name = "Ryetalyn" - id = "ryetalyn" - result = "ryetalyn" - required_reagents = list("arithrazine" = 1, "carbon" = 1) - result_amount = 2 - - cryoxadone - name = "Cryoxadone" - id = "cryoxadone" - result = "cryoxadone" - required_reagents = list("dexalin" = 1, "water" = 1, "oxygen" = 1) - result_amount = 3 - - clonexadone - name = "Clonexadone" - id = "clonexadone" - result = "clonexadone" - required_reagents = list("cryoxadone" = 1, "sodium" = 1, "phoron" = 0.1) - required_catalysts = list("phoron" = 5) - result_amount = 2 - - spaceacillin - name = "Spaceacillin" - id = "spaceacillin" - result = "spaceacillin" - required_reagents = list("cryptobiolin" = 1, "inaprovaline" = 1) - result_amount = 2 - - imidazoline - name = "imidazoline" - id = "imidazoline" - result = "imidazoline" - required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1) - result_amount = 2 - - ethylredoxrazine - name = "Ethylredoxrazine" - id = "ethylredoxrazine" - result = "ethylredoxrazine" - required_reagents = list("oxygen" = 1, "anti_toxin" = 1, "carbon" = 1) - result_amount = 3 - - ethanoloxidation - name = "ethanoloxidation" //Kind of a placeholder in case someone ever changes it so that chemicals - id = "ethanoloxidation" // react in the body. Also it would be silly if it didn't exist. - result = "water" - required_reagents = list("ethylredoxrazine" = 1, "ethanol" = 1) - result_amount = 2 - - glycerol - name = "Glycerol" - id = "glycerol" - result = "glycerol" - required_reagents = list("cornoil" = 3, "sacid" = 1) - result_amount = 1 - - nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - result = "nitroglycerin" - required_reagents = list("glycerol" = 1, "pacid" = 1, "sacid" = 1) - result_amount = 2 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0) - e.holder_damage(holder.my_atom) - if(isliving(holder.my_atom)) - e.amount *= 0.5 - var/mob/living/L = holder.my_atom - if(L.stat!=DEAD) - e.amount *= 0.5 - e.start() - - holder.clear_reagents() - return - - sodiumchloride - name = "Sodium Chloride" - id = "sodiumchloride" - result = "sodiumchloride" - required_reagents = list("sodium" = 1, "chlorine" = 1) - result_amount = 2 - - flash_powder - name = "Flash powder" - id = "flash_powder" - result = null - required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1 ) - result_amount = null - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - for(var/mob/living/carbon/M in viewers(world.view, location)) - switch(get_dist(M, location)) - if(0 to 3) - if(hasvar(M, "glasses")) - if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) - continue - - flick("e_flash", M.flash) - M.Weaken(15) - - if(4 to 5) - if(hasvar(M, "glasses")) - if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) - continue - - flick("e_flash", M.flash) - M.Stun(5) - - napalm - name = "Napalm" - id = "napalm" - result = null - required_reagents = list("aluminum" = 1, "phoron" = 1, "sacid" = 1 ) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/location = get_turf(holder.my_atom.loc) - for(var/turf/simulated/floor/target_tile in range(0,location)) - target_tile.assume_gas("volatile_fuel", created_volume, 400+T0C) - spawn (0) target_tile.hotspot_expose(700, 400) - holder.del_reagent("napalm") - return - - /* - smoke - name = "Smoke" - id = "smoke" - result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1 ) - result_amount = null - secondary = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/system/bad_smoke_spread/S = new /datum/effect/system/bad_smoke_spread - S.attach(location) - S.set_up(10, 0, location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - holder.clear_reagents() - return */ - - chemsmoke - name = "Chemsmoke" - id = "chemsmoke" - result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) - result_amount = 0.4 - secondary = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem - S.attach(location) - S.set_up(holder, created_volume, 0, location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - S.start() - holder.clear_reagents() - return - - chloralhydrate - name = "Chloral Hydrate" - id = "chloralhydrate" - result = "chloralhydrate" - required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) - result_amount = 1 - - potassium_chloride - name = "Potassium Chloride" - id = "potassium_chloride" - result = "potassium_chloride" - required_reagents = list("sodiumchloride" = 1, "potassium" = 1) - result_amount = 2 - - potassium_chlorophoride - name = "Potassium Chlorophoride" - id = "potassium_chlorophoride" - result = "potassium_chlorophoride" - required_reagents = list("potassium_chloride" = 1, "phoron" = 1, "chloralhydrate" = 1) - result_amount = 4 - - stoxin - name = "Soporific" - id = "stoxin" - result = "stoxin" - required_reagents = list("chloralhydrate" = 1, "sugar" = 4) - result_amount = 5 - - zombiepowder - name = "Zombie Powder" - id = "zombiepowder" - result = "zombiepowder" - required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) - result_amount = 2 - - rezadone - name = "Rezadone" - id = "rezadone" - result = "rezadone" - required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) - result_amount = 3 - - mindbreaker - name = "Mindbreaker Toxin" - id = "mindbreaker" - result = "mindbreaker" - required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1) - result_amount = 3 - - lipozine - name = "Lipozine" - id = "Lipozine" - result = "lipozine" - required_reagents = list("sodiumchloride" = 1, "ethanol" = 1, "radium" = 1) - result_amount = 3 - - phoronsolidification - name = "Solid Phoron" - id = "solidphoron" - result = null - required_reagents = list("iron" = 5, "frostoil" = 5, "phoron" = 20) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/mineral/phoron(location) - return - - plastication - name = "Plastic" - id = "solidplastic" - result = null - required_reagents = list("pacid" = 10, "plasticide" = 20) - result_amount = 1 - on_reaction(var/datum/reagents/holder) - new /obj/item/stack/sheet/mineral/plastic(get_turf(holder.my_atom),10) - return - - virus_food - name = "Virus Food" - id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 5, "milk" = 5, "oxygen" = 5) - result_amount = 15 +/datum/chemical_reaction + var/name = null + var/id = null + var/result = null + var/resultcolor = null //for paint + var/list/required_reagents = new/list() + var/list/required_catalysts = new/list() + + // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things + var/atom/required_container = null // the container required for the reaction to happen + var/required_other = 0 // an integer required for the reaction to happen + + var/result_amount = 0 + var/secondary = 0 // set to nonzero if secondary reaction + var/list/secondary_results = list() //additional reagents produced by the reaction + var/requires_heating = 0 + +/datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume) + return + + //I recommend you set the result amount to the total volume of all components. + +/datum/chemical_reaction/explosion_potassium + name = "Explosion" + id = "explosion_potassium" + result = null + required_reagents = list("water" = 1, "potassium" = 1) + result_amount = 2 + +/datum/chemical_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) + e.holder_damage(holder.my_atom) + if(isliving(holder.my_atom)) + e.amount *= 0.5 + var/mob/living/L = holder.my_atom + if(L.stat!=DEAD) + e.amount *= 0.5 + e.start() + holder.clear_reagents() + return + +/datum/chemical_reaction/emp_pulse + name = "EMP Pulse" + id = "emp_pulse" + result = null + required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense + result_amount = 2 + +/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. + // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. + empulse(location, round(created_volume / 24), round(created_volume / 14), 1) + holder.clear_reagents() + return + +/datum/chemical_reaction/silicate + name = "Silicate" + id = "silicate" + result = "silicate" + required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/stoxin + name = "Soporific" + id = "stoxin" + result = "stoxin" + required_reagents = list("chloralhydrate" = 1, "sugar" = 4) + result_amount = 5 + +/datum/chemical_reaction/sterilizine + name = "Sterilizine" + id = "sterilizine" + result = "sterilizine" + required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/inaprovaline + name = "Inaprovaline" + id = "inaprovaline" + result = "inaprovaline" + required_reagents = list("oxygen" = 1, "carbon" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/anti_toxin + name = "Dylovene" + id = "anti_toxin" + result = "anti_toxin" + required_reagents = list("silicon" = 1, "potassium" = 1, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/mutagen + name = "Unstable mutagen" + id = "mutagen" + result = "mutagen" + required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/tramadol + name = "Tramadol" + id = "tramadol" + result = "tramadol" + required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/paracetamol + name = "Paracetamol" + id = "paracetamol" + result = "paracetamol" + required_reagents = list("tramadol" = 1, "sugar" = 1, "water" = 1) + result_amount = 3 + +/datum/chemical_reaction/oxycodone + name = "Oxycodone" + id = "oxycodone" + result = "oxycodone" + required_reagents = list("ethanol" = 1, "tramadol" = 1) + required_catalysts = list("phoron" = 1) + result_amount = 1 + +//cyanide +// name = "Cyanide" +// id = "cyanide" +// result = "cyanide" +// required_reagents = list("hydrogen" = 1, "carbon" = 1, "nitrogen" = 1) +// result_amount = 1 + +/datum/chemical_reaction/water //I can't believe we never had this. + name = "Water" + id = "water" + result = "water" + required_reagents = list("oxygen" = 1, "hydrogen" = 2) + result_amount = 1 + +/datum/chemical_reaction/thermite + name = "Thermite" + id = "thermite" + result = "thermite" + required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/lexorin + name = "Lexorin" + id = "lexorin" + result = "lexorin" + required_reagents = list("phoron" = 1, "hydrogen" = 1, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/space_drugs + name = "Space Drugs" + id = "space_drugs" + result = "space_drugs" + required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) + result_amount = 3 + +/datum/chemical_reaction/lube + name = "Space Lube" + id = "lube" + result = "lube" + required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 4 + +/datum/chemical_reaction/pacid + name = "Polytrinic acid" + id = "pacid" + result = "pacid" + required_reagents = list("sacid" = 1, "chlorine" = 1, "potassium" = 1) + result_amount = 3 + +/datum/chemical_reaction/synaptizine + name = "Synaptizine" + id = "synaptizine" + result = "synaptizine" + required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) + result_amount = 3 + +/datum/chemical_reaction/hyronalin + name = "Hyronalin" + id = "hyronalin" + result = "hyronalin" + required_reagents = list("radium" = 1, "anti_toxin" = 1) + result_amount = 2 + +/datum/chemical_reaction/arithrazine + name = "Arithrazine" + id = "arithrazine" + result = "arithrazine" + required_reagents = list("hyronalin" = 1, "hydrogen" = 1) + result_amount = 2 + +/datum/chemical_reaction/impedrezene + name = "Impedrezene" + id = "impedrezene" + result = "impedrezene" + required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) + result_amount = 2 + +/datum/chemical_reaction/kelotane + name = "Kelotane" + id = "kelotane" + result = "kelotane" + required_reagents = list("silicon" = 1, "carbon" = 1) + result_amount = 2 + +/datum/chemical_reaction/peridaxon + name = "Peridaxon" + id = "peridaxon" + result = "peridaxon" + required_reagents = list("bicaridine" = 2, "clonexadone" = 2) + required_catalysts = list("phoron" = 5) + result_amount = 2 + +/datum/chemical_reaction/leporazine + name = "Leporazine" + id = "leporazine" + result = "leporazine" + required_reagents = list("silicon" = 1, "copper" = 1) + required_catalysts = list("phoron" = 5) + result_amount = 2 + +/datum/chemical_reaction/cryptobiolin + name = "Cryptobiolin" + id = "cryptobiolin" + result = "cryptobiolin" + required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/tricordrazine + name = "Tricordrazine" + id = "tricordrazine" + result = "tricordrazine" + required_reagents = list("inaprovaline" = 1, "anti_toxin" = 1) + result_amount = 2 + +/datum/chemical_reaction/alkysine + name = "Alkysine" + id = "alkysine" + result = "alkysine" + required_reagents = list("chlorine" = 1, "nitrogen" = 1, "anti_toxin" = 1) + result_amount = 2 + +/datum/chemical_reaction/dexalin + name = "Dexalin" + id = "dexalin" + result = "dexalin" + required_reagents = list("oxygen" = 2, "phoron" = 0.1) + required_catalysts = list("phoron" = 5) + result_amount = 1 + +/datum/chemical_reaction/dermaline + name = "Dermaline" + id = "dermaline" + result = "dermaline" + required_reagents = list("oxygen" = 1, "phosphorus" = 1, "kelotane" = 1) + result_amount = 3 + +/datum/chemical_reaction/dexalinp + name = "Dexalin Plus" + id = "dexalinp" + result = "dexalinp" + required_reagents = list("dexalin" = 1, "carbon" = 1, "iron" = 1) + result_amount = 3 + +/datum/chemical_reaction/bicaridine + name = "Bicaridine" + id = "bicaridine" + result = "bicaridine" + required_reagents = list("inaprovaline" = 1, "carbon" = 1) + result_amount = 2 + +/datum/chemical_reaction/hyperzine + name = "Hyperzine" + id = "hyperzine" + result = "hyperzine" + required_reagents = list("sugar" = 1, "phosphorus" = 1, "sulfur" = 1,) + result_amount = 3 + +/datum/chemical_reaction/ryetalyn + name = "Ryetalyn" + id = "ryetalyn" + result = "ryetalyn" + required_reagents = list("arithrazine" = 1, "carbon" = 1) + result_amount = 2 + +/datum/chemical_reaction/cryoxadone + name = "Cryoxadone" + id = "cryoxadone" + result = "cryoxadone" + required_reagents = list("dexalin" = 1, "water" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/clonexadone + name = "Clonexadone" + id = "clonexadone" + result = "clonexadone" + required_reagents = list("cryoxadone" = 1, "sodium" = 1, "phoron" = 0.1) + required_catalysts = list("phoron" = 5) + result_amount = 2 + +/datum/chemical_reaction/spaceacillin + name = "Spaceacillin" + id = "spaceacillin" + result = "spaceacillin" + required_reagents = list("cryptobiolin" = 1, "inaprovaline" = 1) + result_amount = 2 + +/datum/chemical_reaction/imidazoline + name = "imidazoline" + id = "imidazoline" + result = "imidazoline" + required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1) + result_amount = 2 + +/datum/chemical_reaction/ethylredoxrazine + name = "Ethylredoxrazine" + id = "ethylredoxrazine" + result = "ethylredoxrazine" + required_reagents = list("oxygen" = 1, "anti_toxin" = 1, "carbon" = 1) + result_amount = 3 + +/datum/chemical_reaction/ethanoloxidation + name = "ethanoloxidation" //Kind of a placeholder in case someone ever changes it so that chemicals + id = "ethanoloxidation" // react in the body. Also it would be silly if it didn't exist. + result = "water" + required_reagents = list("ethylredoxrazine" = 1, "ethanol" = 1) + result_amount = 2 + +/datum/chemical_reaction/glycerol + name = "Glycerol" + id = "glycerol" + result = "glycerol" + required_reagents = list("cornoil" = 3, "sacid" = 1) + result_amount = 1 + +/datum/chemical_reaction/nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + result = "nitroglycerin" + required_reagents = list("glycerol" = 1, "pacid" = 1, "sacid" = 1) + result_amount = 2 + +/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0) + e.holder_damage(holder.my_atom) + if(isliving(holder.my_atom)) + e.amount *= 0.5 + var/mob/living/L = holder.my_atom + if(L.stat!=DEAD) + e.amount *= 0.5 + e.start() + + holder.clear_reagents() + return + +/datum/chemical_reaction/sodiumchloride + name = "Sodium Chloride" + id = "sodiumchloride" + result = "sodiumchloride" + required_reagents = list("sodium" = 1, "chlorine" = 1) + result_amount = 2 + +/datum/chemical_reaction/flash_powder + name = "Flash powder" + id = "flash_powder" + result = null + required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1 ) + result_amount = null + +/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + for(var/mob/living/carbon/M in viewers(world.view, location)) + switch(get_dist(M, location)) + if(0 to 3) + if(hasvar(M, "glasses")) + if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) + continue + + flick("e_flash", M.flash) + M.Weaken(15) + + if(4 to 5) + if(hasvar(M, "glasses")) + if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) + continue + + flick("e_flash", M.flash) + M.Stun(5) + +/datum/chemical_reaction/napalm + name = "Napalm" + id = "napalm" + result = null + required_reagents = list("aluminum" = 1, "phoron" = 1, "sacid" = 1 ) + result_amount = 1 + +/datum/chemical_reaction/napalm/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/location = get_turf(holder.my_atom.loc) + for(var/turf/simulated/floor/target_tile in range(0,location)) + target_tile.assume_gas("volatile_fuel", created_volume, 400+T0C) + spawn (0) target_tile.hotspot_expose(700, 400) + holder.del_reagent("napalm") + return + /* - mix_virus - name = "Mix Virus" - id = "mixvirus" - result = "blood" - required_reagents = list("virusfood" = 5) - required_catalysts = list("blood") - var/level = 2 +/datum/chemical_reaction/smoke + name = "Smoke" + id = "smoke" + result = null + required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1 ) + result_amount = null + secondary = 1 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/system/bad_smoke_spread/S = new /datum/effect/system/bad_smoke_spread + S.attach(location) + S.set_up(10, 0, location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + S.start() + sleep(10) + S.start() + sleep(10) + S.start() + sleep(10) + S.start() + sleep(10) + S.start() + holder.clear_reagents() + return */ - on_reaction(var/datum/reagents/holder, var/created_volume) +/datum/chemical_reaction/chemsmoke + name = "Chemsmoke" + id = "chemsmoke" + result = null + required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) + result_amount = 0.4 + secondary = 1 - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Evolve(level - rand(0, 1)) +/datum/chemical_reaction/chemsmoke/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem + S.attach(location) + S.set_up(holder, created_volume, 0, location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + S.start() + holder.clear_reagents() + return + +/datum/chemical_reaction/chloralhydrate + name = "Chloral Hydrate" + id = "chloralhydrate" + result = "chloralhydrate" + required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) + result_amount = 1 + +/datum/chemical_reaction/potassium_chloride + name = "Potassium Chloride" + id = "potassium_chloride" + result = "potassium_chloride" + required_reagents = list("sodiumchloride" = 1, "potassium" = 1) + result_amount = 2 + +/datum/chemical_reaction/potassium_chlorophoride + name = "Potassium Chlorophoride" + id = "potassium_chlorophoride" + result = "potassium_chlorophoride" + required_reagents = list("potassium_chloride" = 1, "phoron" = 1, "chloralhydrate" = 1) + result_amount = 4 + +/datum/chemical_reaction/stoxin + name = "Soporific" + id = "stoxin" + result = "stoxin" + required_reagents = list("chloralhydrate" = 1, "sugar" = 4) + result_amount = 5 + +/datum/chemical_reaction/zombiepowder + name = "Zombie Powder" + id = "zombiepowder" + result = "zombiepowder" + required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) + result_amount = 2 + +/datum/chemical_reaction/rezadone + name = "Rezadone" + id = "rezadone" + result = "rezadone" + required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) + result_amount = 3 + +/datum/chemical_reaction/mindbreaker + name = "Mindbreaker Toxin" + id = "mindbreaker" + result = "mindbreaker" + required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1) + result_amount = 3 + +/datum/chemical_reaction/lipozine + name = "Lipozine" + id = "Lipozine" + result = "lipozine" + required_reagents = list("sodiumchloride" = 1, "ethanol" = 1, "radium" = 1) + result_amount = 3 + +/datum/chemical_reaction/phoronsolidification + name = "Solid Phoron" + id = "solidphoron" + result = null + required_reagents = list("iron" = 5, "frostoil" = 5, "phoron" = 20) + result_amount = 1 + +/datum/chemical_reaction/phoronsolidification/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/stack/sheet/mineral/phoron(location) + return + +/datum/chemical_reaction/plastication + name = "Plastic" + id = "solidplastic" + result = null + required_reagents = list("pacid" = 10, "plasticide" = 20) + result_amount = 1 + +/datum/chemical_reaction/plastication/on_reaction(var/datum/reagents/holder) + new /obj/item/stack/sheet/mineral/plastic(get_turf(holder.my_atom),10) + return + +/datum/chemical_reaction/virus_food + name = "Virus Food" + id = "virusfood" + result = "virusfood" + required_reagents = list("water" = 1, "milk" = 1, "oxygen" = 1) + result_amount = 3 +/* +/datum/chemical_reaction/mix_virus + name = "Mix Virus" + id = "mixvirus" + result = "blood" + required_reagents = list("virusfood" = 5) + required_catalysts = list("blood") + var/level = 2 + + on_reaction(var/datum/reagents/holder, var/created_volume) + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Evolve(level - rand(0, 1)) - mix_virus_2 + mix_virus_2 - name = "Mix Virus 2" - id = "mixvirus2" - required_reagents = list("mutagen" = 5) - level = 4 + name = "Mix Virus 2" + id = "mixvirus2" + required_reagents = list("mutagen" = 5) + level = 4 - rem_virus + rem_virus - name = "Devolve Virus" - id = "remvirus" - required_reagents = list("synaptizine" = 5) + name = "Devolve Virus" + id = "remvirus" + required_reagents = list("synaptizine" = 5) - on_reaction(var/datum/reagents/holder, var/created_volume) + on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Devolve() + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Devolve() */ - condensedcapsaicin - name = "Condensed Capsaicin" - id = "condensedcapsaicin" - result = "condensedcapsaicin" - required_reagents = list("capsaicin" = 2) - required_catalysts = list("phoron" = 5) - result_amount = 1 +/datum/chemical_reaction/condensedcapsaicin + name = "Condensed Capsaicin" + id = "condensedcapsaicin" + result = "condensedcapsaicin" + required_reagents = list("capsaicin" = 2) + required_catalysts = list("phoron" = 5) + result_amount = 1 - ketchup - name = "Ketchup" - id = "ketchup" - result = "ketchup" - required_reagents = list("tomatojuice" = 2, "water" = 1, "sugar" = 1) - result_amount = 4 +/datum/chemical_reaction/ketchup + name = "Ketchup" + id = "ketchup" + result = "ketchup" + required_reagents = list("tomatojuice" = 2, "water" = 1, "sugar" = 1) + result_amount = 4 /////////////////////////////////////////////////////////////////////////////////// // foam and foam precursor - surfactant - name = "Foam surfactant" - id = "foam surfactant" - result = "fluorosurfactant" - required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) - result_amount = 5 +/datum/chemical_reaction/surfactant + name = "Foam surfactant" + id = "foam surfactant" + result = "fluorosurfactant" + required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) + result_amount = 5 - foam - name = "Foam" - id = "foam" - result = null - required_reagents = list("fluorosurfactant" = 1, "water" = 1) - result_amount = 2 +/datum/chemical_reaction/foam + name = "Foam" + id = "foam" + result = null + required_reagents = list("fluorosurfactant" = 1, "water" = 1) + result_amount = 2 - on_reaction(var/datum/reagents/holder, var/created_volume) +/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) + + var/location = get_turf(holder.my_atom) + for(var/mob/M in viewers(5, location)) + M << "\red The solution violently bubbles!" + + location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "\red The solution spews out foam!" + + //world << "Holder volume is [holder.total_volume]" + //for(var/datum/reagent/R in holder.reagent_list) + // world << "[R.name] = [R.volume]" + + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 0) + s.start() + holder.clear_reagents() + return + +/datum/chemical_reaction/metalfoam + name = "Metal Foam" + id = "metalfoam" + result = null + required_reagents = list("aluminum" = 3, "foaming_agent" = 1, "pacid" = 1) + result_amount = 5 + +/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - M << "\red The solution violently bubbles!" + var/location = get_turf(holder.my_atom) - location = get_turf(holder.my_atom) + for(var/mob/M in viewers(5, location)) + M << "\red The solution spews out a metalic foam!" - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out foam!" + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 1) + s.start() + return - //world << "Holder volume is [holder.total_volume]" - //for(var/datum/reagent/R in holder.reagent_list) - // world << "[R.name] = [R.volume]" +/datum/chemical_reaction/ironfoam + name = "Iron Foam" + id = "ironlfoam" + result = null + required_reagents = list("iron" = 3, "foaming_agent" = 1, "pacid" = 1) + result_amount = 5 - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 0) - s.start() - holder.clear_reagents() - return - - metalfoam - name = "Metal Foam" - id = "metalfoam" - result = null - required_reagents = list("aluminum" = 3, "foaming_agent" = 1, "pacid" = 1) - result_amount = 5 - - on_reaction(var/datum/reagents/holder, var/created_volume) +/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) + var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out a metalic foam!" + for(var/mob/M in viewers(5, location)) + M << "\red The solution spews out a metalic foam!" - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 1) - s.start() - return - - ironfoam - name = "Iron Foam" - id = "ironlfoam" - result = null - required_reagents = list("iron" = 3, "foaming_agent" = 1, "pacid" = 1) - result_amount = 5 - - on_reaction(var/datum/reagents/holder, var/created_volume) - - - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out a metalic foam!" - - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 2) - s.start() - return + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 2) + s.start() + return - foaming_agent - name = "Foaming Agent" - id = "foaming_agent" - result = "foaming_agent" - required_reagents = list("lithium" = 1, "hydrogen" = 1) - result_amount = 1 +/datum/chemical_reaction/foaming_agent + name = "Foaming Agent" + id = "foaming_agent" + result = "foaming_agent" + required_reagents = list("lithium" = 1, "hydrogen" = 1) + result_amount = 1 - // Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game! - ammonia - name = "Ammonia" - id = "ammonia" - result = "ammonia" - required_reagents = list("hydrogen" = 3, "nitrogen" = 1) - result_amount = 3 +// Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game! +/datum/chemical_reaction/ammonia + name = "Ammonia" + id = "ammonia" + result = "ammonia" + required_reagents = list("hydrogen" = 3, "nitrogen" = 1) + result_amount = 3 - diethylamine - name = "Diethylamine" - id = "diethylamine" - result = "diethylamine" - required_reagents = list ("ammonia" = 1, "ethanol" = 1) - result_amount = 2 +/datum/chemical_reaction/diethylamine + name = "Diethylamine" + id = "diethylamine" + result = "diethylamine" + required_reagents = list ("ammonia" = 1, "ethanol" = 1) + result_amount = 2 - space_cleaner - name = "Space cleaner" - id = "cleaner" - result = "cleaner" - required_reagents = list("ammonia" = 1, "water" = 1) - result_amount = 2 +/datum/chemical_reaction/space_cleaner + name = "Space cleaner" + id = "cleaner" + result = "cleaner" + required_reagents = list("ammonia" = 1, "water" = 1) + result_amount = 2 - plantbgone - name = "Plant-B-Gone" - id = "plantbgone" - result = "plantbgone" - required_reagents = list("toxin" = 1, "water" = 4) - result_amount = 5 +/datum/chemical_reaction/plantbgone + name = "Plant-B-Gone" + id = "plantbgone" + result = "plantbgone" + required_reagents = list("toxin" = 1, "water" = 4) + result_amount = 5 /////////////////////////////////////OLD SLIME CORE REACTIONS /////////////////////////////// /* - slimepepper - name = "Slime Condensedcapaicin" - id = "m_condensedcapaicin" - result = "condensedcapsaicin" - required_reagents = list("sugar" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 1 - slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 1 - slimeglycerol - name = "Slime Glycerol" - id = "m_glycerol" - result = "glycerol" - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 1 +slimepepper + name = "Slime Condensedcapaicin" + id = "m_condensedcapaicin" + result = "condensedcapsaicin" + required_reagents = list("sugar" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 1 +slimefrost + name = "Slime Frost Oil" + id = "m_frostoil" + result = "frostoil" + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 1 +slimeglycerol + name = "Slime Glycerol" + id = "m_glycerol" + result = "glycerol" + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 1 - slime_explosion - name = "Slime Explosion" - id = "m_explosion" - result = null - required_reagents = list("blood" = 1) - result_amount = 2 - required_container = /obj/item/slime_core - required_other = 2 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), location, 0, 0) - e.start() +slime_explosion + name = "Slime Explosion" + id = "m_explosion" + result = null + required_reagents = list("blood" = 1) + result_amount = 2 + required_container = /obj/item/slime_core + required_other = 2 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/10, 1), location, 0, 0) + e.start() - holder.clear_reagents() - return - slimejam - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 2 - slimesynthi - name = "Slime Synthetic Flesh" - id = "m_flesh" - result = null - required_reagents = list("sugar" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 2 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location) - return + holder.clear_reagents() + return +slimejam + name = "Slime Jam" + id = "m_jam" + result = "slimejelly" + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 2 +slimesynthi + name = "Slime Synthetic Flesh" + id = "m_flesh" + result = null + required_reagents = list("sugar" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 2 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location) + return - slimeenzyme - name = "Slime Enzyme" - id = "m_enzyme" - result = "enzyme" - required_reagents = list("blood" = 1, "water" = 1) - result_amount = 2 - required_container = /obj/item/slime_core - required_other = 3 - slimeplasma - name = "Slime Plasma" - id = "m_plasma" - result = "plasma" - required_reagents = list("sugar" = 1, "blood" = 2) - result_amount = 2 - required_container = /obj/item/slime_core - required_other = 3 - slimevirus - name = "Slime Virus" - id = "m_virus" - result = null - required_reagents = list("sugar" = 1, "sacid" = 1) - result_amount = 2 - required_container = /obj/item/slime_core - required_other = 3 - on_reaction(var/datum/reagents/holder, var/created_volume) - holder.clear_reagents() +slimeenzyme + name = "Slime Enzyme" + id = "m_enzyme" + result = "enzyme" + required_reagents = list("blood" = 1, "water" = 1) + result_amount = 2 + required_container = /obj/item/slime_core + required_other = 3 +slimeplasma + name = "Slime Plasma" + id = "m_plasma" + result = "plasma" + required_reagents = list("sugar" = 1, "blood" = 2) + result_amount = 2 + required_container = /obj/item/slime_core + required_other = 3 +slimevirus + name = "Slime Virus" + id = "m_virus" + result = null + required_reagents = list("sugar" = 1, "sacid" = 1) + result_amount = 2 + required_container = /obj/item/slime_core + required_other = 3 + on_reaction(var/datum/reagents/holder, var/created_volume) + holder.clear_reagents() - var/virus = pick(/datum/disease/advance/flu, /datum/disease/advance/cold, \ - /datum/disease/pierrot_throat, /datum/disease/fake_gbs, \ - /datum/disease/brainrot, /datum/disease/magnitis) + var/virus = pick(/datum/disease/advance/flu, /datum/disease/advance/cold, \ + /datum/disease/pierrot_throat, /datum/disease/fake_gbs, \ + /datum/disease/brainrot, /datum/disease/magnitis) - var/datum/disease/F = new virus(0) - var/list/data = list("viruses"= list(F)) - holder.add_reagent("blood", 20, data) + var/datum/disease/F = new virus(0) + var/list/data = list("viruses"= list(F)) + holder.add_reagent("blood", 20, data) - holder.add_reagent("cyanide", rand(1,10)) + holder.add_reagent("cyanide", rand(1,10)) - return + return - slimeteleport - name = "Slime Teleport" - id = "m_tele" - result = null - required_reagents = list("pacid" = 2, "mutagen" = 2) - required_catalysts = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 4 - on_reaction(var/datum/reagents/holder, var/created_volume) +slimeteleport + name = "Slime Teleport" + id = "m_tele" + result = null + required_reagents = list("pacid" = 2, "mutagen" = 2) + required_catalysts = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 4 + on_reaction(var/datum/reagents/holder, var/created_volume) - // Calculate new position (searches through beacons in world) - var/obj/item/device/radio/beacon/chosen - var/list/possible = list() - for(var/obj/item/device/radio/beacon/W in world) - possible += W + // Calculate new position (searches through beacons in world) + var/obj/item/device/radio/beacon/chosen + var/list/possible = list() + for(var/obj/item/device/radio/beacon/W in world) + possible += W - if(possible.len > 0) - chosen = pick(possible) + if(possible.len > 0) + chosen = pick(possible) - if(chosen) - // Calculate previous position for transition + if(chosen) + // Calculate previous position for transition - var/turf/FROM = get_turf(holder.my_atom) // the turf of origin we're travelling FROM - var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO + var/turf/FROM = get_turf(holder.my_atom) // the turf of origin we're travelling FROM + var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO - playsound(TO, 'sound/effects/phasein.ogg', 100, 1) + playsound(TO, 'sound/effects/phasein.ogg', 100, 1) - var/list/flashers = list() - for(var/mob/living/carbon/human/M in viewers(TO, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) - flashers += M + var/list/flashers = list() + for(var/mob/living/carbon/human/M in viewers(TO, null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + flashers += M - var/y_distance = TO.y - FROM.y - var/x_distance = TO.x - FROM.x - for (var/atom/movable/A in range(2, FROM )) // iterate thru list of mobs in the area - if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid - if( A.anchored && !istype(A, /mob/dead/observer) ) continue // don't teleport anchored things (computers, tables, windows, grilles, etc) because this causes problems! - // do teleport ghosts however because hell why not + var/y_distance = TO.y - FROM.y + var/x_distance = TO.x - FROM.x + for (var/atom/movable/A in range(2, FROM )) // iterate thru list of mobs in the area + if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid + if( A.anchored && !istype(A, /mob/dead/observer) ) continue // don't teleport anchored things (computers, tables, windows, grilles, etc) because this causes problems! + // do teleport ghosts however because hell why not - var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place - if(!A.Move(newloc)) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving - A.loc = locate(A.x + x_distance, A.y + y_distance, TO.z) + var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place + if(!A.Move(newloc)) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving + A.loc = locate(A.x + x_distance, A.y + y_distance, TO.z) - spawn() - if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect - var/mob/M = A - if(M.client) - var/obj/blueeffect = new /obj(src) - blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" - blueeffect.icon = 'icons/effects/effects.dmi' - blueeffect.icon_state = "shieldsparkles" - blueeffect.layer = 17 - blueeffect.mouse_opacity = 0 - M.client.screen += blueeffect - sleep(20) - M.client.screen -= blueeffect - del(blueeffect) - slimecrit - name = "Slime Crit" - id = "m_tele" - result = null - required_reagents = list("sacid" = 1, "blood" = 1) - required_catalysts = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 4 - on_reaction(var/datum/reagents/holder, var/created_volume) + spawn() + if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect + var/mob/M = A + if(M.client) + var/obj/blueeffect = new /obj(src) + blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" + blueeffect.icon = 'icons/effects/effects.dmi' + blueeffect.icon_state = "shieldsparkles" + blueeffect.layer = 17 + blueeffect.mouse_opacity = 0 + M.client.screen += blueeffect + sleep(20) + M.client.screen -= blueeffect + qdel(blueeffect) +slimecrit + name = "Slime Crit" + id = "m_tele" + result = null + required_reagents = list("sacid" = 1, "blood" = 1) + required_catalysts = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 4 + on_reaction(var/datum/reagents/holder, var/created_volume) - var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/russian/ranged, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/clown - )//exclusion list for things you don't want the reaction to create. - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + var/blocked = list(/mob/living/simple_animal/hostile, + /mob/living/simple_animal/hostile/pirate, + /mob/living/simple_animal/hostile/pirate/ranged, + /mob/living/simple_animal/hostile/russian, + /mob/living/simple_animal/hostile/russian/ranged, + /mob/living/simple_animal/hostile/syndicate, + /mob/living/simple_animal/hostile/syndicate/melee, + /mob/living/simple_animal/hostile/syndicate/melee/space, + /mob/living/simple_animal/hostile/syndicate/ranged, + /mob/living/simple_animal/hostile/syndicate/ranged/space, + /mob/living/simple_animal/hostile/alien/queen/large, + /mob/living/simple_animal/clown + )//exclusion list for things you don't want the reaction to create. + var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) - for(var/i = 1, i <= created_volume, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) - slimebork - name = "Slime Bork" - id = "m_tele" - result = null - required_reagents = list("sugar" = 1, "water" = 1) - result_amount = 2 - required_container = /obj/item/slime_core - required_other = 4 - on_reaction(var/datum/reagents/holder, var/created_volume) + for(var/i = 1, i <= created_volume, i++) + var/chosen = pick(critters) + var/mob/living/simple_animal/hostile/C = new chosen + C.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) +slimebork + name = "Slime Bork" + id = "m_tele" + result = null + required_reagents = list("sugar" = 1, "water" = 1) + result_amount = 2 + required_container = /obj/item/slime_core + required_other = 4 + on_reaction(var/datum/reagents/holder, var/created_volume) - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks - // BORK BORK BORK + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks + // BORK BORK BORK - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) - for(var/i = 1, i <= created_volume + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) + for(var/i = 1, i <= created_volume + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) - slimechloral - name = "Slime Chloral" - id = "m_bunch" - result = "chloralhydrate" - required_reagents = list("blood" = 1, "water" = 2) - result_amount = 2 - required_container = /obj/item/slime_core - required_other = 5 - slimeretro - name = "Slime Retro" - id = "m_xeno" - result = null - required_reagents = list("sugar" = 1) - result_amount = 1 - required_container = /obj/item/slime_core - required_other = 5 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/disease/F = new /datum/disease/dna_retrovirus(0) - var/list/data = list("viruses"= list(F)) - holder.add_reagent("blood", 20, data) - slimefoam - name = "Slime Foam" - id = "m_foam" - result = null - required_reagents = list("sacid" = 1) - result_amount = 2 - required_container = /obj/item/slime_core - required_other = 5 +slimechloral + name = "Slime Chloral" + id = "m_bunch" + result = "chloralhydrate" + required_reagents = list("blood" = 1, "water" = 2) + result_amount = 2 + required_container = /obj/item/slime_core + required_other = 5 +slimeretro + name = "Slime Retro" + id = "m_xeno" + result = null + required_reagents = list("sugar" = 1) + result_amount = 1 + required_container = /obj/item/slime_core + required_other = 5 + on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/disease/F = new /datum/disease/dna_retrovirus(0) + var/list/data = list("viruses"= list(F)) + holder.add_reagent("blood", 20, data) +slimefoam + name = "Slime Foam" + id = "m_foam" + result = null + required_reagents = list("sacid" = 1) + result_amount = 2 + required_container = /obj/item/slime_core + required_other = 5 - on_reaction(var/datum/reagents/holder, var/created_volume) + on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - M << "\red The solution violently bubbles!" + var/location = get_turf(holder.my_atom) + for(var/mob/M in viewers(5, location)) + M << "\red The solution violently bubbles!" - location = get_turf(holder.my_atom) + location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out foam!" + for(var/mob/M in viewers(5, location)) + M << "\red The solution spews out foam!" - //world << "Holder volume is [holder.total_volume]" - //for(var/datum/reagent/R in holder.reagent_list) - // world << "[R.name] = [R.volume]" + //world << "Holder volume is [holder.total_volume]" + //for(var/datum/reagent/R in holder.reagent_list) + // world << "[R.name] = [R.volume]" - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder, 0) - s.start() - holder.clear_reagents() - return + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 0) + s.start() + holder.clear_reagents() + return */ /////////////////////////////////////////////NEW SLIME CORE REACTIONS///////////////////////////////////////////// //Grey - slimespawn - name = "Slime Spawn" - id = "m_spawn" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red Infused with phoron, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) - var/mob/living/carbon/slime/S = new /mob/living/carbon/slime - S.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimespawn + name = "Slime Spawn" + id = "m_spawn" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + +/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red Infused with phoron, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) + var/mob/living/carbon/slime/S = new /mob/living/carbon/slime + S.loc = get_turf(holder.my_atom) - slimemonkey - name = "Slime Monkey" - id = "m_monkey" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/i = 1, i <= 3, i++) - var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube - M.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimemonkey + name = "Slime Monkey" + id = "m_monkey" + result = null + required_reagents = list("blood" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + +/datum/chemical_reaction/slimemonkey/on_reaction(var/datum/reagents/holder) + for(var/i = 1, i <= 3, i++) + var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube + M.loc = get_turf(holder.my_atom) //Green - slimemutate - name = "Mutation Toxin" - id = "mutationtoxin" - result = "mutationtoxin" - required_reagents = list("phoron" = 5) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/green +/datum/chemical_reaction/slimemutate + name = "Mutation Toxin" + id = "mutationtoxin" + result = "mutationtoxin" + required_reagents = list("phoron" = 5) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/green //Metal - slimemetal - name = "Slime Metal" - id = "m_metal" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/metal - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal - M.amount = 15 - M.loc = get_turf(holder.my_atom) - var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel - P.amount = 5 - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimemetal + name = "Slime Metal" + id = "m_metal" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/metal + required_other = 1 + +/datum/chemical_reaction/slimemetal/on_reaction(var/datum/reagents/holder) + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal + M.amount = 15 + M.loc = get_turf(holder.my_atom) + var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel + P.amount = 5 + P.loc = get_turf(holder.my_atom) //Gold - slimecrit - name = "Slime Crit" - id = "m_tele" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 - on_reaction(var/datum/reagents/holder) +/datum/chemical_reaction/slimecrit + name = "Slime Crit" + id = "m_tele" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 - /*var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/russian/ranged, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/faithless, - /mob/living/simple_animal/hostile/panther, - /mob/living/simple_animal/hostile/snake, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/clown - )//exclusion list for things you don't want the reaction to create. - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs +/datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + /*var/blocked = list(/mob/living/simple_animal/hostile, + /mob/living/simple_animal/hostile/pirate, + /mob/living/simple_animal/hostile/pirate/ranged, + /mob/living/simple_animal/hostile/russian, + /mob/living/simple_animal/hostile/russian/ranged, + /mob/living/simple_animal/hostile/syndicate, + /mob/living/simple_animal/hostile/syndicate/melee, + /mob/living/simple_animal/hostile/syndicate/melee/space, + /mob/living/simple_animal/hostile/syndicate/ranged, + /mob/living/simple_animal/hostile/syndicate/ranged/space, + /mob/living/simple_animal/hostile/alien/queen/large, + /mob/living/simple_animal/hostile/faithless, + /mob/living/simple_animal/hostile/panther, + /mob/living/simple_animal/hostile/snake, + /mob/living/simple_animal/hostile/retaliate, + /mob/living/simple_animal/hostile/retaliate/clown + )//exclusion list for things you don't want the reaction to create. + var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/i = 1, i <= 5, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction = "slimesummon" - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST))*/ - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime core fizzles disappointingly,"), 1) + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + + for(var/i = 1, i <= 5, i++) + var/chosen = pick(critters) + var/mob/living/simple_animal/hostile/C = new chosen + C.faction = "slimesummon" + C.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(C, pick(NORTH,SOUTH,EAST,WEST))*/ + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The slime core fizzles disappointingly,"), 1) //Silver - slimebork - name = "Slime Bork" - id = "m_tele2" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 - on_reaction(var/datum/reagents/holder) +/datum/chemical_reaction/slimebork + name = "Slime Bork" + id = "m_tele2" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks - // BORK BORK BORK +/datum/chemical_reaction/slimebork/on_reaction(var/datum/reagents/holder) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks + // BORK BORK BORK - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) //Blue - slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("phoron" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/blue - required_other = 1 +/datum/chemical_reaction/slimefrost + name = "Slime Frost Oil" + id = "m_frostoil" + result = "frostoil" + required_reagents = list("phoron" = 5) + result_amount = 10 + required_container = /obj/item/slime_extract/blue + required_other = 1 //Dark Blue - slimefreeze - name = "Slime Freeze" - id = "m_freeze" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/darkblue - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 140 - M << "\blue You feel a chill!" +/datum/chemical_reaction/slimefreeze + name = "Slime Freeze" + id = "m_freeze" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/darkblue + required_other = 1 + +/datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + sleep(50) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) + M.bodytemperature -= 140 + M << "\blue You feel a chill!" //Orange - slimecasp - name = "Slime Capsaicin Oil" - id = "m_capsaicinoil" - result = "capsaicin" - required_reagents = list("blood" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/orange - required_other = 1 +/datum/chemical_reaction/slimecasp + name = "Slime Capsaicin Oil" + id = "m_capsaicinoil" + result = "capsaicin" + required_reagents = list("blood" = 5) + result_amount = 10 + required_container = /obj/item/slime_extract/orange + required_other = 1 - slimefire - name = "Slime fire" - id = "m_fire" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/orange - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - var/turf/location = get_turf(holder.my_atom.loc) - for(var/turf/simulated/floor/target_tile in range(0,location)) - target_tile.assume_gas("phoron", 25, 1400) - spawn (0) target_tile.hotspot_expose(700, 400) +/datum/chemical_reaction/slimefire + name = "Slime fire" + id = "m_fire" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/orange + required_other = 1 + +/datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + sleep(50) + var/turf/location = get_turf(holder.my_atom.loc) + for(var/turf/simulated/floor/target_tile in range(0,location)) + target_tile.assume_gas("phoron", 25, 1400) + spawn (0) target_tile.hotspot_expose(700, 400) //Yellow - slimeoverload - name = "Slime EMP" - id = "m_emp" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - empulse(get_turf(holder.my_atom), 3, 7) +/datum/chemical_reaction/slimeoverload + name = "Slime EMP" + id = "m_emp" + result = null + required_reagents = list("blood" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeoverload/on_reaction(var/datum/reagents/holder, var/created_volume) + empulse(get_turf(holder.my_atom), 3, 7) - slimecell - name = "Slime Powercell" - id = "m_cell" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/obj/item/weapon/cell/slime/P = new /obj/item/weapon/cell/slime - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimecell + name = "Slime Powercell" + id = "m_cell" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 - slimeglow - name = "Slime Glow" - id = "m_glow" - result = null - required_reagents = list("water" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The contents of the slime core harden and begin to emit a warm, bright light."), 1) - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume) + var/obj/item/weapon/cell/slime/P = new /obj/item/weapon/cell/slime + P.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimeglow + name = "Slime Glow" + id = "m_glow" + result = null + required_reagents = list("water" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The contents of the slime core harden and begin to emit a warm, bright light."), 1) + var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime + F.loc = get_turf(holder.my_atom) //Purple - slimepsteroid - name = "Slime Steroid" - id = "m_steroid" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/purple - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimepsteroid + name = "Slime Steroid" + id = "m_steroid" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/purple + required_other = 1 + +/datum/chemical_reaction/slimepsteroid/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid + P.loc = get_turf(holder.my_atom) - slimejam - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("sugar" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/purple - required_other = 1 +/datum/chemical_reaction/slimejam + name = "Slime Jam" + id = "m_jam" + result = "slimejelly" + required_reagents = list("sugar" = 5) + result_amount = 10 + required_container = /obj/item/slime_extract/purple + required_other = 1 //Dark Purple - slimeplasma - name = "Slime Plasma" - id = "m_plasma" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/darkpurple - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/mineral/phoron/P = new /obj/item/stack/sheet/mineral/phoron - P.amount = 10 - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimeplasma + name = "Slime Plasma" + id = "m_plasma" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/darkpurple + required_other = 1 + +/datum/chemical_reaction/slimeplasma/on_reaction(var/datum/reagents/holder) + var/obj/item/stack/sheet/mineral/phoron/P = new /obj/item/stack/sheet/mineral/phoron + P.amount = 10 + P.loc = get_turf(holder.my_atom) //Red - slimeglycerol - name = "Slime Glycerol" - id = "m_glycerol" - result = "glycerol" - required_reagents = list("phoron" = 5) - result_amount = 8 - required_container = /obj/item/slime_extract/red - required_other = 1 +/datum/chemical_reaction/slimeglycerol + name = "Slime Glycerol" + id = "m_glycerol" + result = "glycerol" + required_reagents = list("phoron" = 5) + result_amount = 8 + required_container = /obj/item/slime_extract/red + required_other = 1 - slimebloodlust - name = "Bloodlust" - id = "m_bloodlust" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/red - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) - slime.rabid = 1 - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The [slime] is driven into a frenzy!"), 1) +/datum/chemical_reaction/slimebloodlust + name = "Bloodlust" + id = "m_bloodlust" + result = null + required_reagents = list("blood" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 + +/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder) + for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) + slime.rabid = 1 + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The [slime] is driven into a frenzy!"), 1) //Pink - slimeppotion - name = "Slime Potion" - id = "m_potion" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/pink - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimeppotion + name = "Slime Potion" + id = "m_potion" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/pink + required_other = 1 + +/datum/chemical_reaction/slimeppotion/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion + P.loc = get_turf(holder.my_atom) //Black - slimemutate2 - name = "Advanced Mutation Toxin" - id = "mutationtoxin2" - result = "amutationtoxin" - required_reagents = list("phoron" = 5) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/black +/datum/chemical_reaction/slimemutate2 + name = "Advanced Mutation Toxin" + id = "mutationtoxin2" + result = "amutationtoxin" + required_reagents = list("phoron" = 5) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/black //Oil - slimeexplosion - name = "Slime Explosion" - id = "m_explosion" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/oil - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - explosion(get_turf(holder.my_atom), 1 ,3, 6) +/datum/chemical_reaction/slimeexplosion + name = "Slime Explosion" + id = "m_explosion" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/oil + required_other = 1 + +/datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder) + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) + sleep(50) + explosion(get_turf(holder.my_atom), 1 ,3, 6) //Light Pink - slimepotion2 - name = "Slime Potion 2" - id = "m_potion2" - result = null - result_amount = 1 - required_container = /obj/item/slime_extract/lightpink - required_reagents = list("phoron" = 5) - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2 - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimepotion2 + name = "Slime Potion 2" + id = "m_potion2" + result = null + result_amount = 1 + required_container = /obj/item/slime_extract/lightpink + required_reagents = list("phoron" = 5) + required_other = 1 + +/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2 + P.loc = get_turf(holder.my_atom) //Adamantine - slimegolem - name = "Slime Golem" - id = "m_golem" - result = null - required_reagents = list("phoron" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/adamantine - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/effect/golemrune/Z = new /obj/effect/golemrune - Z.loc = get_turf(holder.my_atom) - Z.announce_to_ghosts() +/datum/chemical_reaction/slimegolem + name = "Slime Golem" + id = "m_golem" + result = null + required_reagents = list("phoron" = 5) + result_amount = 1 + required_container = /obj/item/slime_extract/adamantine + required_other = 1 + +/datum/chemical_reaction/slimegolem/on_reaction(var/datum/reagents/holder) + var/obj/effect/golemrune/Z = new /obj/effect/golemrune + Z.loc = get_turf(holder.my_atom) + Z.announce_to_ghosts() //////////////////////////////////////////PAINT/////////////////////////////////////////// //Crayon dust -> paint - red_paint - name = "Red paint" - id = "red_paint" - result = "paint" - resultcolor = "#FE191A" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_red" = 1) - result_amount = 5 +/datum/chemical_reaction/red_paint + name = "Red paint" + id = "red_paint" + result = "paint" + resultcolor = "#FE191A" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_red" = 1) + result_amount = 5 - orange_paint - name = "Orange paint" - id = "orange_paint" - result = "paint" - resultcolor = "#FFBE4F" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_orange" = 1) - result_amount = 5 +/datum/chemical_reaction/orange_paint + name = "Orange paint" + id = "orange_paint" + result = "paint" + resultcolor = "#FFBE4F" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_orange" = 1) + result_amount = 5 - yellow_paint - name = "Yellow paint" - id = "yellow_paint" - result = "paint" - resultcolor = "#FDFE7D" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_yellow" = 1) - result_amount = 5 +/datum/chemical_reaction/yellow_paint + name = "Yellow paint" + id = "yellow_paint" + result = "paint" + resultcolor = "#FDFE7D" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_yellow" = 1) + result_amount = 5 - green_paint - name = "Green paint" - id = "green_paint" - result = "paint" - resultcolor = "#18A31A" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_green" = 1) - result_amount = 5 +/datum/chemical_reaction/green_paint + name = "Green paint" + id = "green_paint" + result = "paint" + resultcolor = "#18A31A" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_green" = 1) + result_amount = 5 - blue_paint - name = "Blue paint" - id = "blue_paint" - result = "paint" - resultcolor = "#247CFF" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_blue" = 1) - result_amount = 5 +/datum/chemical_reaction/blue_paint + name = "Blue paint" + id = "blue_paint" + result = "paint" + resultcolor = "#247CFF" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_blue" = 1) + result_amount = 5 - purple_paint - name = "Purple paint" - id = "purple_paint" - result = "paint" - resultcolor = "#CC0099" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_purple" = 1) - result_amount = 5 +/datum/chemical_reaction/purple_paint + name = "Purple paint" + id = "purple_paint" + result = "paint" + resultcolor = "#CC0099" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_purple" = 1) + result_amount = 5 - grey_paint //mime - name = "Grey paint" - id = "grey_paint" - result = "paint" - resultcolor = "#808080" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_grey" = 1) - result_amount = 5 +/datum/chemical_reaction/grey_paint //mime + name = "Grey paint" + id = "grey_paint" + result = "paint" + resultcolor = "#808080" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_grey" = 1) + result_amount = 5 - brown_paint - name = "Brown paint" - id = "brown_paint" - result = "paint" - resultcolor = "#846F35" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_brown" = 1) - result_amount = 5 +/datum/chemical_reaction/brown_paint + name = "Brown paint" + id = "brown_paint" + result = "paint" + resultcolor = "#846F35" + required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_brown" = 1) + result_amount = 5 //Ghetto reactions /* Ideally the paint should take on the blood's colour (for each of the species) - but I could not think of a way. - RKF +but I could not think of a way. - RKF - blood_paint - name = "Blood paint" - id = "blood_paint" - result = "paint" - resultcolor = "#C80000" - required_reagents = list("plasticide" = 1, "water" = 3, "blood" = 2) - result_amount = 5 +blood_paint + name = "Blood paint" + id = "blood_paint" + result = "paint" + resultcolor = "#C80000" + required_reagents = list("plasticide" = 1, "water" = 3, "blood" = 2) + result_amount = 5 */ - milk_paint - name = "Milk paint" - id = "milk_paint" - result = "paint" - resultcolor = "#F0F8FF" - required_reagents = list("plasticide" = 1, "water" = 3, "milk" = 5) - result_amount = 5 +/datum/chemical_reaction/milk_paint + name = "Milk paint" + id = "milk_paint" + result = "paint" + resultcolor = "#F0F8FF" + required_reagents = list("plasticide" = 1, "water" = 3, "milk" = 5) + result_amount = 5 - orange_juice_paint - name = "Orange juice paint" - id = "orange_juice_paint" - result = "paint" - resultcolor = "#E78108" - required_reagents = list("plasticide" = 1, "water" = 3, "orangejuice" = 5) - result_amount = 5 +/datum/chemical_reaction/orange_juice_paint + name = "Orange juice paint" + id = "orange_juice_paint" + result = "paint" + resultcolor = "#E78108" + required_reagents = list("plasticide" = 1, "water" = 3, "orangejuice" = 5) + result_amount = 5 - tomato_juice_paint - name = "Tomato juice paint" - id = "tomato_juice_paint" - result = "paint" - resultcolor = "#731008" - required_reagents = list("plasticide" = 1, "water" = 3, "tomatojuice" = 5) - result_amount = 5 +/datum/chemical_reaction/tomato_juice_paint + name = "Tomato juice paint" + id = "tomato_juice_paint" + result = "paint" + resultcolor = "#731008" + required_reagents = list("plasticide" = 1, "water" = 3, "tomatojuice" = 5) + result_amount = 5 - lime_juice_paint - name = "Lime juice paint" - id = "lime_juice_paint" - result = "paint" - resultcolor = "#365E30" - required_reagents = list("plasticide" = 1, "water" = 3, "limejuice" = 5) - result_amount = 5 +/datum/chemical_reaction/lime_juice_paint + name = "Lime juice paint" + id = "lime_juice_paint" + result = "paint" + resultcolor = "#365E30" + required_reagents = list("plasticide" = 1, "water" = 3, "limejuice" = 5) + result_amount = 5 - carrot_juice_paint - name = "Carrot juice paint" - id = "carrot_juice_paint" - result = "paint" - resultcolor = "#973800" - required_reagents = list("plasticide" = 1, "water" = 3, "carrotjuice" = 5) - result_amount = 5 +/datum/chemical_reaction/carrot_juice_paint + name = "Carrot juice paint" + id = "carrot_juice_paint" + result = "paint" + resultcolor = "#973800" + required_reagents = list("plasticide" = 1, "water" = 3, "carrotjuice" = 5) + result_amount = 5 - berry_juice_paint - name = "Berry juice paint" - id = "berry_juice_paint" - result = "paint" - resultcolor = "#990066" - required_reagents = list("plasticide" = 1, "water" = 3, "berryjuice" = 5) - result_amount = 5 +/datum/chemical_reaction/berry_juice_paint + name = "Berry juice paint" + id = "berry_juice_paint" + result = "paint" + resultcolor = "#990066" + required_reagents = list("plasticide" = 1, "water" = 3, "berryjuice" = 5) + result_amount = 5 - grape_juice_paint - name = "Grape juice paint" - id = "grape_juice_paint" - result = "paint" - resultcolor = "#863333" - required_reagents = list("plasticide" = 1, "water" = 3, "grapejuice" = 5) - result_amount = 5 +/datum/chemical_reaction/grape_juice_paint + name = "Grape juice paint" + id = "grape_juice_paint" + result = "paint" + resultcolor = "#863333" + required_reagents = list("plasticide" = 1, "water" = 3, "grapejuice" = 5) + result_amount = 5 - poisonberry_juice_paint - name = "Poison berry juice paint" - id = "poisonberry_juice_paint" - result = "paint" - resultcolor = "#863353" - required_reagents = list("plasticide" = 1, "water" = 3, "poisonberryjuice" = 5) - result_amount = 5 +/datum/chemical_reaction/poisonberry_juice_paint + name = "Poison berry juice paint" + id = "poisonberry_juice_paint" + result = "paint" + resultcolor = "#863353" + required_reagents = list("plasticide" = 1, "water" = 3, "poisonberryjuice" = 5) + result_amount = 5 - watermelon_juice_paint - name = "Watermelon juice paint" - id = "watermelon_juice_paint" - result = "paint" - resultcolor = "#B83333" - required_reagents = list("plasticide" = 1, "water" = 3, "watermelonjuice" = 5) - result_amount = 5 +/datum/chemical_reaction/watermelon_juice_paint + name = "Watermelon juice paint" + id = "watermelon_juice_paint" + result = "paint" + resultcolor = "#B83333" + required_reagents = list("plasticide" = 1, "water" = 3, "watermelonjuice" = 5) + result_amount = 5 - lemon_juice_paint - name = "Lemon juice paint" - id = "lemon_juice_paint" - result = "paint" - resultcolor = "#AFAF00" - required_reagents = list("plasticide" = 1, "water" = 3, "lemonjuice" = 5) - result_amount = 5 +/datum/chemical_reaction/lemon_juice_paint + name = "Lemon juice paint" + id = "lemon_juice_paint" + result = "paint" + resultcolor = "#AFAF00" + required_reagents = list("plasticide" = 1, "water" = 3, "lemonjuice" = 5) + result_amount = 5 - banana_juice_paint - name = "Banana juice paint" - id = "banana_juice_paint" - result = "paint" - resultcolor = "#C3AF00" - required_reagents = list("plasticide" = 1, "water" = 3, "banana" = 5) - result_amount = 5 +/datum/chemical_reaction/banana_juice_paint + name = "Banana juice paint" + id = "banana_juice_paint" + result = "paint" + resultcolor = "#C3AF00" + required_reagents = list("plasticide" = 1, "water" = 3, "banana" = 5) + result_amount = 5 - potato_juice_paint - name = "Potato juice paint" - id = "potato_juice_paint" - result = "paint" - resultcolor = "#302000" - required_reagents = list("plasticide" = 1, "water" = 3, "potatojuice" = 5) - result_amount = 5 +/datum/chemical_reaction/potato_juice_paint + name = "Potato juice paint" + id = "potato_juice_paint" + result = "paint" + resultcolor = "#302000" + required_reagents = list("plasticide" = 1, "water" = 3, "potatojuice" = 5) + result_amount = 5 //Other paint - carbon_paint - name = "Carbon paint" - id = "carbon_paint" - result = "paint" - resultcolor = "#333333" - required_reagents = list("plasticide" = 1, "water" = 3, "carbon" = 1) - result_amount = 5 +/datum/chemical_reaction/carbon_paint + name = "Carbon paint" + id = "carbon_paint" + result = "paint" + resultcolor = "#333333" + required_reagents = list("plasticide" = 1, "water" = 3, "carbon" = 1) + result_amount = 5 - aluminum_paint - name = "Aluminum paint" - id = "aluminum_paint" - result = "paint" - resultcolor = "#F0F8FF" - required_reagents = list("plasticide" = 1, "water" = 3, "aluminum" = 1) - result_amount = 5 +/datum/chemical_reaction/aluminum_paint + name = "Aluminum paint" + id = "aluminum_paint" + result = "paint" + resultcolor = "#F0F8FF" + required_reagents = list("plasticide" = 1, "water" = 3, "aluminum" = 1) + result_amount = 5 //////////////////////////////////////////FOOD MIXTURES//////////////////////////////////// - tofu - name = "Tofu" - id = "tofu" - result = null - required_reagents = list("soymilk" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - for(var/i = 1, i <= created_volume, i++) - new /obj/item/weapon/reagent_containers/food/snacks/tofu(location) - return +/datum/chemical_reaction/tofu + name = "Tofu" + id = "tofu" + result = null + required_reagents = list("soymilk" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 1 - chocolate_bar - name = "Chocolate Bar" - id = "chocolate_bar" - result = null - required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - for(var/i = 1, i <= created_volume, i++) - new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location) - return +/datum/chemical_reaction/tofu/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/weapon/reagent_containers/food/snacks/tofu(location) + return - chocolate_bar2 - name = "Chocolate Bar" - id = "chocolate_bar" - result = null - required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - for(var/i = 1, i <= created_volume, i++) - new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location) - return +/datum/chemical_reaction/chocolate_bar + name = "Chocolate Bar" + id = "chocolate_bar" + result = null + required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2) + result_amount = 1 - hot_coco - name = "Hot Coco" - id = "hot_coco" - result = "hot_coco" - required_reagents = list("water" = 5, "coco" = 1) - result_amount = 5 +/datum/chemical_reaction/chocolate_bar/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location) + return - soysauce - name = "Soy Sauce" - id = "soysauce" - result = "soysauce" - required_reagents = list("soymilk" = 4, "sacid" = 1) - result_amount = 5 +/datum/chemical_reaction/chocolate_bar2 + name = "Chocolate Bar" + id = "chocolate_bar" + result = null + required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2) + result_amount = 1 - cheesewheel - name = "Cheesewheel" - id = "cheesewheel" - result = null - required_reagents = list("milk" = 40) - required_catalysts = list("enzyme" = 5) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location) - return +/datum/chemical_reaction/chocolate_bar2/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location) + return - meatball - name = "Meatball" - id = "meatball" - result = null - required_reagents = list("protein" = 3, "flour" = 5) - result_amount = 3 - on_reaction(var/datum/reagents/holder, var/created_volume) - new /obj/item/weapon/reagent_containers/food/snacks/meatball(get_turf(holder.my_atom)) - return +/datum/chemical_reaction/hot_coco + name = "Hot Coco" + id = "hot_coco" + result = "hot_coco" + required_reagents = list("water" = 5, "coco" = 1) + result_amount = 5 - dough - name = "Dough" - id = "dough" - result = null - required_reagents = list("egg" = 3, "flour" = 10) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - new /obj/item/weapon/reagent_containers/food/snacks/dough(get_turf(holder.my_atom)) - return +/datum/chemical_reaction/soysauce + name = "Soy Sauce" + id = "soysauce" + result = "soysauce" + required_reagents = list("soymilk" = 4, "sacid" = 1) + result_amount = 5 - syntiflesh - name = "Syntiflesh" - id = "syntiflesh" - result = null - required_reagents = list("blood" = 5, "clonexadone" = 1) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location) - return +/datum/chemical_reaction/cheesewheel + name = "Cheesewheel" + id = "cheesewheel" + result = null + required_reagents = list("milk" = 40) + required_catalysts = list("enzyme" = 5) + result_amount = 1 - hot_ramen - name = "Hot Ramen" - id = "hot_ramen" - result = "hot_ramen" - required_reagents = list("water" = 1, "dry_ramen" = 3) - result_amount = 3 +/datum/chemical_reaction/cheesewheel/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location) + return - hell_ramen - name = "Hell Ramen" - id = "hell_ramen" - result = "hell_ramen" - required_reagents = list("capsaicin" = 1, "hot_ramen" = 6) - result_amount = 6 +/datum/chemical_reaction/meatball + name = "Meatball" + id = "meatball" + result = null + required_reagents = list("protein" = 3, "flour" = 5) + result_amount = 3 + +/datum/chemical_reaction/meatball/on_reaction(var/datum/reagents/holder, var/created_volume) + new /obj/item/weapon/reagent_containers/food/snacks/meatball(get_turf(holder.my_atom)) + return + +/datum/chemical_reaction/dough + name = "Dough" + id = "dough" + result = null + required_reagents = list("egg" = 3, "flour" = 10) + result_amount = 1 + +/datum/chemical_reaction/dough/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/T = get_turf(holder.my_atom) + for(var/i = 1 to created_volume) + new /obj/item/weapon/reagent_containers/food/snacks/dough(T) + return + +/datum/chemical_reaction/syntiflesh + name = "Syntiflesh" + id = "syntiflesh" + result = null + required_reagents = list("blood" = 5, "clonexadone" = 1) + result_amount = 1 + +/datum/chemical_reaction/syntiflesh/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/T = get_turf(holder.my_atom) + for(var/i = 1 to created_volume) + new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(T) + return + +/datum/chemical_reaction/hot_ramen + name = "Hot Ramen" + id = "hot_ramen" + result = "hot_ramen" + required_reagents = list("water" = 1, "dry_ramen" = 3) + result_amount = 3 + +/datum/chemical_reaction/hell_ramen + name = "Hell Ramen" + id = "hell_ramen" + result = "hell_ramen" + required_reagents = list("capsaicin" = 1, "hot_ramen" = 6) + result_amount = 6 ////////////////////////////////////////// COCKTAILS ////////////////////////////////////// - goldschlager - name = "Goldschlager" - id = "goldschlager" - result = "goldschlager" - required_reagents = list("vodka" = 10, "gold" = 1) - result_amount = 10 +/datum/chemical_reaction/goldschlager + name = "Goldschlager" + id = "goldschlager" + result = "goldschlager" + required_reagents = list("vodka" = 10, "gold" = 1) + result_amount = 10 - patron - name = "Patron" - id = "patron" - result = "patron" - required_reagents = list("tequilla" = 10, "silver" = 1) - result_amount = 10 +/datum/chemical_reaction/patron + name = "Patron" + id = "patron" + result = "patron" + required_reagents = list("tequilla" = 10, "silver" = 1) + result_amount = 10 - bilk - name = "Bilk" - id = "bilk" - result = "bilk" - required_reagents = list("milk" = 1, "beer" = 1) - result_amount = 2 +/datum/chemical_reaction/bilk + name = "Bilk" + id = "bilk" + result = "bilk" + required_reagents = list("milk" = 1, "beer" = 1) + result_amount = 2 - icetea - name = "Iced Tea" - id = "icetea" - result = "icetea" - required_reagents = list("ice" = 1, "tea" = 3) - result_amount = 4 +/datum/chemical_reaction/icetea + name = "Iced Tea" + id = "icetea" + result = "icetea" + required_reagents = list("ice" = 1, "tea" = 3) + result_amount = 4 - icecoffee - name = "Iced Coffee" - id = "icecoffee" - result = "icecoffee" - required_reagents = list("ice" = 1, "coffee" = 3) - result_amount = 4 +/datum/chemical_reaction/icecoffee + name = "Iced Coffee" + id = "icecoffee" + result = "icecoffee" + required_reagents = list("ice" = 1, "coffee" = 3) + result_amount = 4 - nuka_cola - name = "Nuka Cola" - id = "nuka_cola" - result = "nuka_cola" - required_reagents = list("uranium" = 1, "cola" = 6) - result_amount = 6 +/datum/chemical_reaction/nuka_cola + name = "Nuka Cola" + id = "nuka_cola" + result = "nuka_cola" + required_reagents = list("uranium" = 1, "cola" = 6) + result_amount = 6 - moonshine - name = "Moonshine" - id = "moonshine" - result = "moonshine" - required_reagents = list("nutriment" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/moonshine + name = "Moonshine" + id = "moonshine" + result = "moonshine" + required_reagents = list("nutriment" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - grenadine - name = "Grenadine Syrup" - id = "grenadine" - result = "grenadine" - required_reagents = list("berryjuice" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/grenadine + name = "Grenadine Syrup" + id = "grenadine" + result = "grenadine" + required_reagents = list("berryjuice" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - wine - name = "Wine" - id = "wine" - result = "wine" - required_reagents = list("grapejuice" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/wine + name = "Wine" + id = "wine" + result = "wine" + required_reagents = list("grapejuice" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - pwine - name = "Poison Wine" - id = "pwine" - result = "pwine" - required_reagents = list("poisonberryjuice" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/pwine + name = "Poison Wine" + id = "pwine" + result = "pwine" + required_reagents = list("poisonberryjuice" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - melonliquor - name = "Melon Liquor" - id = "melonliquor" - result = "melonliquor" - required_reagents = list("watermelonjuice" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/melonliquor + name = "Melon Liquor" + id = "melonliquor" + result = "melonliquor" + required_reagents = list("watermelonjuice" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - bluecuracao - name = "Blue Curacao" - id = "bluecuracao" - result = "bluecuracao" - required_reagents = list("orangejuice" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/bluecuracao + name = "Blue Curacao" + id = "bluecuracao" + result = "bluecuracao" + required_reagents = list("orangejuice" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - spacebeer - name = "Space Beer" - id = "spacebeer" - result = "beer" - required_reagents = list("cornoil" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/spacebeer + name = "Space Beer" + id = "spacebeer" + result = "beer" + required_reagents = list("cornoil" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - vodka - name = "Vodka" - id = "vodka" - result = "vodka" - required_reagents = list("potato" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 - sake - name = "Sake" - id = "sake" - result = "sake" - required_reagents = list("rice" = 10) - required_catalysts = list("enzyme" = 5) - result_amount = 10 +/datum/chemical_reaction/vodka + name = "Vodka" + id = "vodka" + result = "vodka" + required_reagents = list("potato" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 +/datum/chemical_reaction/sake + name = "Sake" + id = "sake" + result = "sake" + required_reagents = list("rice" = 10) + required_catalysts = list("enzyme" = 5) + result_amount = 10 - kahlua - name = "Kahlua" - id = "kahlua" - result = "kahlua" - required_reagents = list("coffee" = 5, "sugar" = 5) - required_catalysts = list("enzyme" = 5) - result_amount = 5 +/datum/chemical_reaction/kahlua + name = "Kahlua" + id = "kahlua" + result = "kahlua" + required_reagents = list("coffee" = 5, "sugar" = 5) + required_catalysts = list("enzyme" = 5) + result_amount = 5 - gin_tonic - name = "Gin and Tonic" - id = "gintonic" - result = "gintonic" - required_reagents = list("gin" = 2, "tonic" = 1) - result_amount = 3 +/datum/chemical_reaction/gin_tonic + name = "Gin and Tonic" + id = "gintonic" + result = "gintonic" + required_reagents = list("gin" = 2, "tonic" = 1) + result_amount = 3 - cuba_libre - name = "Cuba Libre" - id = "cubalibre" - result = "cubalibre" - required_reagents = list("rum" = 2, "cola" = 1) - result_amount = 3 +/datum/chemical_reaction/cuba_libre + name = "Cuba Libre" + id = "cubalibre" + result = "cubalibre" + required_reagents = list("rum" = 2, "cola" = 1) + result_amount = 3 - martini - name = "Classic Martini" - id = "martini" - result = "martini" - required_reagents = list("gin" = 2, "vermouth" = 1) - result_amount = 3 +/datum/chemical_reaction/martini + name = "Classic Martini" + id = "martini" + result = "martini" + required_reagents = list("gin" = 2, "vermouth" = 1) + result_amount = 3 - vodkamartini - name = "Vodka Martini" - id = "vodkamartini" - result = "vodkamartini" - required_reagents = list("vodka" = 2, "vermouth" = 1) - result_amount = 3 +/datum/chemical_reaction/vodkamartini + name = "Vodka Martini" + id = "vodkamartini" + result = "vodkamartini" + required_reagents = list("vodka" = 2, "vermouth" = 1) + result_amount = 3 - white_russian - name = "White Russian" - id = "whiterussian" - result = "whiterussian" - required_reagents = list("blackrussian" = 3, "cream" = 2) - result_amount = 5 +/datum/chemical_reaction/white_russian + name = "White Russian" + id = "whiterussian" + result = "whiterussian" + required_reagents = list("blackrussian" = 3, "cream" = 2) + result_amount = 5 - whiskey_cola - name = "Whiskey Cola" - id = "whiskeycola" - result = "whiskeycola" - required_reagents = list("whiskey" = 2, "cola" = 1) - result_amount = 3 +/datum/chemical_reaction/whiskey_cola + name = "Whiskey Cola" + id = "whiskeycola" + result = "whiskeycola" + required_reagents = list("whiskey" = 2, "cola" = 1) + result_amount = 3 - screwdriver - name = "Screwdriver" - id = "screwdrivercocktail" - result = "screwdrivercocktail" - required_reagents = list("vodka" = 2, "orangejuice" = 1) - result_amount = 3 +/datum/chemical_reaction/screwdriver + name = "Screwdriver" + id = "screwdrivercocktail" + result = "screwdrivercocktail" + required_reagents = list("vodka" = 2, "orangejuice" = 1) + result_amount = 3 - bloody_mary - name = "Bloody Mary" - id = "bloodymary" - result = "bloodymary" - required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1) - result_amount = 4 +/datum/chemical_reaction/bloody_mary + name = "Bloody Mary" + id = "bloodymary" + result = "bloodymary" + required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1) + result_amount = 4 - gargle_blaster - name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" - result = "gargleblaster" - required_reagents = list("vodka" = 1, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1) - result_amount = 5 +/datum/chemical_reaction/gargle_blaster + name = "Pan-Galactic Gargle Blaster" + id = "gargleblaster" + result = "gargleblaster" + required_reagents = list("vodka" = 1, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1) + result_amount = 5 - brave_bull - name = "Brave Bull" - id = "bravebull" - result = "bravebull" - required_reagents = list("tequilla" = 2, "kahlua" = 1) - result_amount = 3 +/datum/chemical_reaction/brave_bull + name = "Brave Bull" + id = "bravebull" + result = "bravebull" + required_reagents = list("tequilla" = 2, "kahlua" = 1) + result_amount = 3 - tequilla_sunrise - name = "Tequilla Sunrise" - id = "tequillasunrise" - result = "tequillasunrise" - required_reagents = list("tequilla" = 2, "orangejuice" = 1) - result_amount = 3 +/datum/chemical_reaction/tequilla_sunrise + name = "Tequilla Sunrise" + id = "tequillasunrise" + result = "tequillasunrise" + required_reagents = list("tequilla" = 2, "orangejuice" = 1) + result_amount = 3 - phoron_special - name = "Toxins Special" - id = "phoronspecial" - result = "phoronspecial" - required_reagents = list("rum" = 2, "vermouth" = 1, "phoron" = 2) - result_amount = 5 +/datum/chemical_reaction/phoron_special + name = "Toxins Special" + id = "phoronspecial" + result = "phoronspecial" + required_reagents = list("rum" = 2, "vermouth" = 1, "phoron" = 2) + result_amount = 5 - beepsky_smash - name = "Beepksy Smash" - id = "beepksysmash" - result = "beepskysmash" - required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1) - result_amount = 4 +/datum/chemical_reaction/beepsky_smash + name = "Beepksy Smash" + id = "beepksysmash" + result = "beepskysmash" + required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1) + result_amount = 4 - doctor_delight - name = "The Doctor's Delight" - id = "doctordelight" - result = "doctorsdelight" - required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1, "tricordrazine" = 1) - result_amount = 5 +/datum/chemical_reaction/doctor_delight + name = "The Doctor's Delight" + id = "doctordelight" + result = "doctorsdelight" + required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1, "tricordrazine" = 1) + result_amount = 5 - irish_cream - name = "Irish Cream" - id = "irishcream" - result = "irishcream" - required_reagents = list("whiskey" = 2, "cream" = 1) - result_amount = 3 +/datum/chemical_reaction/irish_cream + name = "Irish Cream" + id = "irishcream" + result = "irishcream" + required_reagents = list("whiskey" = 2, "cream" = 1) + result_amount = 3 - manly_dorf - name = "The Manly Dorf" - id = "manlydorf" - result = "manlydorf" - required_reagents = list ("beer" = 1, "ale" = 2) - result_amount = 3 +/datum/chemical_reaction/manly_dorf + name = "The Manly Dorf" + id = "manlydorf" + result = "manlydorf" + required_reagents = list ("beer" = 1, "ale" = 2) + result_amount = 3 - hooch - name = "Hooch" - id = "hooch" - result = "hooch" - required_reagents = list ("sugar" = 1, "ethanol" = 2, "fuel" = 1) - result_amount = 3 +/datum/chemical_reaction/hooch + name = "Hooch" + id = "hooch" + result = "hooch" + required_reagents = list ("sugar" = 1, "ethanol" = 2, "fuel" = 1) + result_amount = 3 - irish_coffee - name = "Irish Coffee" - id = "irishcoffee" - result = "irishcoffee" - required_reagents = list("irishcream" = 1, "coffee" = 1) - result_amount = 2 +/datum/chemical_reaction/irish_coffee + name = "Irish Coffee" + id = "irishcoffee" + result = "irishcoffee" + required_reagents = list("irishcream" = 1, "coffee" = 1) + result_amount = 2 - b52 - name = "B-52" - id = "b52" - result = "b52" - required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1) - result_amount = 3 +/datum/chemical_reaction/b52 + name = "B-52" + id = "b52" + result = "b52" + required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1) + result_amount = 3 - atomicbomb - name = "Atomic Bomb" - id = "atomicbomb" - result = "atomicbomb" - required_reagents = list("b52" = 10, "uranium" = 1) - result_amount = 10 +/datum/chemical_reaction/atomicbomb + name = "Atomic Bomb" + id = "atomicbomb" + result = "atomicbomb" + required_reagents = list("b52" = 10, "uranium" = 1) + result_amount = 10 - margarita - name = "Margarita" - id = "margarita" - result = "margarita" - required_reagents = list("tequilla" = 2, "limejuice" = 1) - result_amount = 3 +/datum/chemical_reaction/margarita + name = "Margarita" + id = "margarita" + result = "margarita" + required_reagents = list("tequilla" = 2, "limejuice" = 1) + result_amount = 3 - longislandicedtea - name = "Long Island Iced Tea" - id = "longislandicedtea" - result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) - result_amount = 4 +/datum/chemical_reaction/longislandicedtea + name = "Long Island Iced Tea" + id = "longislandicedtea" + result = "longislandicedtea" + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) + result_amount = 4 - icedtea - name = "Long Island Iced Tea" - id = "longislandicedtea" - result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) - result_amount = 4 +/datum/chemical_reaction/icedtea + name = "Long Island Iced Tea" + id = "longislandicedtea" + result = "longislandicedtea" + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) + result_amount = 4 - threemileisland - name = "Three Mile Island Iced Tea" - id = "threemileisland" - result = "threemileisland" - required_reagents = list("longislandicedtea" = 10, "uranium" = 1) - result_amount = 10 +/datum/chemical_reaction/threemileisland + name = "Three Mile Island Iced Tea" + id = "threemileisland" + result = "threemileisland" + required_reagents = list("longislandicedtea" = 10, "uranium" = 1) + result_amount = 10 - whiskeysoda - name = "Whiskey Soda" - id = "whiskeysoda" - result = "whiskeysoda" - required_reagents = list("whiskey" = 2, "sodawater" = 1) - result_amount = 3 +/datum/chemical_reaction/whiskeysoda + name = "Whiskey Soda" + id = "whiskeysoda" + result = "whiskeysoda" + required_reagents = list("whiskey" = 2, "sodawater" = 1) + result_amount = 3 - black_russian - name = "Black Russian" - id = "blackrussian" - result = "blackrussian" - required_reagents = list("vodka" = 3, "kahlua" = 2) - result_amount = 5 +/datum/chemical_reaction/black_russian + name = "Black Russian" + id = "blackrussian" + result = "blackrussian" + required_reagents = list("vodka" = 3, "kahlua" = 2) + result_amount = 5 - manhattan - name = "Manhattan" - id = "manhattan" - result = "manhattan" - required_reagents = list("whiskey" = 2, "vermouth" = 1) - result_amount = 3 +/datum/chemical_reaction/manhattan + name = "Manhattan" + id = "manhattan" + result = "manhattan" + required_reagents = list("whiskey" = 2, "vermouth" = 1) + result_amount = 3 - manhattan_proj - name = "Manhattan Project" - id = "manhattan_proj" - result = "manhattan_proj" - required_reagents = list("manhattan" = 10, "uranium" = 1) - result_amount = 10 +/datum/chemical_reaction/manhattan_proj + name = "Manhattan Project" + id = "manhattan_proj" + result = "manhattan_proj" + required_reagents = list("manhattan" = 10, "uranium" = 1) + result_amount = 10 - vodka_tonic - name = "Vodka and Tonic" - id = "vodkatonic" - result = "vodkatonic" - required_reagents = list("vodka" = 2, "tonic" = 1) - result_amount = 3 +/datum/chemical_reaction/vodka_tonic + name = "Vodka and Tonic" + id = "vodkatonic" + result = "vodkatonic" + required_reagents = list("vodka" = 2, "tonic" = 1) + result_amount = 3 - gin_fizz - name = "Gin Fizz" - id = "ginfizz" - result = "ginfizz" - required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1) - result_amount = 4 +/datum/chemical_reaction/gin_fizz + name = "Gin Fizz" + id = "ginfizz" + result = "ginfizz" + required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1) + result_amount = 4 - bahama_mama - name = "Bahama mama" - id = "bahama_mama" - result = "bahama_mama" - required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1) - result_amount = 6 +/datum/chemical_reaction/bahama_mama + name = "Bahama mama" + id = "bahama_mama" + result = "bahama_mama" + required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1) + result_amount = 6 - singulo - name = "Singulo" - id = "singulo" - result = "singulo" - required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5) - result_amount = 10 +/datum/chemical_reaction/singulo + name = "Singulo" + id = "singulo" + result = "singulo" + required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5) + result_amount = 10 - alliescocktail - name = "Allies Cocktail" - id = "alliescocktail" - result = "alliescocktail" - required_reagents = list("martini" = 1, "vodka" = 1) - result_amount = 2 +/datum/chemical_reaction/alliescocktail + name = "Allies Cocktail" + id = "alliescocktail" + result = "alliescocktail" + required_reagents = list("martini" = 1, "vodka" = 1) + result_amount = 2 - demonsblood - name = "Demons Blood" - id = "demonsblood" - result = "demonsblood" - required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) - result_amount = 4 +/datum/chemical_reaction/demonsblood + name = "Demons Blood" + id = "demonsblood" + result = "demonsblood" + required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) + result_amount = 4 - booger - name = "Booger" - id = "booger" - result = "booger" - required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) - result_amount = 4 +/datum/chemical_reaction/booger + name = "Booger" + id = "booger" + result = "booger" + required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) + result_amount = 4 - antifreeze - name = "Anti-freeze" - id = "antifreeze" - result = "antifreeze" - required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1) - result_amount = 4 +/datum/chemical_reaction/antifreeze + name = "Anti-freeze" + id = "antifreeze" + result = "antifreeze" + required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1) + result_amount = 4 - barefoot - name = "Barefoot" - id = "barefoot" - result = "barefoot" - required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1) - result_amount = 3 +/datum/chemical_reaction/barefoot + name = "Barefoot" + id = "barefoot" + result = "barefoot" + required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1) + result_amount = 3 - grapesoda - name = "Grape Soda" - id = "grapesoda" - result = "grapesoda" - required_reagents = list("grapejuice" = 2, "cola" = 1) - result_amount = 3 +/datum/chemical_reaction/grapesoda + name = "Grape Soda" + id = "grapesoda" + result = "grapesoda" + required_reagents = list("grapejuice" = 2, "cola" = 1) + result_amount = 3 ////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri///// - sbiten - name = "Sbiten" - id = "sbiten" - result = "sbiten" - required_reagents = list("vodka" = 10, "capsaicin" = 1) - result_amount = 10 +/datum/chemical_reaction/sbiten + name = "Sbiten" + id = "sbiten" + result = "sbiten" + required_reagents = list("vodka" = 10, "capsaicin" = 1) + result_amount = 10 - red_mead - name = "Red Mead" - id = "red_mead" - result = "red_mead" - required_reagents = list("blood" = 1, "mead" = 1) - result_amount = 2 +/datum/chemical_reaction/red_mead + name = "Red Mead" + id = "red_mead" + result = "red_mead" + required_reagents = list("blood" = 1, "mead" = 1) + result_amount = 2 - mead - name = "Mead" - id = "mead" - result = "mead" - required_reagents = list("sugar" = 1, "water" = 1) - required_catalysts = list("enzyme" = 5) - result_amount = 2 +/datum/chemical_reaction/mead + name = "Mead" + id = "mead" + result = "mead" + required_reagents = list("sugar" = 1, "water" = 1) + required_catalysts = list("enzyme" = 5) + result_amount = 2 - iced_beer - name = "Iced Beer" - id = "iced_beer" - result = "iced_beer" - required_reagents = list("beer" = 10, "frostoil" = 1) - result_amount = 10 +/datum/chemical_reaction/iced_beer + name = "Iced Beer" + id = "iced_beer" + result = "iced_beer" + required_reagents = list("beer" = 10, "frostoil" = 1) + result_amount = 10 - iced_beer2 - name = "Iced Beer" - id = "iced_beer" - result = "iced_beer" - required_reagents = list("beer" = 5, "ice" = 1) - result_amount = 6 +/datum/chemical_reaction/iced_beer2 + name = "Iced Beer" + id = "iced_beer" + result = "iced_beer" + required_reagents = list("beer" = 5, "ice" = 1) + result_amount = 6 - grog - name = "Grog" - id = "grog" - result = "grog" - required_reagents = list("rum" = 1, "water" = 1) - result_amount = 2 +/datum/chemical_reaction/grog + name = "Grog" + id = "grog" + result = "grog" + required_reagents = list("rum" = 1, "water" = 1) + result_amount = 2 - soy_latte - name = "Soy Latte" - id = "soy_latte" - result = "soy_latte" - required_reagents = list("coffee" = 1, "soymilk" = 1) - result_amount = 2 +/datum/chemical_reaction/soy_latte + name = "Soy Latte" + id = "soy_latte" + result = "soy_latte" + required_reagents = list("coffee" = 1, "soymilk" = 1) + result_amount = 2 - cafe_latte - name = "Cafe Latte" - id = "cafe_latte" - result = "cafe_latte" - required_reagents = list("coffee" = 1, "milk" = 1) - result_amount = 2 +/datum/chemical_reaction/cafe_latte + name = "Cafe Latte" + id = "cafe_latte" + result = "cafe_latte" + required_reagents = list("coffee" = 1, "milk" = 1) + result_amount = 2 - acidspit - name = "Acid Spit" - id = "acidspit" - result = "acidspit" - required_reagents = list("sacid" = 1, "wine" = 5) - result_amount = 6 +/datum/chemical_reaction/acidspit + name = "Acid Spit" + id = "acidspit" + result = "acidspit" + required_reagents = list("sacid" = 1, "wine" = 5) + result_amount = 6 - amasec - name = "Amasec" - id = "amasec" - result = "amasec" - required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5) - result_amount = 10 +/datum/chemical_reaction/amasec + name = "Amasec" + id = "amasec" + result = "amasec" + required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5) + result_amount = 10 - changelingsting - name = "Changeling Sting" - id = "changelingsting" - result = "changelingsting" - required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1) - result_amount = 5 +/datum/chemical_reaction/changelingsting + name = "Changeling Sting" + id = "changelingsting" + result = "changelingsting" + required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1) + result_amount = 5 - aloe - name = "Aloe" - id = "aloe" - result = "aloe" - required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1) - result_amount = 2 +/datum/chemical_reaction/aloe + name = "Aloe" + id = "aloe" + result = "aloe" + required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1) + result_amount = 2 - andalusia - name = "Andalusia" - id = "andalusia" - result = "andalusia" - required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1) - result_amount = 3 +/datum/chemical_reaction/andalusia + name = "Andalusia" + id = "andalusia" + result = "andalusia" + required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1) + result_amount = 3 - neurotoxin - name = "Neurotoxin" - id = "neurotoxin" - result = "neurotoxin" - required_reagents = list("gargleblaster" = 1, "stoxin" = 1) - result_amount = 2 +/datum/chemical_reaction/neurotoxin + name = "Neurotoxin" + id = "neurotoxin" + result = "neurotoxin" + required_reagents = list("gargleblaster" = 1, "stoxin" = 1) + result_amount = 2 - snowwhite - name = "Snow White" - id = "snowwhite" - result = "snowwhite" - required_reagents = list("beer" = 1, "lemon_lime" = 1) - result_amount = 2 +/datum/chemical_reaction/snowwhite + name = "Snow White" + id = "snowwhite" + result = "snowwhite" + required_reagents = list("beer" = 1, "lemon_lime" = 1) + result_amount = 2 - irishcarbomb - name = "Irish Car Bomb" - id = "irishcarbomb" - result = "irishcarbomb" - required_reagents = list("ale" = 1, "irishcream" = 1) - result_amount = 2 +/datum/chemical_reaction/irishcarbomb + name = "Irish Car Bomb" + id = "irishcarbomb" + result = "irishcarbomb" + required_reagents = list("ale" = 1, "irishcream" = 1) + result_amount = 2 - syndicatebomb - name = "Syndicate Bomb" - id = "syndicatebomb" - result = "syndicatebomb" - required_reagents = list("beer" = 1, "whiskeycola" = 1) - result_amount = 2 +/datum/chemical_reaction/syndicatebomb + name = "Syndicate Bomb" + id = "syndicatebomb" + result = "syndicatebomb" + required_reagents = list("beer" = 1, "whiskeycola" = 1) + result_amount = 2 - erikasurprise - name = "Erika Surprise" - id = "erikasurprise" - result = "erikasurprise" - required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) - result_amount = 5 +/datum/chemical_reaction/erikasurprise + name = "Erika Surprise" + id = "erikasurprise" + result = "erikasurprise" + required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) + result_amount = 5 - devilskiss - name = "Devils Kiss" - id = "devilskiss" - result = "devilskiss" - required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1) - result_amount = 3 +/datum/chemical_reaction/devilskiss + name = "Devils Kiss" + id = "devilskiss" + result = "devilskiss" + required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1) + result_amount = 3 - hippiesdelight - name = "Hippies Delight" - id = "hippiesdelight" - result = "hippiesdelight" - required_reagents = list("psilocybin" = 1, "gargleblaster" = 1) - result_amount = 2 +/datum/chemical_reaction/hippiesdelight + name = "Hippies Delight" + id = "hippiesdelight" + result = "hippiesdelight" + required_reagents = list("psilocybin" = 1, "gargleblaster" = 1) + result_amount = 2 - bananahonk - name = "Banana Honk" - id = "bananahonk" - result = "bananahonk" - required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) - result_amount = 3 +/datum/chemical_reaction/bananahonk + name = "Banana Honk" + id = "bananahonk" + result = "bananahonk" + required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1) + result_amount = 3 - silencer - name = "Silencer" - id = "silencer" - result = "silencer" - required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1) - result_amount = 3 +/datum/chemical_reaction/silencer + name = "Silencer" + id = "silencer" + result = "silencer" + required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1) + result_amount = 3 - driestmartini - name = "Driest Martini" - id = "driestmartini" - result = "driestmartini" - required_reagents = list("nothing" = 1, "gin" = 1) - result_amount = 2 +/datum/chemical_reaction/driestmartini + name = "Driest Martini" + id = "driestmartini" + result = "driestmartini" + required_reagents = list("nothing" = 1, "gin" = 1) + result_amount = 2 - lemonade - name = "Lemonade" - id = "lemonade" - result = "lemonade" - required_reagents = list("lemonjuice" = 1, "sugar" = 1, "water" = 1) - result_amount = 3 +/datum/chemical_reaction/lemonade + name = "Lemonade" + id = "lemonade" + result = "lemonade" + required_reagents = list("lemonjuice" = 1, "sugar" = 1, "water" = 1) + result_amount = 3 - kiraspecial - name = "Kira Special" - id = "kiraspecial" - result = "kiraspecial" - required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1) - result_amount = 2 +/datum/chemical_reaction/kiraspecial + name = "Kira Special" + id = "kiraspecial" + result = "kiraspecial" + required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1) + result_amount = 2 - brownstar - name = "Brown Star" - id = "brownstar" - result = "brownstar" - required_reagents = list("orangejuice" = 2, "cola" = 1) - result_amount = 2 +/datum/chemical_reaction/brownstar + name = "Brown Star" + id = "brownstar" + result = "brownstar" + required_reagents = list("orangejuice" = 2, "cola" = 1) + result_amount = 2 - milkshake - name = "Milkshake" - id = "milkshake" - result = "milkshake" - required_reagents = list("cream" = 1, "ice" = 2, "milk" = 2) - result_amount = 5 +/datum/chemical_reaction/milkshake + name = "Milkshake" + id = "milkshake" + result = "milkshake" + required_reagents = list("cream" = 1, "ice" = 2, "milk" = 2) + result_amount = 5 - rewriter - name = "Rewriter" - id = "rewriter" - result = "rewriter" - required_reagents = list("spacemountainwind" = 1, "coffee" = 1) - result_amount = 2 +/datum/chemical_reaction/rewriter + name = "Rewriter" + id = "rewriter" + result = "rewriter" + required_reagents = list("spacemountainwind" = 1, "coffee" = 1) + result_amount = 2 - suidream - name = "Sui Dream" - id = "suidream" - result = "suidream" - required_reagents = list("space_up" = 2, "bluecuracao" = 1, "melonliquor" = 1) - result_amount = 4 +/datum/chemical_reaction/suidream + name = "Sui Dream" + id = "suidream" + result = "suidream" + required_reagents = list("space_up" = 2, "bluecuracao" = 1, "melonliquor" = 1) + result_amount = 4 diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index d82ded7bba..e53d118898 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -31,7 +31,7 @@ processing_objects.Add(src) -/obj/item/weapon/reagent_containers/borghypo/Del() +/obj/item/weapon/reagent_containers/borghypo/Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 0129423f4f..15bb64089d 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -173,8 +173,7 @@ center_of_mass = list("x"=16, "y"=10) New() ..() - reagents.add_reagent("cola", 15) - reagents.add_reagent("orangejuice", 15) + reagents.add_reagent("brownstar", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/space_up name = "Space-Up" diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index f643ccca90..2b9cf560dc 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -83,7 +83,7 @@ user << "\blue You transfer [trans] units of the condiment to [target]." on_reagent_change() - if(icon_state == "saltshakersmall" || icon_state == "peppermillsmall") + if(icon_state == "saltshakersmall" || icon_state == "peppermillsmall" || icon_state == "flour") return if(reagents.reagent_list.len > 0) switch(reagents.get_master_reagent_id()) @@ -179,4 +179,16 @@ volume = 20 New() ..() - reagents.add_reagent("blackpepper", 20) \ No newline at end of file + reagents.add_reagent("blackpepper", 20) + +/obj/item/weapon/reagent_containers/food/condiment/flour + name = "flour sack" + desc = "A big bag of flour. Good for baking!" + icon = 'icons/obj/food.dmi' + icon_state = "flour" + item_state = "flour" + New() + ..() + reagents.add_reagent("flour", 30) + src.pixel_x = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index bc36317521..6be4fce8e4 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -30,7 +30,7 @@ user.put_in_active_hand(B) src.transfer_fingerprints_to(B) - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob) @@ -83,7 +83,7 @@ O.show_message(text("\blue The contents of the [src] splashes all over [target]!"), 1) src.reagents.reaction(target, TOUCH) - //Finally, smash the bottle. This kills (del) the bottle. + //Finally, smash the bottle. This kills (qdel) the bottle. src.smash(target, user) return diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index 0d8e614468..3be62c7d7c 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -3,7 +3,7 @@ if(istype(W,/obj/item/weapon/shard) || istype(W,/obj/item/weapon/reagent_containers/food/snacks)) var/obj/item/weapon/reagent_containers/food/snacks/csandwich/S = new(get_turf(src)) S.attackby(W,user) - del(src) + qdel(src) ..() /obj/item/weapon/reagent_containers/food/snacks/csandwich @@ -73,9 +73,9 @@ if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich" w_class = n_ceil(Clamp((ingredients.len/2),2,4)) -/obj/item/weapon/reagent_containers/food/snacks/csandwich/Del() +/obj/item/weapon/reagent_containers/food/snacks/csandwich/Destroy() for(var/obj/item/O in ingredients) - del(O) + qdel(O) ..() /obj/item/weapon/reagent_containers/food/snacks/csandwich/examine(mob/user) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 229b4b04e5..0256902878 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -27,7 +27,7 @@ usr.put_in_hands(TrashItem) else if(istype(trash,/obj/item)) usr.put_in_hands(trash) - del(src) + qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/attack_self(mob/user as mob) @@ -38,7 +38,7 @@ if(!reagents.total_volume) user << "None of [src] left!" user.drop_from_inventory(src) - del(src) + qdel(src) return 0 if(istype(M, /mob/living/carbon)) @@ -152,7 +152,7 @@ reagents.trans_to(U,min(reagents.total_volume,5)) if (reagents.total_volume <= 0) - del(src) + qdel(src) return if (is_sliceable()) @@ -187,13 +187,13 @@ for(var/i=1 to (slices_num-slices_lost)) var/obj/slice = new slice_path (src.loc) reagents.trans_to(slice,reagents_per_slice) - del(src) + qdel(src) return /obj/item/weapon/reagent_containers/food/snacks/proc/is_sliceable() return (slices_num && slice_path && slices_num > 0) -/obj/item/weapon/reagent_containers/food/snacks/Del() +/obj/item/weapon/reagent_containers/food/snacks/Destroy() if(contents) for(var/atom/movable/something in contents) something.loc = get_turf(src) @@ -212,7 +212,7 @@ spawn(5) if(!src && !user.client) user.custom_emote(1,"[pick("burps", "cries for more", "burps twice", "looks at the area where the food was")]") - del(src) + qdel(src) On_Consume(user) ////////////////////////////////////////////////// @@ -477,14 +477,14 @@ user << "You crack \the [src] into \the [O]." reagents.trans_to(O, reagents.total_volume) user.drop_from_inventory(src) - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) src.reagents.reaction(hit_atom, TOUCH) src.visible_message("\red [src.name] has been squashed.","\red You hear a smack.") - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype( W, /obj/item/toy/crayon )) @@ -497,41 +497,32 @@ usr << "\blue You color \the [src] [clr]" icon_state = "egg-[clr]" - item_color = clr else ..() /obj/item/weapon/reagent_containers/food/snacks/egg/blue icon_state = "egg-blue" - item_color = "blue" /obj/item/weapon/reagent_containers/food/snacks/egg/green icon_state = "egg-green" - item_color = "green" /obj/item/weapon/reagent_containers/food/snacks/egg/mime icon_state = "egg-mime" - item_color = "mime" /obj/item/weapon/reagent_containers/food/snacks/egg/orange icon_state = "egg-orange" - item_color = "orange" /obj/item/weapon/reagent_containers/food/snacks/egg/purple icon_state = "egg-purple" - item_color = "purple" /obj/item/weapon/reagent_containers/food/snacks/egg/rainbow icon_state = "egg-rainbow" - item_color = "rainbow" /obj/item/weapon/reagent_containers/food/snacks/egg/red icon_state = "egg-red" - item_color = "red" /obj/item/weapon/reagent_containers/food/snacks/egg/yellow icon_state = "egg-yellow" - item_color = "yellow" /obj/item/weapon/reagent_containers/food/snacks/friedegg name = "Fried egg" @@ -556,18 +547,6 @@ ..() reagents.add_reagent("protein", 2) -/obj/item/weapon/reagent_containers/food/snacks/flour - name = "flour sack" - desc = "A big bag of flour. Good for baking!" - icon = 'icons/obj/food.dmi' - icon_state = "flour" - item_state = "flour" - New() - ..() - reagents.add_reagent("flour", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - /obj/item/weapon/reagent_containers/food/snacks/organ name = "organ" desc = "It's good for you." @@ -936,7 +915,7 @@ ..() new/obj/effect/decal/cleanable/pie_smudge(src.loc) src.visible_message("\red [src.name] splats.","\red You hear a splat.") - del(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis name = "Berry Clafoutis" @@ -1600,7 +1579,7 @@ M << "\red \The [src] expands!" var/mob/living/carbon/human/H = new (src) H.set_species(monkey_type) - del(src) + qdel(src) proc/Unwrap(mob/user as mob) icon_state = "monkeycube" @@ -2842,7 +2821,7 @@ if(istype(W,/obj/item/weapon/kitchen/rollingpin)) new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(src) user << "You flatten the dough." - del(src) + qdel(src) // slicable into 3xdoughslices /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough @@ -2884,30 +2863,30 @@ if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/meatball)) new /obj/item/weapon/reagent_containers/food/snacks/monkeyburger(src) user << "You make a burger." - del(W) - del(src) + qdel(W) + qdel(src) // Bun + cutlet = hamburger else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/cutlet)) new /obj/item/weapon/reagent_containers/food/snacks/monkeyburger(src) user << "You make a burger." - del(W) - del(src) + qdel(W) + qdel(src) // Bun + sausage = hotdog else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/sausage)) new /obj/item/weapon/reagent_containers/food/snacks/hotdog(src) user << "You make a hotdog." - del(W) - del(src) + qdel(W) + qdel(src) // Burger + cheese wedge = cheeseburger /obj/item/weapon/reagent_containers/food/snacks/monkeyburger/attackby(obj/item/weapon/reagent_containers/food/snacks/cheesewedge/W as obj, mob/user as mob) if(istype(W))// && !istype(src,/obj/item/weapon/reagent_containers/food/snacks/cheesewedge)) new /obj/item/weapon/reagent_containers/food/snacks/cheeseburger(src) user << "You make a cheeseburger." - del(W) - del(src) + qdel(W) + qdel(src) return else ..() @@ -2917,8 +2896,8 @@ if(istype(W)) new /obj/item/weapon/reagent_containers/food/snacks/cheeseburger(src) user << "You make a cheeseburger." - del(W) - del(src) + qdel(W) + qdel(src) return else ..() @@ -2987,7 +2966,7 @@ if(istype(W,/obj/item/weapon/kitchen/utensil/knife)) new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(src) user << "You cut the potato." - del(src) + qdel(src) else ..() diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index d703a6acb7..797f605b08 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -15,7 +15,7 @@ new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) user << "You cut the meat into thin strips." - del(src) + qdel(src) else ..() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 12b56021d4..fba5d8ac39 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -28,7 +28,7 @@ /obj/machinery/atmospherics/unary/cryo_cell, /obj/machinery/dna_scannernew, /obj/item/weapon/grenade/chem_grenade, - /obj/machinery/bot/medbot, + /mob/living/bot/medbot, /obj/machinery/computer/pandemic, /obj/item/weapon/storage/secure/safe, /obj/machinery/iv_drip, @@ -195,7 +195,7 @@ if(80 to 90) filling.icon_state = "[icon_state]80" if(91 to INFINITY) filling.icon_state = "[icon_state]100" - filling.color = mix_color_from_reagents(reagents.reagent_list) + filling.color = reagents.get_color() overlays += filling if (!is_open_container()) @@ -270,10 +270,10 @@ attackby(var/obj/D, mob/user as mob) if(isprox(D)) user << "You add [D] to [src]." - del(D) + qdel(D) user.put_in_hands(new /obj/item/weapon/bucket_sensor) user.drop_from_inventory(src) - del(src) + qdel(src) update_icon() overlays.Cut() diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index ab01d11eaf..cbfea73a94 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -48,7 +48,7 @@ if(80 to 90) filling.icon_state = "[icon_state]-80" if(91 to INFINITY) filling.icon_state = "[icon_state]-100" - filling.color = mix_color_from_reagents(reagents.reagent_list) + filling.color = reagents.get_color() overlays += filling if (!is_open_container()) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 4d23bb30ed..d0f678ddd9 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -31,9 +31,9 @@ M.drop_from_inventory(src) //icon update if(reagents.total_volume) reagents.trans_to_ingest(M, reagents.total_volume) - del(src) + qdel(src) else - del(src) + qdel(src) return 1 else if(istype(M, /mob/living/carbon/human) ) @@ -58,9 +58,9 @@ if(reagents.total_volume) reagents.trans_to_ingest(M, reagents.total_volume) - del(src) + qdel(src) else - del(src) + qdel(src) return 1 @@ -83,7 +83,7 @@ O.show_message("\red [user] puts something in \the [target].", 1) spawn(5) - del(src) + qdel(src) return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 1a25162526..2e929c6d12 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -26,7 +26,7 @@ || istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart)) return - if(istype(A, /obj/effect/proc_holder/spell)) + if(istype(A, /spell)) return if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution @@ -67,16 +67,16 @@ var/obj/D = new/obj() D.create_reagents(amount_per_transfer_from_this) reagents.trans_to(D, amount_per_transfer_from_this) - D.icon += mix_color_from_reagents(D.reagents.reagent_list) + D.icon += D.reagents.get_color() spawn(0) D.reagents.reaction(A) sleep(5) - del(D) + qdel(D) else var/obj/effect/decal/chempuff/D = new/obj/effect/decal/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this) reagents.trans_to(D, amount_per_transfer_from_this, 1/spray_size) - D.icon += mix_color_from_reagents(D.reagents.reagent_list) + D.icon += D.reagents.get_color() var/turf/A_turf = get_turf(A)//BS12 @@ -93,7 +93,7 @@ D.reagents.reaction(A_turf) sleep(2) sleep(3) - del(D) + qdel(D) return @@ -204,7 +204,7 @@ D.create_reagents(amount_per_transfer_from_this) src.reagents.trans_to(D, amount_per_transfer_from_this) - D.icon += mix_color_from_reagents(D.reagents.reagent_list) + D.icon += D.reagents.get_color() Sprays[i] = D @@ -229,7 +229,7 @@ for(var/atom/t in get_turf(D)) D.reagents.reaction(t) sleep(2) - del(D) + qdel(D) return diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index a1c2fc4415..9b2eee7d65 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -222,7 +222,7 @@ filling.icon_state = "syringe[rounded_vol]" - filling.color = mix_color_from_reagents(reagents.reagent_list) + filling.color = reagents.get_color() overlays += filling @@ -251,7 +251,7 @@ for(var/mob/O in viewers(world.view, user)) O.show_message(text("\red [user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!"), 1) user.remove_from_mob(src) - del(src) + qdel(src) return for(var/mob/O in viewers(world.view, user)) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 0a42e8dee3..185f6b1342 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -44,17 +44,17 @@ ex_act(severity) switch(severity) if(1.0) - del(src) + qdel(src) return if(2.0) if (prob(50)) new /obj/effect/effect/water(src.loc) - del(src) + qdel(src) return if(3.0) if (prob(5)) new /obj/effect/effect/water(src.loc) - del(src) + qdel(src) return else return @@ -62,7 +62,7 @@ blob_act() if(prob(50)) new /obj/effect/effect/water(src.loc) - del(src) + qdel(src) @@ -168,7 +168,7 @@ else explosion(src.loc,-1,1,2) if(src) - del(src) + qdel(src) /obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) if(temperature > T0C+500) @@ -225,7 +225,7 @@ /obj/structure/reagent_dispensers/beerkeg/blob_act() explosion(src.loc,0,3,5,7,10) - del(src) + qdel(src) /obj/structure/reagent_dispensers/virusfood name = "Virus Food Dispenser" diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 8b26dd3133..d95921bb2c 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -288,7 +288,7 @@ src.transfer_fingerprints_to(P) P.set_dir(dir) - del(src) + qdel(src) return else user << "You need more welding fuel to complete this task." diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index e1a5407d0a..ead3ba3d91 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -43,6 +43,11 @@ air_contents.volume = PRESSURE_TANK_VOLUME update() +/obj/machinery/disposal/Destroy() + eject() + if(trunk) + trunk.linked = null + ..() // attack by item places it in to disposal /obj/machinery/disposal/attackby(var/obj/item/I, var/mob/user) @@ -83,7 +88,7 @@ C.anchored = 1 C.density = 1 C.update() - del(src) + qdel(src) return else user << "You need more welding fuel to complete this task." @@ -115,7 +120,7 @@ GM.loc = src for (var/mob/C in viewers(src)) C.show_message("\red [GM.name] has been placed in the [src] by [user].", 3) - del(G) + qdel(G) usr.attack_log += text("\[[time_stamp()]\] Has placed [GM.name] ([GM.ckey]) in disposals.") GM.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [usr.name] ([usr.ckey])") msg_admin_attack("[usr] ([usr.ckey]) placed [GM] ([GM.ckey]) in a disposals unit. (JMP)") @@ -452,7 +457,7 @@ AM.throw_at(target, 5, 1) H.vent_gas(loc) - del(H) + qdel(H) /obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if (istype(mover,/obj/item) && mover.throwing) @@ -600,7 +605,7 @@ if(other.has_fat_guy) has_fat_guy = 1 - del(other) + qdel(other) proc/settag(var/new_tag) @@ -638,6 +643,11 @@ location.assume_air(gas) // vent all gas to turf return +/obj/structure/disposalholder/Destroy() + qdel(gas) + active = 0 + ..() + // Disposal pipes /obj/structure/disposalpipe @@ -663,7 +673,7 @@ // pipe is deleted // ensure if holder is present, it is expelled - Del() + Destroy() var/obj/structure/disposalholder/H = locate() in src if(H) // holder was present @@ -676,7 +686,7 @@ for(var/atom/movable/AM in H) AM.loc = T AM.pipe_eject(0) - del(H) + qdel(H) ..() return @@ -773,7 +783,7 @@ if(AM) AM.throw_at(target, 100, 1) H.vent_gas(T) - del(H) + qdel(H) else // no specified direction, so throw in random direction @@ -789,7 +799,7 @@ AM.throw_at(target, 5, 1) H.vent_gas(T) // all gas vent to turf - del(H) + qdel(H) return @@ -817,7 +827,7 @@ for(var/atom/movable/AM in H) AM.loc = T AM.pipe_eject(0) - del(H) + qdel(H) return // otherwise, do normal expel from turf @@ -825,7 +835,7 @@ expel(H, T, 0) spawn(2) // delete pipe after 2 ticks to ensure expel proc finished - del(src) + qdel(src) // pipe affected by explosion @@ -918,7 +928,31 @@ C.anchored = 1 C.update() - del(src) + qdel(src) + +// pipe is deleted +// ensure if holder is present, it is expelled +/obj/structure/disposalpipe/Destroy() + var/obj/structure/disposalholder/H = locate() in src + if(H) + // holder was present + H.active = 0 + var/turf/T = src.loc + if(T.density) + // deleting pipe is inside a dense turf (wall) + // this is unlikely, but just dump out everything into the turf in case + + for(var/atom/movable/AM in H) + AM.loc = T + AM.pipe_eject(0) + qdel(H) + ..() + return + + // otherwise, do normal expel from turf + if(H) + expel(H, T, 0) + ..() // *** TEST verb //client/verb/dispstop() @@ -1386,7 +1420,7 @@ welded() // var/obj/item/scrap/S = new(src.loc) // S.set_components(200,0,0) - del(src) + qdel(src) // the disposal outlet machine @@ -1429,7 +1463,7 @@ spawn(5) AM.throw_at(target, 3, 1) H.vent_gas(src.loc) - del(H) + qdel(H) return @@ -1462,14 +1496,12 @@ C.update() C.anchored = 1 C.density = 1 - del(src) + qdel(src) return else user << "You need more welding fuel to complete this task." return - - // called when movable is expelled from a disposal pipe or outlet // by default does nothing, override for special behaviour diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 7a7622dd77..eb76325832 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -15,13 +15,15 @@ var/tag_x attack_hand(mob/user as mob) + unwrap() + + proc/unwrap() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.loc = (get_turf(src.loc)) if(istype(wrapped, /obj/structure/closet)) var/obj/structure/closet/O = wrapped O.welded = 0 - del(src) - return + qdel(src) attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/device/destTagger)) @@ -127,7 +129,7 @@ else wrapped.loc = get_turf(src) - del(src) + qdel(src) return attackby(obj/item/W as obj, mob/user as mob) @@ -297,7 +299,7 @@ user << "\blue The object you are trying to wrap is unsuitable for the sorting machinery!" if (src.amount <= 0) new /obj/item/weapon/c_tube( src.loc ) - del(src) + qdel(src) return return @@ -307,6 +309,16 @@ return +/obj/structure/bigDelivery/Destroy() + if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 + wrapped.loc = (get_turf(loc)) + if(istype(wrapped, /obj/structure/closet)) + var/obj/structure/closet/O = wrapped + O.welded = 0 + var/turf/T = get_turf(src) + for(var/atom/movable/AM in contents) + AM.loc = T + ..() /obj/item/device/destTagger name = "destination tagger" @@ -435,8 +447,13 @@ C.update() C.anchored = 1 C.density = 1 - del(src) + qdel(src) return else user << "You need more welding fuel to complete this task." return + +/obj/machinery/disposal/deliveryChute/Destroy() + if(trunk) + trunk.linked = null + ..() diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index a16e5653a9..aacdbbb345 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -54,10 +54,10 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). /obj/machinery/r_n_d/circuit_imprinter/blob_act() if(prob(50)) - del(src) + qdel(src) /obj/machinery/r_n_d/circuit_imprinter/meteorhit() - del(src) + qdel(src) return /obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials() @@ -104,46 +104,51 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). return 1 if(O.is_open_container()) return 0 - if(!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond) && !istype(O, /obj/item/stack/sheet/mineral/uranium)) - user << "You cannot insert this item into \the [src]!" - return 1 +// if(!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond) && !istype(O, /obj/item/stack/sheet/mineral/uranium)) +// user << "You cannot insert this item into \the [src]!" +// return 1 if(stat) return 1 if(busy) user << "\The [src] is busy. Please wait for completion of previous operation." return 1 - var/obj/item/stack/sheet/stack = O - if((TotalMaterials() + stack.perunit) > max_material_amount) - user << "\The [src] is full. Please remove glass from \the [src] in order to insert more." - return 1 - var/amount = round(input("How many sheets do you want to add?") as num) - if(amount < 0) - amount = 0 - if(amount == 0) - return - if(amount > stack.amount) - amount = min(stack.amount, round((max_material_amount - TotalMaterials()) / stack.perunit)) + if(istype(O, /obj/item/stack/sheet/glass) || istype(O, /obj/item/stack/sheet/mineral/gold) || istype(O, /obj/item/stack/sheet/mineral/diamond) || istype(O, /obj/item/stack/sheet/mineral/uranium)) - busy = 1 - use_power(max(1000, (3750 * amount / 10))) - var/stacktype = stack.type - stack.use(amount) - if(do_after(usr, 16)) - user << "You add [amount] sheets to \the [src]." - switch(stacktype) - if(/obj/item/stack/sheet/glass) - g_amount += amount * 3750 - if(/obj/item/stack/sheet/mineral/gold) - gold_amount += amount * 2000 - if(/obj/item/stack/sheet/mineral/diamond) - diamond_amount += amount * 2000 - if(/obj/item/stack/sheet/mineral/uranium) - uranium_amount += amount * 2000 - else - new stacktype(loc, amount) - busy = 0 - updateUsrDialog() + var/obj/item/stack/sheet/stack = O + if((TotalMaterials() + stack.perunit) > max_material_amount) + user << "\The [src] is full. Please remove glass from \the [src] in order to insert more." + return 1 + + var/amount = round(input("How many sheets do you want to add?") as num) + if(amount < 0) + amount = 0 + if(amount == 0) + return + if(amount > stack.amount) + amount = min(stack.amount, round((max_material_amount - TotalMaterials()) / stack.perunit)) + + busy = 1 + use_power(max(1000, (3750 * amount / 10))) + var/stacktype = stack.type + stack.use(amount) + if(do_after(usr, 16)) + user << "You add [amount] sheets to \the [src]." + switch(stacktype) + if(/obj/item/stack/sheet/glass) + g_amount += amount * 3750 + if(/obj/item/stack/sheet/mineral/gold) + gold_amount += amount * 2000 + if(/obj/item/stack/sheet/mineral/diamond) + diamond_amount += amount * 2000 + if(/obj/item/stack/sheet/mineral/uranium) + uranium_amount += amount * 2000 + else + new stacktype(loc, amount) + busy = 0 + updateUsrDialog() + + ..() //This is to stop these machines being hackable via clicking. /obj/machinery/r_n_d/circuit_imprinter/attack_hand(mob/user as mob) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 86eb5cce55..9d0d547f94 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -485,6 +485,12 @@ datum/design/circuit/tcom/receiver req_tech = list("programming" = 4, "engineering" = 3, "bluespace" = 2) build_path = /obj/item/weapon/circuitboard/telecomms/receiver +datum/design/circuit/tcom/bluespacerelay + name = "emergency bluespace relay" + id = "bluespace-relay" + req_tech = list("programming" = 4, "bluespace" = 4) + build_path = /obj/item/weapon/circuitboard/bluespacerelay + /////////////////////////////////// ////////////Mecha Modules////////// /////////////////////////////////// diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 7b7445f099..b8d0fca209 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -13,7 +13,7 @@ Note: Must be placed within 3 tiles of the R&D Console var/obj/item/weapon/loaded_item = null var/decon_mod = 1 var/min_reliability = 90 - + use_power = 1 idle_power_usage = 30 active_power_usage = 2500 @@ -35,15 +35,9 @@ Note: Must be placed within 3 tiles of the R&D Console min_reliability = 93 - T /obj/machinery/r_n_d/destructive_analyzer/meteorhit() - del(src) + qdel(src) return -/obj/machinery/r_n_d/destructive_analyzer/proc/ConvertReqString2List(var/list/source_list) - var/list/temp_list = params2list(source_list) - for(var/O in temp_list) - temp_list[O] = text2num(temp_list[O]) - return temp_list - /obj/machinery/r_n_d/destructive_analyzer/update_icon() if(panel_open) icon_state = "d_analyzer_t" diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index b0cc8d6050..aa1e1a52e4 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -75,7 +75,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() ..() return -/obj/machinery/message_server/Del() +/obj/machinery/message_server/Destroy() message_servers -= src ..() return @@ -122,7 +122,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() istype(O,/obj/item/weapon/circuitboard/message_monitor)) spamfilter_limit += round(MESSAGE_SERVER_DEFAULT_SPAM_LIMIT / 2) user.drop_item() - del(O) + qdel(O) user << "You install additional memory and processors into message server. Its filtering capabilities been enhanced." else ..(O, user) @@ -221,14 +221,14 @@ var/obj/machinery/blackbox_recorder/blackbox var/list/datum/feedback_variable/feedback = new() - //Only one can exsist in the world! + //Only one can exist in the world! /obj/machinery/blackbox_recorder/New() if(blackbox) if(istype(blackbox,/obj/machinery/blackbox_recorder)) - del(src) + qdel(src) blackbox = src -/obj/machinery/blackbox_recorder/Del() +/obj/machinery/blackbox_recorder/Destroy() var/turf/T = locate(1,1,2) if(T) blackbox = null diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 22df4b82dd..06f3f7b760 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -116,9 +116,6 @@ Note: Must be placed west/left of and R&D console to function. if(busy) user << "\The [src] is busy. Please wait for completion of previous operation." return 1 - if(!istype(O, /obj/item/stack/sheet)) - user << "You cannot insert this item into \the [src]!" - return 1 if(stat) return 1 if(istype(O,/obj/item/stack/sheet)) @@ -127,51 +124,52 @@ Note: Must be placed west/left of and R&D console to function. user << "\The [src]'s material bin is full. Please remove material before adding more." return 1 - var/obj/item/stack/sheet/stack = O - var/amount = round(input("How many sheets do you want to add?") as num)//No decimals - if(!O) - return - if(amount < 0)//No negative numbers - amount = 0 - if(amount == 0) - return - if(amount > stack.get_amount()) - amount = stack.get_amount() - if(max_material_storage - TotalMaterials() < (amount * stack.perunit))//Can't overfill - amount = min(stack.amount, round((max_material_storage - TotalMaterials()) / stack.perunit)) + var/obj/item/stack/sheet/stack = O + var/amount = round(input("How many sheets do you want to add?") as num)//No decimals + if(!O) + return + if(amount < 0)//No negative numbers + amount = 0 + if(amount == 0) + return + if(amount > stack.get_amount()) + amount = stack.get_amount() + if(max_material_storage - TotalMaterials() < (amount * stack.perunit))//Can't overfill + amount = min(stack.amount, round((max_material_storage - TotalMaterials()) / stack.perunit)) - overlays += "protolathe_[stack.name]" - sleep(10) - overlays -= "protolathe_[stack.name]" + overlays += "protolathe_[stack.name]" + sleep(10) + overlays -= "protolathe_[stack.name]" - icon_state = "protolathe" - busy = 1 - use_power(max(1000, (3750 * amount / 10))) - var/stacktype = stack.type - stack.use(amount) - if(do_after(user, 16)) - user << "You add [amount] sheets to \the [src]." icon_state = "protolathe" - switch(stacktype) - if(/obj/item/stack/sheet/metal) - m_amount += amount * 3750 - if(/obj/item/stack/sheet/glass) - g_amount += amount * 3750 - if(/obj/item/stack/sheet/mineral/gold) - gold_amount += amount * 2000 - if(/obj/item/stack/sheet/mineral/silver) - silver_amount += amount * 2000 - if(/obj/item/stack/sheet/mineral/phoron) - phoron_amount += amount * 2000 - if(/obj/item/stack/sheet/mineral/uranium) - uranium_amount += amount * 2000 - if(/obj/item/stack/sheet/mineral/diamond) - diamond_amount += amount * 2000 - else - new stacktype(loc, amount) - busy = 0 - updateUsrDialog() - return + busy = 1 + use_power(max(1000, (3750 * amount / 10))) + var/stacktype = stack.type + stack.use(amount) + if(do_after(user, 16)) + user << "You add [amount] sheets to \the [src]." + icon_state = "protolathe" + switch(stacktype) + if(/obj/item/stack/sheet/metal) + m_amount += amount * 3750 + if(/obj/item/stack/sheet/glass) + g_amount += amount * 3750 + if(/obj/item/stack/sheet/mineral/gold) + gold_amount += amount * 2000 + if(/obj/item/stack/sheet/mineral/silver) + silver_amount += amount * 2000 + if(/obj/item/stack/sheet/mineral/phoron) + phoron_amount += amount * 2000 + if(/obj/item/stack/sheet/mineral/uranium) + uranium_amount += amount * 2000 + if(/obj/item/stack/sheet/mineral/diamond) + diamond_amount += amount * 2000 + else + new stacktype(loc, amount) + busy = 0 + updateUsrDialog() + return + ..() //This is to stop these machines being hackable via clicking. /obj/machinery/r_n_d/protolathe/attack_hand(mob/user as mob) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 1ad86378b0..6f47ca5bb2 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -54,7 +54,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, check_tech = new T() if(check_tech.id == ID) return_name = check_tech.name - del(check_tech) + qdel(check_tech) check_tech = null break @@ -86,7 +86,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, temp_reagent = new R() if(temp_reagent.id == ID) return_name = temp_reagent.name - del(temp_reagent) + qdel(temp_reagent) temp_reagent = null break return return_name @@ -256,7 +256,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, screen = 1.0 return if(linked_destroy.loaded_item.reliability >= linked_destroy.min_reliability) - var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) + var/list/temp_tech = ConvertReqString2List(linked_destroy.loaded_item.origin_tech) for(var/T in temp_tech) files.UpdateTech(T, temp_tech[T]) if(linked_destroy.loaded_item.reliability < 100 && linked_destroy.loaded_item.crit_fail) @@ -274,11 +274,11 @@ won't update every console in existence) but it's more of a hassle to do. Also, S.use(1) linked_destroy.loaded_item = S else - del(S) + qdel(S) linked_destroy.icon_state = "d_analyzer" else if(!(I in linked_destroy.component_parts)) - del(I) + qdel(I) linked_destroy.icon_state = "d_analyzer" use_power(linked_destroy.active_power_usage) screen = 1.0 @@ -468,7 +468,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, sheet.amount = min(available_num_sheets, desired_num_sheets) linked_lathe.vars[res_amount] = max(0, (linked_lathe.vars[res_amount]-sheet.amount * sheet.perunit)) else - del sheet + qdel(sheet) else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the protolathe to eject a sheet of material var/desired_num_sheets = text2num(href_list["amount"]) var/res_amount, type @@ -492,7 +492,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, sheet.amount = min(available_num_sheets, desired_num_sheets) linked_imprinter.vars[res_amount] = max(0, (linked_imprinter.vars[res_amount]-sheet.amount * sheet.perunit)) else - del sheet + qdel(sheet) else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with. screen = 0.0 @@ -518,7 +518,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/choice = alert("R&D Console Database Reset", "Are you sure you want to reset the R&D console's database? Data lost cannot be recovered.", "Continue", "Cancel") if(choice == "Continue") screen = 0.0 - del(files) + qdel(files) files = new /datum/research(src) spawn(20) screen = 1.6 @@ -753,7 +753,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Name: [linked_destroy.loaded_item.name]
        " dat += "Origin Tech:" dat += "
          " - var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) + var/list/temp_tech = ConvertReqString2List(linked_destroy.loaded_item.origin_tech) for(var/T in temp_tech) dat += "
        • [CallTechName(T)] [temp_tech[T]]" for(var/datum/tech/F in files.known_tech) diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index c7ed90f786..72127cfa89 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -59,6 +59,12 @@ research holder datum. possible_designs += new D(src) RefreshResearch() +/datum/research/techonly + +/datum/research/techonly/New() + for(var/T in typesof(/datum/tech) - /datum/tech) + possible_tech += new T(src) + RefreshResearch() //Checks to see if tech has all the required pre-reqs. diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 6a5311e62b..62da7ef49b 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -24,7 +24,7 @@ RefreshParts() src.initialize(); //Agouri -/obj/machinery/r_n_d/server/Del() +/obj/machinery/r_n_d/server/Destroy() griefProtection() ..() @@ -149,7 +149,7 @@ if(I.reliability != 100 && crit_fail) I.crit_fail = 1 I.loc = src.loc - del(src) + qdel(src) return 1 /obj/machinery/r_n_d/server/attack_hand(mob/user as mob) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm index 666d361a2b..a3256d6f53 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact.dm @@ -1,124 +1,124 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Large finds - (Potentially) active alien machinery from the dawn of time - -/datum/artifact_find - var/artifact_id - var/artifact_find_type - var/artifact_detect_range - -/datum/artifact_find/New() - artifact_detect_range = rand(5,300) - - artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]" - - artifact_find_type = pick(\ - 5;/obj/machinery/power/supermatter,\ - 5;/obj/structure/constructshell,\ - 5;/obj/machinery/syndicate_beacon,\ - 25;/obj/machinery/power/supermatter/shard,\ - 50;/obj/structure/cult/pylon,\ - 100;/obj/machinery/auto_cloner,\ - 100;/obj/machinery/giga_drill,\ - 100;/obj/machinery/replicator,\ - 150;/obj/structure/crystal,\ - 1000;/obj/machinery/artifact) - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Boulders - sometimes turn up after excavating turf - excavate further to try and find large xenoarch finds - -/obj/structure/boulder - name = "rocky debris" - desc = "Leftover rock from an excavation, it's been partially dug out already but there's still a lot to go." - icon = 'icons/obj/mining.dmi' - icon_state = "boulder1" - density = 1 - opacity = 1 - anchored = 1 - var/excavation_level = 0 - var/datum/geosample/geological_data - var/datum/artifact_find/artifact_find - var/last_act = 0 - -/obj/structure/boulder/New() - icon_state = "boulder[rand(1,4)]" - excavation_level = rand(5,50) - -/obj/structure/boulder/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/device/core_sampler)) - src.geological_data.artifact_distance = rand(-100,100) / 100 - src.geological_data.artifact_id = artifact_find.artifact_id - - var/obj/item/device/core_sampler/C = W - C.sample_item(src, user) - return - - if (istype(W, /obj/item/device/depth_scanner)) - var/obj/item/device/depth_scanner/C = W - C.scan_atom(user, src) - return - - if (istype(W, /obj/item/device/measuring_tape)) - var/obj/item/device/measuring_tape/P = W - user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") - if(do_after(user,40)) - user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm." - return - - if (istype(W, /obj/item/weapon/pickaxe)) - var/obj/item/weapon/pickaxe/P = W - - if(last_act + P.digspeed > world.time)//prevents message spam - return - last_act = world.time - - user << "\red You start [P.drill_verb] [src]." - - - - if(!do_after(user,P.digspeed)) - return - - user << "\blue You finish [P.drill_verb] [src]." - excavation_level += P.excavation_amount - - if(excavation_level > 100) - //failure - user.visible_message("[src] suddenly crumbles away.",\ - "\red [src] has disintegrated under your onslaught, any secrets it was holding are long gone.") - del(src) - return - - if(prob(excavation_level)) - //success - if(artifact_find) - var/spawn_type = artifact_find.artifact_find_type - var/obj/O = new spawn_type(get_turf(src)) - if(istype(O,/obj/machinery/artifact)) - var/obj/machinery/artifact/X = O - if(X.my_effect) - X.my_effect.artifact_id = artifact_find.artifact_id - src.visible_message("[src] suddenly crumbles away.") - else - user.visible_message("[src] suddenly crumbles away.",\ - "\blue [src] has been whittled away under your careful excavation, but there was nothing of interest inside.") - del(src) - -/obj/structure/boulder/Bumped(AM) - . = ..() - if(istype(AM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) - attackby(H.l_hand,H) - else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) - attackby(H.r_hand,H) - - else if(istype(AM,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = AM - if(istype(R.module_active,/obj/item/weapon/pickaxe)) - attackby(R.module_active,R) - - else if(istype(AM,/obj/mecha)) - var/obj/mecha/M = AM - if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) - M.selected.action(src) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Large finds - (Potentially) active alien machinery from the dawn of time + +/datum/artifact_find + var/artifact_id + var/artifact_find_type + var/artifact_detect_range + +/datum/artifact_find/New() + artifact_detect_range = rand(5,300) + + artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]" + + artifact_find_type = pick(\ + 5;/obj/machinery/power/supermatter,\ + 5;/obj/structure/constructshell,\ + 5;/obj/machinery/syndicate_beacon,\ + 25;/obj/machinery/power/supermatter/shard,\ + 50;/obj/structure/cult/pylon,\ + 100;/obj/machinery/auto_cloner,\ + 100;/obj/machinery/giga_drill,\ + 100;/obj/machinery/replicator,\ + 150;/obj/structure/crystal,\ + 1000;/obj/machinery/artifact) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Boulders - sometimes turn up after excavating turf - excavate further to try and find large xenoarch finds + +/obj/structure/boulder + name = "rocky debris" + desc = "Leftover rock from an excavation, it's been partially dug out already but there's still a lot to go." + icon = 'icons/obj/mining.dmi' + icon_state = "boulder1" + density = 1 + opacity = 1 + anchored = 1 + var/excavation_level = 0 + var/datum/geosample/geological_data + var/datum/artifact_find/artifact_find + var/last_act = 0 + +/obj/structure/boulder/New() + icon_state = "boulder[rand(1,4)]" + excavation_level = rand(5,50) + +/obj/structure/boulder/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/device/core_sampler)) + src.geological_data.artifact_distance = rand(-100,100) / 100 + src.geological_data.artifact_id = artifact_find.artifact_id + + var/obj/item/device/core_sampler/C = W + C.sample_item(src, user) + return + + if (istype(W, /obj/item/device/depth_scanner)) + var/obj/item/device/depth_scanner/C = W + C.scan_atom(user, src) + return + + if (istype(W, /obj/item/device/measuring_tape)) + var/obj/item/device/measuring_tape/P = W + user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") + if(do_after(user,40)) + user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm." + return + + if (istype(W, /obj/item/weapon/pickaxe)) + var/obj/item/weapon/pickaxe/P = W + + if(last_act + P.digspeed > world.time)//prevents message spam + return + last_act = world.time + + user << "\red You start [P.drill_verb] [src]." + + + + if(!do_after(user,P.digspeed)) + return + + user << "\blue You finish [P.drill_verb] [src]." + excavation_level += P.excavation_amount + + if(excavation_level > 100) + //failure + user.visible_message("[src] suddenly crumbles away.",\ + "\red [src] has disintegrated under your onslaught, any secrets it was holding are long gone.") + qdel(src) + return + + if(prob(excavation_level)) + //success + if(artifact_find) + var/spawn_type = artifact_find.artifact_find_type + var/obj/O = new spawn_type(get_turf(src)) + if(istype(O,/obj/machinery/artifact)) + var/obj/machinery/artifact/X = O + if(X.my_effect) + X.my_effect.artifact_id = artifact_find.artifact_id + src.visible_message("[src] suddenly crumbles away.") + else + user.visible_message("[src] suddenly crumbles away.",\ + "\blue [src] has been whittled away under your careful excavation, but there was nothing of interest inside.") + qdel(src) + +/obj/structure/boulder/Bumped(AM) + . = ..() + if(istype(AM,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) + attackby(H.l_hand,H) + else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) + attackby(H.r_hand,H) + + else if(istype(AM,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = AM + if(istype(R.module_active,/obj/item/weapon/pickaxe)) + attackby(R.module_active,R) + + else if(istype(AM,/obj/mecha)) + var/obj/mecha/M = AM + if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) + M.selected.action(src) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm b/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm index 9829c35ec8..44f257060a 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm @@ -1,36 +1,36 @@ - -/obj/structure/crystal - name = "large crystal" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "crystal" - density = 1 - -/obj/structure/crystal/New() - ..() - - icon_state = pick("ano70","ano80") - - desc = pick(\ - "It shines faintly as it catches the light.",\ - "It appears to have a faint inner glow.",\ - "It seems to draw you inward as you look it at.",\ - "Something twinkles faintly as you look at it.",\ - "It's mesmerizing to behold.") - -/obj/structure/crystal/Del() - src.visible_message("\red[src] shatters!") - if(prob(75)) - new /obj/item/weapon/shard/phoron(src.loc) - if(prob(50)) - new /obj/item/weapon/shard/phoron(src.loc) - if(prob(25)) - new /obj/item/weapon/shard/phoron(src.loc) - if(prob(75)) - new /obj/item/weapon/shard(src.loc) - if(prob(50)) - new /obj/item/weapon/shard(src.loc) - if(prob(25)) - new /obj/item/weapon/shard(src.loc) - ..() - -//todo: laser_act + +/obj/structure/crystal + name = "large crystal" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "crystal" + density = 1 + +/obj/structure/crystal/New() + ..() + + icon_state = pick("ano70","ano80") + + desc = pick(\ + "It shines faintly as it catches the light.",\ + "It appears to have a faint inner glow.",\ + "It seems to draw you inward as you look it at.",\ + "Something twinkles faintly as you look at it.",\ + "It's mesmerizing to behold.") + +/obj/structure/crystal/Destroy() + src.visible_message("\red[src] shatters!") + if(prob(75)) + new /obj/item/weapon/shard/phoron(src.loc) + if(prob(50)) + new /obj/item/weapon/shard/phoron(src.loc) + if(prob(25)) + new /obj/item/weapon/shard/phoron(src.loc) + if(prob(75)) + new /obj/item/weapon/shard(src.loc) + if(prob(50)) + new /obj/item/weapon/shard(src.loc) + if(prob(25)) + new /obj/item/weapon/shard(src.loc) + ..() + +//todo: laser_act diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm index 4108986789..7617468b41 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm @@ -102,7 +102,7 @@ spawned_obj.desc += " It is made of [source_material]." else spawned_obj.desc = "It is made of [source_material]." - del(source_material) + qdel(source_material) spawn_progress_time = 0 max_spawn_time = rand(30,100) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm index 22593fa4f5..5fbe8dcd41 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm @@ -1,366 +1,366 @@ - -#define EFFECT_TOUCH 0 -#define EFFECT_AURA 1 -#define EFFECT_PULSE 2 -#define MAX_EFFECT 2 - -#define TRIGGER_TOUCH 0 -#define TRIGGER_WATER 1 -#define TRIGGER_ACID 2 -#define TRIGGER_VOLATILE 3 -#define TRIGGER_TOXIN 4 -#define TRIGGER_FORCE 5 -#define TRIGGER_ENERGY 6 -#define TRIGGER_HEAT 7 -#define TRIGGER_COLD 8 -#define TRIGGER_PHORON 9 -#define TRIGGER_OXY 10 -#define TRIGGER_CO2 11 -#define TRIGGER_NITRO 12 -#define MAX_TRIGGER 12 -/* -//sleeping gas appears to be bugged, currently -var/list/valid_primary_effect_types = list(\ - /datum/artifact_effect/cellcharge,\ - /datum/artifact_effect/celldrain,\ - /datum/artifact_effect/forcefield,\ - /datum/artifact_effect/gasoxy,\ - /datum/artifact_effect/gasplasma,\ -/* /datum/artifact_effect/gassleeping,\*/ - /datum/artifact_effect/heal,\ - /datum/artifact_effect/hurt,\ - /datum/artifact_effect/emp,\ - /datum/artifact_effect/teleport,\ - /datum/artifact_effect/robohurt,\ - /datum/artifact_effect/roboheal) - -var/list/valid_secondary_effect_types = list(\ - /datum/artifact_effect/cold,\ - /datum/artifact_effect/badfeeling,\ - /datum/artifact_effect/cellcharge,\ - /datum/artifact_effect/celldrain,\ - /datum/artifact_effect/dnaswitch,\ - /datum/artifact_effect/emp,\ - /datum/artifact_effect/gasco2,\ - /datum/artifact_effect/gasnitro,\ - /datum/artifact_effect/gasoxy,\ - /datum/artifact_effect/gasphoron,\ -/* /datum/artifact_effect/gassleeping,\*/ - /datum/artifact_effect/goodfeeling,\ - /datum/artifact_effect/heal,\ - /datum/artifact_effect/hurt,\ - /datum/artifact_effect/radiate,\ - /datum/artifact_effect/roboheal,\ - /datum/artifact_effect/robohurt,\ - /datum/artifact_effect/sleepy,\ - /datum/artifact_effect/stun,\ - /datum/artifact_effect/teleport) - */ - -/obj/machinery/artifact - name = "alien artifact" - desc = "A large alien device." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "ano00" - var/icon_num = 0 - density = 1 - var/datum/artifact_effect/my_effect - var/datum/artifact_effect/secondary_effect - var/being_used = 0 - -/obj/machinery/artifact/New() - ..() - - //setup primary effect - these are the main ones (mixed) - var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) - my_effect = new effecttype(src) - - //75% chance to have a secondary stealthy (and mostly bad) effect - if(prob(75)) - effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) - secondary_effect = new effecttype(src) - if(prob(75)) - secondary_effect.ToggleActivate(0) - - icon_num = rand(0,11) - icon_state = "ano[icon_num]0" - if(icon_num == 7 || icon_num == 8) - name = "large crystal" - desc = pick("It shines faintly as it catches the light.",\ - "It appears to have a faint inner glow.",\ - "It seems to draw you inward as you look it at.",\ - "Something twinkles faintly as you look at it.",\ - "It's mesmerizing to behold.") - if(prob(50)) - my_effect.trigger = TRIGGER_ENERGY - else if(icon_num == 9) - name = "alien computer" - desc = "It is covered in strange markings." - if(prob(75)) - my_effect.trigger = TRIGGER_TOUCH - else if(icon_num == 10) - desc = "A large alien device, there appear to be some kind of vents in the side." - if(prob(50)) - my_effect.trigger = rand(6,12) - else if(icon_num == 11) - name = "sealed alien pod" - desc = "A strange alien device." - if(prob(25)) - my_effect.trigger = rand(1,4) - -#define TRIGGER_PHORON 9 -#define TRIGGER_OXY 10 -#define TRIGGER_CO2 11 -#define TRIGGER_NITRO 12 - -/obj/machinery/artifact/process() - - var/turf/L = loc - if(isnull(L) || !istype(L)) // We're inside a container or on null turf, either way stop processing effects - return - - if(my_effect) - my_effect.process() - if(secondary_effect) - secondary_effect.process() - - if(pulledby) - Bumped(pulledby) - - //if either of our effects rely on environmental factors, work that out - var/trigger_cold = 0 - var/trigger_hot = 0 - var/trigger_phoron = 0 - var/trigger_oxy = 0 - var/trigger_co2 = 0 - var/trigger_nitro = 0 - if( (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) || (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) ) - var/turf/T = get_turf(src) - var/datum/gas_mixture/env = T.return_air() - if(env) - if(env.temperature < 225) - trigger_cold = 1 - else if(env.temperature > 375) - trigger_hot = 1 - - if(env.gas["phoron"] >= 10) - trigger_phoron = 1 - if(env.gas["oxygen"] >= 10) - trigger_oxy = 1 - if(env.gas["carbon_dioxide"] >= 10) - trigger_co2 = 1 - if(env.gas["nitrogen"] >= 10) - trigger_nitro = 1 - - //COLD ACTIVATION - if(trigger_cold) - if(my_effect.trigger == TRIGGER_COLD && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_COLD && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //HEAT ACTIVATION - if(trigger_hot) - if(my_effect.trigger == TRIGGER_HEAT && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_HEAT && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //PHORON GAS ACTIVATION - if(trigger_phoron) - if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //OXYGEN GAS ACTIVATION - if(trigger_oxy) - if(my_effect.trigger == TRIGGER_OXY && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_OXY && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //CO2 GAS ACTIVATION - if(trigger_co2) - if(my_effect.trigger == TRIGGER_CO2 && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_CO2 && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //NITROGEN GAS ACTIVATION - if(trigger_nitro) - if(my_effect.trigger == TRIGGER_NITRO && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_NITRO && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - -/obj/machinery/artifact/attack_hand(var/mob/user as mob) - if (get_dist(user, src) > 1) - user << "\red You can't reach [src] from here." - return - if(ishuman(user) && user:gloves) - user << "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." - return - - src.add_fingerprint(user) - - if(my_effect.trigger == TRIGGER_TOUCH) - user << "You touch [src]." - my_effect.ToggleActivate() - else - user << "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." - - if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH) - secondary_effect.ToggleActivate(0) - - if (my_effect.effect == EFFECT_TOUCH) - my_effect.DoEffectTouch(user) - - if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated) - secondary_effect.DoEffectTouch(user) - -/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob) - - if (istype(W, /obj/item/weapon/reagent_containers/)) - if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1)) - if(my_effect.trigger == TRIGGER_WATER) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25)) - secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) - if(my_effect.trigger == TRIGGER_ACID) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25)) - secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1)) - if(my_effect.trigger == TRIGGER_VOLATILE) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_VOLATILE && prob(25)) - secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amanitin", 1) || W.reagents.has_reagent("neurotoxin", 1)) - if(my_effect.trigger == TRIGGER_TOXIN) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_TOXIN && prob(25)) - secondary_effect.ToggleActivate(0) - else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\ - istype(W,/obj/item/weapon/melee/energy) ||\ - istype(W,/obj/item/weapon/melee/cultblade) ||\ - istype(W,/obj/item/weapon/card/emag) ||\ - istype(W,/obj/item/device/multitool)) - if (my_effect.trigger == TRIGGER_ENERGY) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) - secondary_effect.ToggleActivate(0) - - else if (istype(W,/obj/item/weapon/flame) && W:lit ||\ - istype(W,/obj/item/weapon/weldingtool) && W:welding) - if(my_effect.trigger == TRIGGER_HEAT) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && prob(25)) - secondary_effect.ToggleActivate(0) - else - ..() - if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) - secondary_effect.ToggleActivate(0) - -/obj/machinery/artifact/Bumped(M as mob|obj) - ..() - if(istype(M,/obj)) - if(M:throwforce >= 10) - if(my_effect.trigger == TRIGGER_FORCE) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) - secondary_effect.ToggleActivate(0) - else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves)) - var/warn = 0 - - if (my_effect.trigger == TRIGGER_TOUCH && prob(50)) - my_effect.ToggleActivate() - warn = 1 - if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25)) - secondary_effect.ToggleActivate(0) - warn = 1 - - if (my_effect.effect == EFFECT_TOUCH && prob(50)) - my_effect.DoEffectTouch(M) - warn = 1 - if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50)) - secondary_effect.DoEffectTouch(M) - warn = 1 - - if(warn) - M << "You accidentally touch [src]." - ..() - -/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P) - if(istype(P,/obj/item/projectile/bullet) ||\ - istype(P,/obj/item/projectile/hivebotbullet)) - if(my_effect.trigger == TRIGGER_FORCE) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) - secondary_effect.ToggleActivate(0) - - else if(istype(P,/obj/item/projectile/beam) ||\ - istype(P,/obj/item/projectile/ion) ||\ - istype(P,/obj/item/projectile/energy)) - if(my_effect.trigger == TRIGGER_ENERGY) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) - secondary_effect.ToggleActivate(0) - -/obj/machinery/artifact/ex_act(severity) - switch(severity) - if(1.0) del src - if(2.0) - if (prob(50)) - del src - else - if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) - my_effect.ToggleActivate() - if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) - secondary_effect.ToggleActivate(0) - if(3.0) - if (my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) - my_effect.ToggleActivate() - if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) - secondary_effect.ToggleActivate(0) - return - -/obj/machinery/artifact/Move() - ..() - if(my_effect) - my_effect.UpdateMove() - if(secondary_effect) - secondary_effect.UpdateMove() + +#define EFFECT_TOUCH 0 +#define EFFECT_AURA 1 +#define EFFECT_PULSE 2 +#define MAX_EFFECT 2 + +#define TRIGGER_TOUCH 0 +#define TRIGGER_WATER 1 +#define TRIGGER_ACID 2 +#define TRIGGER_VOLATILE 3 +#define TRIGGER_TOXIN 4 +#define TRIGGER_FORCE 5 +#define TRIGGER_ENERGY 6 +#define TRIGGER_HEAT 7 +#define TRIGGER_COLD 8 +#define TRIGGER_PHORON 9 +#define TRIGGER_OXY 10 +#define TRIGGER_CO2 11 +#define TRIGGER_NITRO 12 +#define MAX_TRIGGER 12 +/* +//sleeping gas appears to be bugged, currently +var/list/valid_primary_effect_types = list(\ + /datum/artifact_effect/cellcharge,\ + /datum/artifact_effect/celldrain,\ + /datum/artifact_effect/forcefield,\ + /datum/artifact_effect/gasoxy,\ + /datum/artifact_effect/gasplasma,\ +/* /datum/artifact_effect/gassleeping,\*/ + /datum/artifact_effect/heal,\ + /datum/artifact_effect/hurt,\ + /datum/artifact_effect/emp,\ + /datum/artifact_effect/teleport,\ + /datum/artifact_effect/robohurt,\ + /datum/artifact_effect/roboheal) + +var/list/valid_secondary_effect_types = list(\ + /datum/artifact_effect/cold,\ + /datum/artifact_effect/badfeeling,\ + /datum/artifact_effect/cellcharge,\ + /datum/artifact_effect/celldrain,\ + /datum/artifact_effect/dnaswitch,\ + /datum/artifact_effect/emp,\ + /datum/artifact_effect/gasco2,\ + /datum/artifact_effect/gasnitro,\ + /datum/artifact_effect/gasoxy,\ + /datum/artifact_effect/gasphoron,\ +/* /datum/artifact_effect/gassleeping,\*/ + /datum/artifact_effect/goodfeeling,\ + /datum/artifact_effect/heal,\ + /datum/artifact_effect/hurt,\ + /datum/artifact_effect/radiate,\ + /datum/artifact_effect/roboheal,\ + /datum/artifact_effect/robohurt,\ + /datum/artifact_effect/sleepy,\ + /datum/artifact_effect/stun,\ + /datum/artifact_effect/teleport) + */ + +/obj/machinery/artifact + name = "alien artifact" + desc = "A large alien device." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "ano00" + var/icon_num = 0 + density = 1 + var/datum/artifact_effect/my_effect + var/datum/artifact_effect/secondary_effect + var/being_used = 0 + +/obj/machinery/artifact/New() + ..() + + //setup primary effect - these are the main ones (mixed) + var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) + my_effect = new effecttype(src) + + //75% chance to have a secondary stealthy (and mostly bad) effect + if(prob(75)) + effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) + secondary_effect = new effecttype(src) + if(prob(75)) + secondary_effect.ToggleActivate(0) + + icon_num = rand(0,11) + icon_state = "ano[icon_num]0" + if(icon_num == 7 || icon_num == 8) + name = "large crystal" + desc = pick("It shines faintly as it catches the light.",\ + "It appears to have a faint inner glow.",\ + "It seems to draw you inward as you look it at.",\ + "Something twinkles faintly as you look at it.",\ + "It's mesmerizing to behold.") + if(prob(50)) + my_effect.trigger = TRIGGER_ENERGY + else if(icon_num == 9) + name = "alien computer" + desc = "It is covered in strange markings." + if(prob(75)) + my_effect.trigger = TRIGGER_TOUCH + else if(icon_num == 10) + desc = "A large alien device, there appear to be some kind of vents in the side." + if(prob(50)) + my_effect.trigger = rand(6,12) + else if(icon_num == 11) + name = "sealed alien pod" + desc = "A strange alien device." + if(prob(25)) + my_effect.trigger = rand(1,4) + +#define TRIGGER_PHORON 9 +#define TRIGGER_OXY 10 +#define TRIGGER_CO2 11 +#define TRIGGER_NITRO 12 + +/obj/machinery/artifact/process() + + var/turf/L = loc + if(isnull(L) || !istype(L)) // We're inside a container or on null turf, either way stop processing effects + return + + if(my_effect) + my_effect.process() + if(secondary_effect) + secondary_effect.process() + + if(pulledby) + Bumped(pulledby) + + //if either of our effects rely on environmental factors, work that out + var/trigger_cold = 0 + var/trigger_hot = 0 + var/trigger_phoron = 0 + var/trigger_oxy = 0 + var/trigger_co2 = 0 + var/trigger_nitro = 0 + if( (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) || (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) ) + var/turf/T = get_turf(src) + var/datum/gas_mixture/env = T.return_air() + if(env) + if(env.temperature < 225) + trigger_cold = 1 + else if(env.temperature > 375) + trigger_hot = 1 + + if(env.gas["phoron"] >= 10) + trigger_phoron = 1 + if(env.gas["oxygen"] >= 10) + trigger_oxy = 1 + if(env.gas["carbon_dioxide"] >= 10) + trigger_co2 = 1 + if(env.gas["nitrogen"] >= 10) + trigger_nitro = 1 + + //COLD ACTIVATION + if(trigger_cold) + if(my_effect.trigger == TRIGGER_COLD && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_COLD && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //HEAT ACTIVATION + if(trigger_hot) + if(my_effect.trigger == TRIGGER_HEAT && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_HEAT && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //PHORON GAS ACTIVATION + if(trigger_phoron) + if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //OXYGEN GAS ACTIVATION + if(trigger_oxy) + if(my_effect.trigger == TRIGGER_OXY && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_OXY && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //CO2 GAS ACTIVATION + if(trigger_co2) + if(my_effect.trigger == TRIGGER_CO2 && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_CO2 && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //NITROGEN GAS ACTIVATION + if(trigger_nitro) + if(my_effect.trigger == TRIGGER_NITRO && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_NITRO && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + +/obj/machinery/artifact/attack_hand(var/mob/user as mob) + if (get_dist(user, src) > 1) + user << "\red You can't reach [src] from here." + return + if(ishuman(user) && user:gloves) + user << "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." + return + + src.add_fingerprint(user) + + if(my_effect.trigger == TRIGGER_TOUCH) + user << "You touch [src]." + my_effect.ToggleActivate() + else + user << "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." + + if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH) + secondary_effect.ToggleActivate(0) + + if (my_effect.effect == EFFECT_TOUCH) + my_effect.DoEffectTouch(user) + + if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated) + secondary_effect.DoEffectTouch(user) + +/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob) + + if (istype(W, /obj/item/weapon/reagent_containers/)) + if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1)) + if(my_effect.trigger == TRIGGER_WATER) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25)) + secondary_effect.ToggleActivate(0) + else if(W.reagents.has_reagent("acid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) + if(my_effect.trigger == TRIGGER_ACID) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25)) + secondary_effect.ToggleActivate(0) + else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1)) + if(my_effect.trigger == TRIGGER_VOLATILE) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_VOLATILE && prob(25)) + secondary_effect.ToggleActivate(0) + else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amanitin", 1) || W.reagents.has_reagent("neurotoxin", 1)) + if(my_effect.trigger == TRIGGER_TOXIN) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_TOXIN && prob(25)) + secondary_effect.ToggleActivate(0) + else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\ + istype(W,/obj/item/weapon/melee/energy) ||\ + istype(W,/obj/item/weapon/melee/cultblade) ||\ + istype(W,/obj/item/weapon/card/emag) ||\ + istype(W,/obj/item/device/multitool)) + if (my_effect.trigger == TRIGGER_ENERGY) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) + secondary_effect.ToggleActivate(0) + + else if (istype(W,/obj/item/weapon/flame) && W:lit ||\ + istype(W,/obj/item/weapon/weldingtool) && W:welding) + if(my_effect.trigger == TRIGGER_HEAT) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && prob(25)) + secondary_effect.ToggleActivate(0) + else + ..() + if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) + secondary_effect.ToggleActivate(0) + +/obj/machinery/artifact/Bumped(M as mob|obj) + ..() + if(istype(M,/obj)) + if(M:throwforce >= 10) + if(my_effect.trigger == TRIGGER_FORCE) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) + secondary_effect.ToggleActivate(0) + else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves)) + var/warn = 0 + + if (my_effect.trigger == TRIGGER_TOUCH && prob(50)) + my_effect.ToggleActivate() + warn = 1 + if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25)) + secondary_effect.ToggleActivate(0) + warn = 1 + + if (my_effect.effect == EFFECT_TOUCH && prob(50)) + my_effect.DoEffectTouch(M) + warn = 1 + if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50)) + secondary_effect.DoEffectTouch(M) + warn = 1 + + if(warn) + M << "You accidentally touch [src]." + ..() + +/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P) + if(istype(P,/obj/item/projectile/bullet) ||\ + istype(P,/obj/item/projectile/hivebotbullet)) + if(my_effect.trigger == TRIGGER_FORCE) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) + secondary_effect.ToggleActivate(0) + + else if(istype(P,/obj/item/projectile/beam) ||\ + istype(P,/obj/item/projectile/ion) ||\ + istype(P,/obj/item/projectile/energy)) + if(my_effect.trigger == TRIGGER_ENERGY) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) + secondary_effect.ToggleActivate(0) + +/obj/machinery/artifact/ex_act(severity) + switch(severity) + if(1.0) qdel(src) + if(2.0) + if (prob(50)) + qdel(src) + else + if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) + my_effect.ToggleActivate() + if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) + secondary_effect.ToggleActivate(0) + if(3.0) + if (my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) + my_effect.ToggleActivate() + if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) + secondary_effect.ToggleActivate(0) + return + +/obj/machinery/artifact/Move() + ..() + if(my_effect) + my_effect.UpdateMove() + if(secondary_effect) + secondary_effect.UpdateMove() diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm index e076eedd2b..0139ea935f 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm @@ -1,80 +1,80 @@ - -/datum/artifact_effect/forcefield - effecttype = "forcefield" - var/list/created_field = list() - effect_type = 4 - -/datum/artifact_effect/forcefield/New() - ..() - trigger = TRIGGER_TOUCH - -/datum/artifact_effect/forcefield/ToggleActivate() - ..() - if(created_field.len) - for(var/obj/effect/energy_field/F in created_field) - created_field.Remove(F) - del F - else if(holder) - var/turf/T = get_turf(holder) - while(created_field.len < 16) - var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z)) - created_field.Add(E) - E.strength = 1 - E.density = 1 - E.anchored = 1 - E.invisibility = 0 - spawn(10) - UpdateMove() - return 1 - -/datum/artifact_effect/forcefield/process() - ..() - for(var/obj/effect/energy_field/E in created_field) - if(E.strength < 1) - E.Strengthen(0.15) - else if(E.strength < 5) - E.Strengthen(0.25) - -/datum/artifact_effect/forcefield/UpdateMove() - if(created_field.len && holder) - var/turf/T = get_turf(holder) - while(created_field.len < 16) - //for now, just instantly respawn the fields when they get destroyed - var/obj/effect/energy_field/E = new (locate(T.x,T.y,T)) - created_field.Add(E) - E.anchored = 1 - E.density = 1 - E.invisibility = 0 - - var/obj/effect/energy_field/E = created_field[1] - E.loc = locate(T.x + 2,T.y + 2,T.z) - E = created_field[2] - E.loc = locate(T.x + 2,T.y + 1,T.z) - E = created_field[3] - E.loc = locate(T.x + 2,T.y,T.z) - E = created_field[4] - E.loc = locate(T.x + 2,T.y - 1,T.z) - E = created_field[5] - E.loc = locate(T.x + 2,T.y - 2,T.z) - E = created_field[6] - E.loc = locate(T.x + 1,T.y + 2,T.z) - E = created_field[7] - E.loc = locate(T.x + 1,T.y - 2,T.z) - E = created_field[8] - E.loc = locate(T.x,T.y + 2,T.z) - E = created_field[9] - E.loc = locate(T.x,T.y - 2,T.z) - E = created_field[10] - E.loc = locate(T.x - 1,T.y + 2,T.z) - E = created_field[11] - E.loc = locate(T.x - 1,T.y - 2,T.z) - E = created_field[12] - E.loc = locate(T.x - 2,T.y + 2,T.z) - E = created_field[13] - E.loc = locate(T.x - 2,T.y + 1,T.z) - E = created_field[14] - E.loc = locate(T.x - 2,T.y,T.z) - E = created_field[15] - E.loc = locate(T.x - 2,T.y - 1,T.z) - E = created_field[16] - E.loc = locate(T.x - 2,T.y - 2,T.z) + +/datum/artifact_effect/forcefield + effecttype = "forcefield" + var/list/created_field = list() + effect_type = 4 + +/datum/artifact_effect/forcefield/New() + ..() + trigger = TRIGGER_TOUCH + +/datum/artifact_effect/forcefield/ToggleActivate() + ..() + if(created_field.len) + for(var/obj/effect/energy_field/F in created_field) + created_field.Remove(F) + qdel(F) + else if(holder) + var/turf/T = get_turf(holder) + while(created_field.len < 16) + var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z)) + created_field.Add(E) + E.strength = 1 + E.density = 1 + E.anchored = 1 + E.invisibility = 0 + spawn(10) + UpdateMove() + return 1 + +/datum/artifact_effect/forcefield/process() + ..() + for(var/obj/effect/energy_field/E in created_field) + if(E.strength < 1) + E.Strengthen(0.15) + else if(E.strength < 5) + E.Strengthen(0.25) + +/datum/artifact_effect/forcefield/UpdateMove() + if(created_field.len && holder) + var/turf/T = get_turf(holder) + while(created_field.len < 16) + //for now, just instantly respawn the fields when they get destroyed + var/obj/effect/energy_field/E = new (locate(T.x,T.y,T)) + created_field.Add(E) + E.anchored = 1 + E.density = 1 + E.invisibility = 0 + + var/obj/effect/energy_field/E = created_field[1] + E.loc = locate(T.x + 2,T.y + 2,T.z) + E = created_field[2] + E.loc = locate(T.x + 2,T.y + 1,T.z) + E = created_field[3] + E.loc = locate(T.x + 2,T.y,T.z) + E = created_field[4] + E.loc = locate(T.x + 2,T.y - 1,T.z) + E = created_field[5] + E.loc = locate(T.x + 2,T.y - 2,T.z) + E = created_field[6] + E.loc = locate(T.x + 1,T.y + 2,T.z) + E = created_field[7] + E.loc = locate(T.x + 1,T.y - 2,T.z) + E = created_field[8] + E.loc = locate(T.x,T.y + 2,T.z) + E = created_field[9] + E.loc = locate(T.x,T.y - 2,T.z) + E = created_field[10] + E.loc = locate(T.x - 1,T.y + 2,T.z) + E = created_field[11] + E.loc = locate(T.x - 1,T.y - 2,T.z) + E = created_field[12] + E.loc = locate(T.x - 2,T.y + 2,T.z) + E = created_field[13] + E.loc = locate(T.x - 2,T.y + 1,T.z) + E = created_field[14] + E.loc = locate(T.x - 2,T.y,T.z) + E = created_field[15] + E.loc = locate(T.x - 2,T.y - 1,T.z) + E = created_field[16] + E.loc = locate(T.x - 2,T.y - 2,T.z) diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm index 117fd66418..521da5e4aa 100644 --- a/code/modules/research/xenoarchaeology/finds/finds.dm +++ b/code/modules/research/xenoarchaeology/finds/finds.dm @@ -57,7 +57,7 @@ else for(var/mob/M in viewers(world.view, user)) M.show_message("[src] burns away into nothing.",1) - del(src) + qdel(src) w.remove_fuel(4) else for(var/mob/M in viewers(world.view, user)) @@ -73,7 +73,7 @@ ..() if(prob(33)) src.visible_message("[src] crumbles away, leaving some dust and gravel behind.") - del(src) + qdel(src) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Archaeological finds @@ -301,7 +301,7 @@ //arcane clothing apply_prefix = 0 var/list/possible_spawns = list(/obj/item/clothing/head/culthood, - /obj/item/clothing/head/magus, + /obj/item/clothing/head/culthood/magus, /obj/item/clothing/head/culthood/alt, /obj/item/clothing/head/helmet/space/cult) @@ -323,7 +323,7 @@ apply_material_decorations = 0 if(23) apply_prefix = 0 - new_item = new /obj/item/stack/rods(src.loc) + new_item = PoolOrNew(/obj/item/stack/rods, src.loc) apply_image_decorations = 0 apply_material_decorations = 0 if(24) @@ -548,7 +548,7 @@ if(talkative) new_item.talking_atom = new(new_item) - del(src) + qdel(src) else if(talkative) src.talking_atom = new(src) diff --git a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm index 80dbf549c0..8df5b92623 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm @@ -17,7 +17,7 @@ var/turf/T = get_turf(src) if(istype(T, /turf/simulated/mineral)) T:last_find = W - del src + qdel(src) /obj/item/weapon/fossil/bone name = "Fossilised bone" @@ -40,8 +40,8 @@ var/b = new src.type o.contents.Add(a) o.contents.Add(b) - del W - del src + qdel(W) + qdel(src) /obj/skeleton name = "Incomplete skeleton" @@ -62,7 +62,7 @@ if(!bstate) bnum++ src.contents.Add(new/obj/item/weapon/fossil/bone) - del W + qdel(W) if(bnum==breq) usr = user icon_state = "skel" diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm index e3e0d96197..8b7dd3fdfa 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_misc.dm @@ -1,74 +1,74 @@ - -/obj/item/weapon/shard/phoron - name = "phoron shard" - desc = "A shard of phoron glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window." - force = 8.0 - throwforce = 15.0 - icon_state = "phoronlarge" - sharp = 1 - edge = 1 - -/obj/item/weapon/shard/phoron/New() - - src.icon_state = pick("phoronlarge", "phoronmedium", "phoronsmall") - switch(src.icon_state) - if("phoronsmall") - src.pixel_x = rand(-12, 12) - src.pixel_y = rand(-12, 12) - if("phoronmedium") - src.pixel_x = rand(-8, 8) - src.pixel_y = rand(-8, 8) - if("phoronlarge") - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) - else - return - -/obj/item/weapon/shard/phoron/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if ( istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - var/obj/item/stack/sheet/glass/phoronglass/NG = new (user.loc) - for (var/obj/item/stack/sheet/glass/phoronglass/G in user.loc) - if(G==NG) - continue - if(G.amount>=G.max_amount) - continue - G.attackby(NG, user) - usr << "You add the newly-formed phoron glass to the stack. It now contains [NG.amount] sheets." - //SN src = null - del(src) - return - return ..() - -//legacy crystal -/obj/machinery/crystal - name = "Crystal" - icon = 'icons/obj/mining.dmi' - icon_state = "crystal" - -/obj/machinery/crystal/New() - if(prob(50)) - icon_state = "crystal2" - -//large finds - /* - /obj/machinery/syndicate_beacon - /obj/machinery/wish_granter - if(18) - item_type = "jagged green crystal" - additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") - icon_state = "crystal" - apply_material_decorations = 0 - if(prob(10)) - apply_image_decorations = 1 - if(19) - item_type = "jagged pink crystal" - additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") - icon_state = "crystal2" - apply_material_decorations = 0 - if(prob(10)) - apply_image_decorations = 1 - */ - //machinery type artifacts? + +/obj/item/weapon/shard/phoron + name = "phoron shard" + desc = "A shard of phoron glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window." + force = 8.0 + throwforce = 15.0 + icon_state = "phoronlarge" + sharp = 1 + edge = 1 + +/obj/item/weapon/shard/phoron/New() + + src.icon_state = pick("phoronlarge", "phoronmedium", "phoronsmall") + switch(src.icon_state) + if("phoronsmall") + src.pixel_x = rand(-12, 12) + src.pixel_y = rand(-12, 12) + if("phoronmedium") + src.pixel_x = rand(-8, 8) + src.pixel_y = rand(-8, 8) + if("phoronlarge") + src.pixel_x = rand(-5, 5) + src.pixel_y = rand(-5, 5) + else + return + +/obj/item/weapon/shard/phoron/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + if ( istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) + var/obj/item/stack/sheet/glass/phoronglass/NG = new (user.loc) + for (var/obj/item/stack/sheet/glass/phoronglass/G in user.loc) + if(G==NG) + continue + if(G.amount>=G.max_amount) + continue + G.attackby(NG, user) + usr << "You add the newly-formed phoron glass to the stack. It now contains [NG.amount] sheets." + //SN src = null + qdel(src) + return + return ..() + +//legacy crystal +/obj/machinery/crystal + name = "Crystal" + icon = 'icons/obj/mining.dmi' + icon_state = "crystal" + +/obj/machinery/crystal/New() + if(prob(50)) + icon_state = "crystal2" + +//large finds + /* + /obj/machinery/syndicate_beacon + /obj/machinery/wish_granter + if(18) + item_type = "jagged green crystal" + additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") + icon_state = "crystal" + apply_material_decorations = 0 + if(prob(10)) + apply_image_decorations = 1 + if(19) + item_type = "jagged pink crystal" + additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") + icon_state = "crystal2" + apply_material_decorations = 0 + if(prob(10)) + apply_image_decorations = 1 + */ + //machinery type artifacts? diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm index 38d6a52465..284f2cc0e6 100644 --- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm +++ b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm @@ -60,7 +60,7 @@ datum/genesequence visible_message("\red \icon[src] [src] can not extract any more genetic data from new fossils.") if(4) src.visible_message("\blue \icon[src] [user] inserts [W] into [src], the fossil is consumed as [src] extracts genetic data from it.") - del(W) + qdel(W) updateDialog() else if (istype(W, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = W @@ -77,7 +77,7 @@ datum/genesequence if(SCANFOSSIL_RETVAL_SUCCESS) numaccepted += 1 S.remove_from_storage(F, src) //This will move the item to this item's contents - del(F) + qdel(F) updateDialog() user.visible_message("[user] empties all the fossils from [S] into [src].", "\blue You empty all the fossils from [S] into [src].", "You hear the sound of rocks being poured into a container") diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm index 441630af30..912d0a062e 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm @@ -156,7 +156,7 @@ //see if we can clear out an old effect //delete it when the ids match to account for duplicate ids having different effects if(inserted_battery.battery_effect && inserted_battery.stored_charge <= 0) - del(inserted_battery.battery_effect) + qdel(inserted_battery.battery_effect) // var/datum/artifact_effect/source_effect diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm index b2f2cd3d67..a1690aa83e 100644 --- a/code/modules/research/xenoarchaeology/machinery/coolant.dm +++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm @@ -56,4 +56,4 @@ datum/chemical_reaction/coolant sleep(10) if(src) - del(src) + qdel(src) diff --git a/code/modules/research/xenoarchaeology/master_controller.dm b/code/modules/research/xenoarchaeology/master_controller.dm index 9d347e19c6..fa09ca6470 100644 --- a/code/modules/research/xenoarchaeology/master_controller.dm +++ b/code/modules/research/xenoarchaeology/master_controller.dm @@ -1,145 +1,145 @@ - -/datum/controller/game_controller - var/list/all_animal_genesequences = list() - var/list/all_plant_genesequences = list() - var/list/genome_prefixes = null - var/list/artifact_spawning_turfs = list() - var/list/digsite_spawning_turfs = list() - - var/list/spawn_types_animal = list("/mob/living/carbon/slime",\ - "/mob/living/simple_animal/hostile/alien",\ - "/mob/living/simple_animal/hostile/alien/drone",\ - "/mob/living/simple_animal/hostile/alien/sentinel",\ - "/mob/living/simple_animal/hostile/giant_spider",\ - "/mob/living/simple_animal/hostile/giant_spider/hunter",\ - "/mob/living/simple_animal/hostile/giant_spider/nurse",\ - "/mob/living/simple_animal/hostile/creature",\ - "/mob/living/simple_animal/hostile/samak",\ - "/mob/living/simple_animal/hostile/diyaab",\ - "/mob/living/simple_animal/hostile/shantak",\ - "/mob/living/simple_animal/tindalos",\ - "/mob/living/simple_animal/yithian") - - var/list/spawn_types_plant = list("/obj/item/seeds/walkingmushroommycelium",\ - "/obj/item/seeds/killertomatoseed",\ - "/obj/item/seeds/shandseed", - "/obj/item/seeds/mtearseed", - "/obj/item/seeds/thaadra",\ - "/obj/item/seeds/telriis",\ - "/obj/item/seeds/jurlmah",\ - "/obj/item/seeds/amauri",\ - "/obj/item/seeds/gelthi",\ - "/obj/item/seeds/vale",\ - "/obj/item/seeds/surik") - -#define XENOARCH_SPAWN_CHANCE 0.5 -#define DIGSITESIZE_LOWER 4 -#define DIGSITESIZE_UPPER 12 -#define ARTIFACTSPAWNNUM_LOWER 6 -#define ARTIFACTSPAWNNUM_UPPER 12 - -datum/controller/game_controller/proc/SetupXenoarch() - //create digsites - for(var/turf/simulated/mineral/M in block(locate(1,1,1), locate(world.maxx, world.maxy, world.maxz))) - if(isnull(M.geologic_data)) - M.geologic_data = new/datum/geosample(M) - - if(!prob(XENOARCH_SPAWN_CHANCE)) - continue - - digsite_spawning_turfs.Add(M) - var/digsite = get_random_digsite_type() - var/target_digsite_size = rand(DIGSITESIZE_LOWER, DIGSITESIZE_UPPER) - var/list/processed_turfs = list() - var/list/turfs_to_process = list(M) - while(turfs_to_process.len) - var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process) - - if(target_digsite_size > 1) - var/list/viable_adjacent_turfs = orange(1, archeo_turf) - for(var/turf/simulated/mineral/T in orange(1, archeo_turf)) - if(T.finds) - continue - if(T in processed_turfs) - continue - viable_adjacent_turfs.Add(T) - - for(var/turf/simulated/mineral/T in viable_adjacent_turfs) - if(prob(target_digsite_size/viable_adjacent_turfs.len)) - turfs_to_process.Add(T) - target_digsite_size -= 1 - if(target_digsite_size <= 0) - break - - processed_turfs.Add(archeo_turf) - if(isnull(archeo_turf.finds)) - archeo_turf.finds = list() - if(prob(50)) - archeo_turf.finds.Add(new /datum/find(digsite, rand(5,95))) - else if(prob(75)) - archeo_turf.finds.Add(new /datum/find(digsite, rand(5,45))) - archeo_turf.finds.Add(new /datum/find(digsite, rand(55,95))) - else - archeo_turf.finds.Add(new /datum/find(digsite, rand(5,30))) - archeo_turf.finds.Add(new /datum/find(digsite, rand(35,75))) - archeo_turf.finds.Add(new /datum/find(digsite, rand(75,95))) - - //sometimes a find will be close enough to the surface to show - var/datum/find/F = archeo_turf.finds[1] - if(F.excavation_required <= F.view_range) - archeo_turf.archaeo_overlay = "overlay_archaeo[rand(1,3)]" - archeo_turf.overlays += archeo_turf.archaeo_overlay - - //have a chance for an artifact to spawn here, but not in animal or plant digsites - if(isnull(M.artifact_find) && digsite != 1 && digsite != 2) - artifact_spawning_turfs.Add(archeo_turf) - - //create artifact machinery - var/num_artifacts_spawn = rand(ARTIFACTSPAWNNUM_LOWER, ARTIFACTSPAWNNUM_UPPER) - while(artifact_spawning_turfs.len > num_artifacts_spawn) - pick_n_take(artifact_spawning_turfs) - - var/list/artifacts_spawnturf_temp = artifact_spawning_turfs.Copy() - while(artifacts_spawnturf_temp.len > 0) - var/turf/simulated/mineral/artifact_turf = pop(artifacts_spawnturf_temp) - artifact_turf.artifact_find = new() - - //make sure we have some prefixes for the gene sequences - if(!genome_prefixes) - genome_prefixes = alphabet_uppercase.Copy() - if(!genome_prefixes.len) - del genome_prefixes - genome_prefixes = alphabet_uppercase.Copy() - - //create animal gene sequences - while(spawn_types_animal.len && genome_prefixes.len) - var/datum/genesequence/new_sequence = new/datum/genesequence() - new_sequence.spawned_type_text = pick(spawn_types_animal) - new_sequence.spawned_type = text2path(new_sequence.spawned_type_text) - spawn_types_animal -= new_sequence.spawned_type_text - - var/prefixletter = pick(genome_prefixes) - genome_prefixes -= prefixletter - while(new_sequence.full_genome_sequence.len < 7) - new_sequence.full_genome_sequence.Add("[prefixletter][pick(alphabet_uppercase)][pick(alphabet_uppercase)][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)]") - - all_animal_genesequences.Add(new_sequence) - - //create plant gene sequences - while(spawn_types_plant.len && genome_prefixes.len) - var/datum/genesequence/new_sequence = new/datum/genesequence() - new_sequence.spawned_type = pick(spawn_types_plant) - spawn_types_plant -= new_sequence.spawned_type_text - - var/prefixletter = pick(genome_prefixes) - genome_prefixes -= prefixletter - while(new_sequence.full_genome_sequence.len < 7) - new_sequence.full_genome_sequence.Add("[prefixletter][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)][pick(alphabet_uppercase)][pick(alphabet_uppercase)]") - - all_plant_genesequences.Add(new_sequence) - -#undef XENOARCH_SPAWN_CHANCE -#undef DIGSITESIZE_LOWER -#undef DIGSITESIZE_UPPER -#undef ARTIFACTSPAWNNUM_LOWER -#undef ARTIFACTSPAWNNUM_UPPER + +/datum/controller/game_controller + var/list/all_animal_genesequences = list() + var/list/all_plant_genesequences = list() + var/list/genome_prefixes = null + var/list/artifact_spawning_turfs = list() + var/list/digsite_spawning_turfs = list() + + var/list/spawn_types_animal = list("/mob/living/carbon/slime",\ + "/mob/living/simple_animal/hostile/alien",\ + "/mob/living/simple_animal/hostile/alien/drone",\ + "/mob/living/simple_animal/hostile/alien/sentinel",\ + "/mob/living/simple_animal/hostile/giant_spider",\ + "/mob/living/simple_animal/hostile/giant_spider/hunter",\ + "/mob/living/simple_animal/hostile/giant_spider/nurse",\ + "/mob/living/simple_animal/hostile/creature",\ + "/mob/living/simple_animal/hostile/samak",\ + "/mob/living/simple_animal/hostile/diyaab",\ + "/mob/living/simple_animal/hostile/shantak",\ + "/mob/living/simple_animal/tindalos",\ + "/mob/living/simple_animal/yithian") + + var/list/spawn_types_plant = list("/obj/item/seeds/walkingmushroommycelium",\ + "/obj/item/seeds/killertomatoseed",\ + "/obj/item/seeds/shandseed", + "/obj/item/seeds/mtearseed", + "/obj/item/seeds/thaadra",\ + "/obj/item/seeds/telriis",\ + "/obj/item/seeds/jurlmah",\ + "/obj/item/seeds/amauri",\ + "/obj/item/seeds/gelthi",\ + "/obj/item/seeds/vale",\ + "/obj/item/seeds/surik") + +#define XENOARCH_SPAWN_CHANCE 0.5 +#define DIGSITESIZE_LOWER 4 +#define DIGSITESIZE_UPPER 12 +#define ARTIFACTSPAWNNUM_LOWER 6 +#define ARTIFACTSPAWNNUM_UPPER 12 + +datum/controller/game_controller/proc/SetupXenoarch() + //create digsites + for(var/turf/simulated/mineral/M in block(locate(1,1,1), locate(world.maxx, world.maxy, world.maxz))) + if(isnull(M.geologic_data)) + M.geologic_data = new/datum/geosample(M) + + if(!prob(XENOARCH_SPAWN_CHANCE)) + continue + + digsite_spawning_turfs.Add(M) + var/digsite = get_random_digsite_type() + var/target_digsite_size = rand(DIGSITESIZE_LOWER, DIGSITESIZE_UPPER) + var/list/processed_turfs = list() + var/list/turfs_to_process = list(M) + while(turfs_to_process.len) + var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process) + + if(target_digsite_size > 1) + var/list/viable_adjacent_turfs = orange(1, archeo_turf) + for(var/turf/simulated/mineral/T in orange(1, archeo_turf)) + if(T.finds) + continue + if(T in processed_turfs) + continue + viable_adjacent_turfs.Add(T) + + for(var/turf/simulated/mineral/T in viable_adjacent_turfs) + if(prob(target_digsite_size/viable_adjacent_turfs.len)) + turfs_to_process.Add(T) + target_digsite_size -= 1 + if(target_digsite_size <= 0) + break + + processed_turfs.Add(archeo_turf) + if(isnull(archeo_turf.finds)) + archeo_turf.finds = list() + if(prob(50)) + archeo_turf.finds.Add(new /datum/find(digsite, rand(5,95))) + else if(prob(75)) + archeo_turf.finds.Add(new /datum/find(digsite, rand(5,45))) + archeo_turf.finds.Add(new /datum/find(digsite, rand(55,95))) + else + archeo_turf.finds.Add(new /datum/find(digsite, rand(5,30))) + archeo_turf.finds.Add(new /datum/find(digsite, rand(35,75))) + archeo_turf.finds.Add(new /datum/find(digsite, rand(75,95))) + + //sometimes a find will be close enough to the surface to show + var/datum/find/F = archeo_turf.finds[1] + if(F.excavation_required <= F.view_range) + archeo_turf.archaeo_overlay = "overlay_archaeo[rand(1,3)]" + archeo_turf.overlays += archeo_turf.archaeo_overlay + + //have a chance for an artifact to spawn here, but not in animal or plant digsites + if(isnull(M.artifact_find) && digsite != 1 && digsite != 2) + artifact_spawning_turfs.Add(archeo_turf) + + //create artifact machinery + var/num_artifacts_spawn = rand(ARTIFACTSPAWNNUM_LOWER, ARTIFACTSPAWNNUM_UPPER) + while(artifact_spawning_turfs.len > num_artifacts_spawn) + pick_n_take(artifact_spawning_turfs) + + var/list/artifacts_spawnturf_temp = artifact_spawning_turfs.Copy() + while(artifacts_spawnturf_temp.len > 0) + var/turf/simulated/mineral/artifact_turf = pop(artifacts_spawnturf_temp) + artifact_turf.artifact_find = new() + + //make sure we have some prefixes for the gene sequences + if(!genome_prefixes) + genome_prefixes = alphabet_uppercase.Copy() + if(!genome_prefixes.len) + qdel(genome_prefixes) + genome_prefixes = alphabet_uppercase.Copy() + + //create animal gene sequences + while(spawn_types_animal.len && genome_prefixes.len) + var/datum/genesequence/new_sequence = new/datum/genesequence() + new_sequence.spawned_type_text = pick(spawn_types_animal) + new_sequence.spawned_type = text2path(new_sequence.spawned_type_text) + spawn_types_animal -= new_sequence.spawned_type_text + + var/prefixletter = pick(genome_prefixes) + genome_prefixes -= prefixletter + while(new_sequence.full_genome_sequence.len < 7) + new_sequence.full_genome_sequence.Add("[prefixletter][pick(alphabet_uppercase)][pick(alphabet_uppercase)][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)]") + + all_animal_genesequences.Add(new_sequence) + + //create plant gene sequences + while(spawn_types_plant.len && genome_prefixes.len) + var/datum/genesequence/new_sequence = new/datum/genesequence() + new_sequence.spawned_type = pick(spawn_types_plant) + spawn_types_plant -= new_sequence.spawned_type_text + + var/prefixletter = pick(genome_prefixes) + genome_prefixes -= prefixletter + while(new_sequence.full_genome_sequence.len < 7) + new_sequence.full_genome_sequence.Add("[prefixletter][pick(1,2,3,4,5,6,7,8,9,0)][pick(1,2,3,4,5,6,7,8,9,0)][pick(alphabet_uppercase)][pick(alphabet_uppercase)]") + + all_plant_genesequences.Add(new_sequence) + +#undef XENOARCH_SPAWN_CHANCE +#undef DIGSITESIZE_LOWER +#undef DIGSITESIZE_UPPER +#undef ARTIFACTSPAWNNUM_LOWER +#undef ARTIFACTSPAWNNUM_UPPER diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm index c189273bd5..fc50c956e7 100644 --- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm +++ b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm @@ -190,7 +190,7 @@ p = min(p, 100) icon_state = "anodev[round(p,25)]" -/obj/item/weapon/anodevice/Del() +/obj/item/weapon/anodevice/Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm index 9f498d3faa..b14c892cd0 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm @@ -306,10 +306,10 @@ M.weakened = min(M.weakened, 3) src.visible_message("\blue \icon[src] [src] deactivates with a gentle shudder.") - del(suspension_field) + qdel(suspension_field) icon_state = "suspension2" -/obj/machinery/suspension_gen/Del() +/obj/machinery/suspension_gen/Destroy() //safety checks: clear the field and drop anything it's holding deactivate() ..() @@ -341,7 +341,7 @@ density = 1 var/field_type = "chlorine" -/obj/effect/suspension_field/Del() +/obj/effect/suspension_field/Destroy() for(var/obj/I in src) I.loc = src.loc ..() diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm index 7c357b53da..0ed24ad248 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm @@ -32,7 +32,7 @@ /obj/item/device/core_sampler/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/evidencebag)) if(num_stored_bags < 10) - del(W) + qdel(W) num_stored_bags += 1 user << "\blue You insert the [W] into the core sampler." else diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm index 425b3e0dc3..e242838a1e 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm @@ -118,11 +118,11 @@ if(index <= positive_locations.len) var/datum/depth_scan/D = positive_locations[index] positive_locations.Remove(D) - del(D) + qdel(D) else //GC will hopefully pick them up before too long positive_locations = list() - del(current) + qdel(current) else if(href_list["close"]) usr.unset_machine() usr << browse(null, "window=depth_scanner") diff --git a/code/modules/research/xenoarchaeology/tools/tools_locater.dm b/code/modules/research/xenoarchaeology/tools/tools_locater.dm index ad84f0e010..fb6adf795a 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_locater.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_locater.dm @@ -16,7 +16,7 @@ ..() processing_objects.Add(src) -/obj/item/device/beacon_locator/Del() +/obj/item/device/beacon_locator/Destroy() processing_objects.Remove(src) ..() diff --git a/code/modules/scripting/Parser/Keywords.dm b/code/modules/scripting/Parser/Keywords.dm index bdd33d8bda..7d933c52ef 100644 --- a/code/modules/scripting/Parser/Keywords.dm +++ b/code/modules/scripting/Parser/Keywords.dm @@ -46,7 +46,7 @@ var/const/Represents a special statement in the code triggered by a keyword. nS_Keyword New(inline=0) if(inline) - del src + qdel(src) kwReturn Parse(n_Parser/nS_Parser/parser) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index d783c35338..8210894bd1 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -24,7 +24,7 @@ /obj/machinery/shield/proc/check_failure() if (src.health <= 0) visible_message("\blue The [src] dissipates!") - del(src) + qdel(src) return /obj/machinery/shield/New() @@ -32,7 +32,7 @@ ..() update_nearby_tiles(need_rebuild=1) -/obj/machinery/shield/Del() +/obj/machinery/shield/Destroy() opacity = 0 density = 0 update_nearby_tiles() @@ -54,7 +54,6 @@ playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1) check_failure() - opacity = 1 spawn(20) if(src) opacity = 0 @@ -78,25 +77,25 @@ switch(severity) if(1.0) if (prob(75)) - del(src) + qdel(src) if(2.0) if (prob(50)) - del(src) + qdel(src) if(3.0) if (prob(25)) - del(src) + qdel(src) return /obj/machinery/shield/emp_act(severity) switch(severity) if(1) - del(src) + qdel(src) if(2) if(prob(50)) - del(src) + qdel(src) /obj/machinery/shield/blob_act() - del(src) + qdel(src) /obj/machinery/shield/hitby(AM as mob|obj) @@ -145,11 +144,10 @@ use_power = 0 idle_power_usage = 0 -/obj/machinery/shieldgen/Del() +/obj/machinery/shieldgen/Destroy() collapse_shields() ..() - /obj/machinery/shieldgen/proc/shields_up() if(active) return 0 //If it's already turned on, how did this get called? @@ -183,7 +181,7 @@ /obj/machinery/shieldgen/proc/collapse_shields() for(var/obj/machinery/shield/shield_tile in deployed_shields) - del(shield_tile) + qdel(shield_tile) /obj/machinery/shieldgen/power_change() ..() @@ -200,7 +198,7 @@ if(malfunction) if(deployed_shields.len && prob(5)) - del(pick(deployed_shields)) + qdel(pick(deployed_shields)) else if (check_delay <= 0) create_shields() @@ -223,7 +221,7 @@ if(health <= 0) spawn(0) explosion(get_turf(src.loc), 0, 0, 1, 0, 0, 0) - del(src) + qdel(src) update_icon() return diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 7558c19ad6..074d3abbfa 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -17,7 +17,7 @@ ..() update_nearby_tiles() -/obj/effect/energy_field/Del() +/obj/effect/energy_field/Destroy() update_nearby_tiles() ..() diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 95b3276bd3..d20e2743fd 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -6,7 +6,7 @@ icon_state = "Shield_Gen" anchored = 0 density = 1 - req_access = list(access_teleporter) + req_access = list(access_engine_equip) var/active = 0 var/power = 0 var/state = 0 @@ -199,14 +199,14 @@ T2 = T if(locate(/obj/machinery/shieldwall) in T) F = (locate(/obj/machinery/shieldwall) in T) - del(F) + qdel(F) if(locate(/obj/machinery/shieldwallgen) in T) G = (locate(/obj/machinery/shieldwallgen) in T) if(!G.active) break -/obj/machinery/shieldwallgen/Del() +/obj/machinery/shieldwallgen/Destroy() src.cleanup(1) src.cleanup(2) src.cleanup(4) @@ -252,9 +252,9 @@ else B.storedpower -= generate_power_usage else - del(src) //need at least two generator posts + qdel(src) //need at least two generator posts -/obj/machinery/shieldwall/Del() +/obj/machinery/shieldwall/Destroy() update_nearby_tiles() ..() @@ -265,11 +265,11 @@ /obj/machinery/shieldwall/process() if(needs_power) if(isnull(gen_primary)||isnull(gen_secondary)) - del(src) + qdel(src) return if(!(gen_primary.active)||!(gen_secondary.active)) - del(src) + qdel(src) return if(prob(50)) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 7483dd02fb..9f89ede039 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -39,6 +39,12 @@ field = new/list() ..() +/obj/machinery/shield_gen/Destroy() + for(var/obj/effect/energy_field/D in field) + field.Remove(D) + D.loc = null + ..() + /obj/machinery/shield_gen/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/C = W @@ -208,7 +214,7 @@ for(var/turf/O in covered_turfs) var/obj/effect/energy_field/E = new(O) field.Add(E) - del covered_turfs + qdel(covered_turfs) for(var/mob/M in view(5,src)) M << "\icon[src] You hear heavy droning start up." diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index 289cf4d7b0..7c0ca83b80 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -1,6 +1,19 @@ /datum/shuttle/ferry/escape_pod var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller +/datum/shuttle/ferry/escape_pod/init_docking_controllers() + ..() + arming_controller = locate(dock_target_station) + if(!istype(arming_controller)) + world << "warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!" + + if(docking_controller) + var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = docking_controller.master + if(!istype(controller_master)) + world << "warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!" + else + controller_master.pod = src + /datum/shuttle/ferry/escape_pod/can_launch() if(arming_controller && !arming_controller.armed) //must be armed return 0 diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 0442144b17..03942ee5f0 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -12,6 +12,12 @@ var/arrive_time = 0 //the time at which the shuttle arrives when long jumping +/datum/shuttle/proc/init_docking_controllers() + if(docking_controller_tag) + docking_controller = locate(docking_controller_tag) + if(!istype(docking_controller)) + world << "warning: shuttle with docking tag [docking_controller_tag] could not find it's controller!" + /datum/shuttle/proc/short_jump(var/area/origin,var/area/destination) if(moving_status != SHUTTLE_IDLE) return @@ -99,7 +105,7 @@ for(var/atom/movable/AM as mob|obj in T) AM.Move(D) if(istype(T, /turf/simulated)) - del(T) + qdel(T) for(var/mob/living/carbon/bug in destination) bug.gib() diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index 8e3fd5fb0b..078d1e9a5a 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -14,6 +14,16 @@ var/datum/computer/file/embedded_program/docking/docking_controller_station var/datum/computer/file/embedded_program/docking/docking_controller_offsite +/datum/shuttle/ferry/multidock/init_docking_controllers() + if(docking_controller_tag_station) + docking_controller_station = locate(docking_controller_tag_station) + if(!istype(docking_controller_station)) + world << "warning: shuttle with docking tag [docking_controller_station] could not find it's controller!" + if(docking_controller_tag_offsite) + docking_controller_offsite = locate(docking_controller_tag_offsite) + if(!istype(docking_controller_offsite)) + world << "warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!" + /datum/shuttle/ferry/multidock/move(var/area/origin,var/area/destination) ..(origin, destination) if (!location) diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index e13d1da4ea..141cf97d8a 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -14,19 +14,45 @@ var/area/interim var/area/last_departed + var/start_location + var/last_location var/list/destinations + var/list/destination_dock_controller_tags = list() //optional, in case the shuttle has multiple docking ports like the ERT shuttle (even though that isn't a multi_shuttle) + var/list/destination_dock_controllers = list() + var/list/destination_dock_targets = list() var/area/origin var/return_warning = 0 /datum/shuttle/multi_shuttle/New() ..() + +/datum/shuttle/multi_shuttle/init_docking_controllers() + ..() + for(var/destination in destinations) + var/controller_tag = destination_dock_controller_tags[destination] + if(!controller_tag) + destination_dock_controllers[destination] = docking_controller + else + var/datum/computer/file/embedded_program/docking/C = locate(controller_tag) + + if(!istype(C)) + world << "warning: shuttle with docking tag [controller_tag] could not find it's controller!" + else + destination_dock_controllers[destination] = C + + //might as well set this up here. if(origin) last_departed = origin + last_location = start_location + +/datum/shuttle/multi_shuttle/current_dock_target() + return destination_dock_targets[last_location] /datum/shuttle/multi_shuttle/move(var/area/origin, var/area/destination) ..() last_move = world.time if (destination == src.origin) returned_home = 1 + docking_controller = destination_dock_controllers[last_location] /datum/shuttle/multi_shuttle/proc/announce_departure() @@ -73,9 +99,53 @@ dat += "
          Toggle cloaking field
          " dat += "Move ship
          " dat += "Return to base" + + //Docking + dat += "


          " + if(MS.skip_docking_checks()) + dat += "Docking Status: Not in use.
          " + else + var/override_en = MS.docking_controller.override_enabled + var/docking_status = MS.docking_controller.get_docking_status() + + dat += "Docking Status: " + switch(docking_status) + if("undocked") + dat += "Undocked" + if("docking") + dat += "Docking" + if("undocking") + dat += "Undocking" + if("docked") + dat += "Docked" + + if(override_en) dat += " (Override Enabled)" + + dat += ". \[Refresh\]

          " + + switch(docking_status) + if("undocked") + dat += "Dock" + if("docked") + dat += "Undock" user << browse("[dat]", "window=[shuttle_tag]shuttlecontrol;size=300x600") +//check if we're undocked, give option to force launch +/obj/machinery/computer/shuttle_control/proc/check_docking(datum/shuttle/multi_shuttle/MS) + if(MS.skip_docking_checks() || MS.docking_controller.can_launch()) + return 1 + + var/choice = alert("The shuttle is currently docked! Please undock before continuing.","Error","Cancel","Force Launch") + if(choice == "Cancel") + return 0 + + choice = alert("Forcing a shuttle launch while docked may result in severe injury, death and/or damage to property. Are you sure you wish to continue?", "Force Launch", "Force Launch", "Cancel") + if(choice == "Cancel") + return 0 + + return 1 + /obj/machinery/computer/shuttle_control/multi/Topic(href, href_list) if(..()) return 1 @@ -88,16 +158,35 @@ //world << "multi_shuttle: last_departed=[MS.last_departed], origin=[MS.origin], interim=[MS.interim], travel_time=[MS.move_time]" + if(href_list["refresh"]) + updateUsrDialog() + return + if (MS.moving_status != SHUTTLE_IDLE) usr << "\blue [shuttle_tag] vessel is moving." return + + if(href_list["dock_command"]) + MS.dock() + return + + if(href_list["undock_command"]) + MS.undock() + return if(href_list["start"]) - if(MS.at_origin) usr << "\red You are already at your home base." return + + if((MS.last_move + MS.cooldown*10) > world.time) + usr << "\red The ship's drive is inoperable while the engines are charging." + return + if(!check_docking(MS)) + updateUsrDialog() + return + if(!MS.return_warning) usr << "\red Returning to your home base will end your mission. If you are sure, press the button again." //TODO: Actually end the mission. @@ -106,6 +195,7 @@ MS.long_jump(MS.last_departed,MS.origin,MS.interim,MS.move_time) MS.last_departed = MS.origin + MS.last_location = MS.start_location MS.at_origin = 1 if(href_list["toggle_cloak"]) @@ -117,7 +207,11 @@ if((MS.last_move + MS.cooldown*10) > world.time) usr << "\red The ship's drive is inoperable while the engines are charging." return - + + if(!check_docking(MS)) + updateUsrDialog() + return + var/choice = input("Select a destination.") as null|anything in MS.destinations if(!choice) return @@ -131,6 +225,7 @@ MS.long_jump(MS.last_departed, MS.destinations[choice], MS.interim, MS.move_time) MS.last_departed = MS.destinations[choice] + MS.last_location = choice return else if(choice == MS.origin) @@ -139,5 +234,6 @@ MS.short_jump(MS.last_departed, MS.destinations[choice]) MS.last_departed = MS.destinations[choice] + MS.last_location = choice updateUsrDialog() diff --git a/code/modules/spells/aoe_turf/aoe_turf.dm b/code/modules/spells/aoe_turf/aoe_turf.dm new file mode 100644 index 0000000000..9a70eb18c6 --- /dev/null +++ b/code/modules/spells/aoe_turf/aoe_turf.dm @@ -0,0 +1,25 @@ +/* +Aoe turf spells target a ring of tiles around the user +This ring has an outer radius (range) and an inner radius (inner_radius) +Aoe turf spells have two useful flags: IGNOREDENSE and IGNORESPACE. These are explained in setup.dm +*/ + +/spell/aoe_turf //affects all turfs in view or range (depends) + spell_flags = IGNOREDENSE + var/inner_radius = -1 //for all your ring spell needs + +/spell/aoe_turf/choose_targets(mob/user = usr) + var/list/targets = list() + + for(var/turf/target in view_or_range(range,user,selection_type)) + if(!(target in view_or_range(inner_radius,user,selection_type))) + if(target.density && (spell_flags & IGNOREDENSE)) + continue + if(istype(target, /turf/space) && (spell_flags & IGNORESPACE)) + continue + targets += target + + if(!targets.len) //doesn't waste the spell + return + + return targets \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/blink.dm b/code/modules/spells/aoe_turf/blink.dm new file mode 100644 index 0000000000..f78572a3ba --- /dev/null +++ b/code/modules/spells/aoe_turf/blink.dm @@ -0,0 +1,34 @@ +/spell/aoe_turf/blink + name = "Blink" + desc = "This spell randomly teleports you a short distance." + + school = "abjuration" + charge_max = 20 + spell_flags = Z2NOCAST | IGNOREDENSE | IGNORESPACE + invocation = "none" + invocation_type = SpI_NONE + range = 7 + inner_radius = 1 + cooldown_min = 5 //4 deciseconds reduction per rank + hud_state = "wiz_blink" + +/spell/aoe_turf/blink/cast(var/list/targets, mob/user) + if(!targets.len) + return + + var/turf/T = pick(targets) + var/turf/starting = get_turf(user) + if(T) + if(user.buckled) + user.buckled = null + user.forceMove(T) + + var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() + smoke.set_up(3, 0, starting) + smoke.start() + + smoke = new() + smoke.set_up(3, 0, T) + smoke.start() + + return diff --git a/code/modules/spells/aoe_turf/charge.dm b/code/modules/spells/aoe_turf/charge.dm new file mode 100644 index 0000000000..6e7f5b0050 --- /dev/null +++ b/code/modules/spells/aoe_turf/charge.dm @@ -0,0 +1,69 @@ +/spell/aoe_turf/charge + name = "Charge" + desc = "This spell can be used to charge up spent magical artifacts, among other things." + + school = "transmutation" + charge_max = 600 + spell_flags = 0 + invocation = "DIRI CEL" + invocation_type = SpI_WHISPER + range = 0 + cooldown_min = 400 //50 deciseconds reduction per rank + + hud_state = "wiz_charge" + +/spell/aoe_turf/charge/cast(var/list/targets, mob/user) + for(var/turf/T in targets) + depth_cast(T) + +/spell/aoe_turf/charge/proc/depth_cast(var/list/targets) + for(var/atom/A in targets) + if(A.contents.len) + depth_cast(A.contents) + cast_charge(A) + +/spell/aoe_turf/charge/proc/mob_charge(var/mob/living/M) + if(M.spell_list.len != 0) + for(var/spell/S in M.spell_list) + if(!istype(S, /spell/aoe_turf/charge)) + S.charge_counter = S.charge_max + M <<"You feel raw magic flowing through you, it feels good!" + else + M <<"You feel very strange for a moment, but then it passes." + return M + +/spell/aoe_turf/charge/proc/cast_charge(var/atom/target) + var/atom/charged_item + + if(istype(target, /mob/living)) + charged_item = mob_charge(target) + + if(istype(target, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = target + if(G.affecting) + var/mob/M = G.affecting + charged_item = mob_charge(M) + + if(istype(target, /obj/item/weapon/spellbook/oneuse)) + var/obj/item/weapon/spellbook/oneuse/I = target + if(prob(50)) + I.visible_message("[I] catches fire!") + qdel(I) + else + I.used = 0 + charged_item = I + + if(istype(target, /obj/item/weapon/cell/)) + var/obj/item/weapon/cell/C = target + if(prob(80)) + C.maxcharge -= 200 + if(C.maxcharge <= 1) //Div by 0 protection + C.maxcharge = 1 + C.charge = C.maxcharge + charged_item = C + + if(!charged_item) + return 0 + else + charged_item.visible_message("[charged_item] suddenly sparks with energy!") + return 1 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm new file mode 100644 index 0000000000..6dff0fdb65 --- /dev/null +++ b/code/modules/spells/aoe_turf/conjure/conjure.dm @@ -0,0 +1,74 @@ +/* +Conjure spells spawn things (mobs, objs, turfs) in their summon_type +How they spawn stuff is decided by behaviour vars, which are explained below +*/ + +/spell/aoe_turf/conjure + name = "Conjure" + desc = "This spell conjures objs of the specified types in range." + + school = "conjuration" //funny, that + + var/list/summon_type = list() //determines what exactly will be summoned + //should be text, like list("/obj/machinery/bot/ed209") + + range = 0 //default values: only spawn on the player tile + selection_type = "view" + + duration = 0 // 0=permanent, any other time in deciseconds - how long the summoned objects last for + var/summon_amt = 1 //amount of objects summoned + var/summon_exclusive = 0 //spawn one of everything, instead of random things + + var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet + //should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example + + cast_sound = 'sound/items/welder.ogg' + +/spell/aoe_turf/conjure/cast(list/targets, mob/user) + playsound(get_turf(user), cast_sound, 50, 1) + + for(var/i=1,i <= summon_amt,i++) + if(!targets.len) + break + var/summoned_object_type + if(summon_exclusive) + if(!summon_type.len) + break + summoned_object_type = summon_type[1] + summon_type -= summoned_object_type + else + summoned_object_type = pick(summon_type) + var/turf/spawn_place = pick(targets) + if(spell_flags & IGNOREPREV) + targets -= spawn_place + + var/atom/summoned_object + if(ispath(summoned_object_type,/turf)) + if(istype(get_turf(user),/turf/simulated/shuttle) || istype(spawn_place, /turf/simulated/shuttle)) + user << "" + continue + spawn_place.ChangeTurf(summoned_object_type) + summoned_object = spawn_place + else + summoned_object = new summoned_object_type(spawn_place) + var/atom/movable/overlay/animation = new /atom/movable/overlay(spawn_place) + animation.name = "conjure" + animation.density = 0 + animation.anchored = 1 + animation.icon = 'icons/effects/effects.dmi' + animation.layer = 3 + animation.master = summoned_object + + for(var/varName in newVars) + if(varName in summoned_object.vars) + summoned_object.vars[varName] = newVars[varName] + + if(duration) + spawn(duration) + if(summoned_object && !istype(summoned_object, /turf)) + qdel(summoned_object) + conjure_animation(animation, spawn_place) + return + +/spell/aoe_turf/conjure/proc/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) + qdel(animation) \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/construct.dm b/code/modules/spells/aoe_turf/conjure/construct.dm new file mode 100644 index 0000000000..d5a2de92e2 --- /dev/null +++ b/code/modules/spells/aoe_turf/conjure/construct.dm @@ -0,0 +1,137 @@ +//////////////////////////////Construct Spells///////////////////////// + +/spell/aoe_turf/conjure/construct + name = "Artificer" + desc = "This spell conjures a construct which may be controlled by Shades" + + school = "conjuration" + charge_max = 600 + spell_flags = 0 + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/structure/constructshell) + + hud_state = "artificer" + +/spell/aoe_turf/conjure/construct/lesser + charge_max = 1800 + summon_type = list(/obj/structure/constructshell/cult) + hud_state = "const_shell" + override_base = "const" + +/spell/aoe_turf/conjure/floor + name = "Floor Construction" + desc = "This spell constructs a cult floor" + + charge_max = 20 + spell_flags = Z2NOCAST | CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + summon_type = list(/turf/simulated/floor/engine/cult) + + hud_state = "const_floor" + +/spell/aoe_turf/conjure/floor/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) + animation.icon_state = "cultfloor" + flick("cultfloor",animation) + spawn(10) + qdel(animation) + +/spell/aoe_turf/conjure/wall + name = "Lesser Construction" + desc = "This spell constructs a cult wall" + + charge_max = 100 + spell_flags = Z2NOCAST | CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + summon_type = list(/turf/simulated/wall/cult) + + hud_state = "const_wall" + +/spell/aoe_turf/conjure/wall/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) + animation.icon_state = "cultwall" + flick("cultwall",animation) + spawn(10) + qdel(animation) + +/spell/aoe_turf/conjure/wall/reinforced + name = "Greater Construction" + desc = "This spell constructs a reinforced metal wall" + + charge_max = 300 + spell_flags = Z2NOCAST + invocation = "none" + invocation_type = SpI_NONE + range = 0 + cast_delay = 50 + + summon_type = list(/turf/simulated/wall/r_wall) + +/spell/aoe_turf/conjure/soulstone + name = "Summon Soulstone" + desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space" + + charge_max = 3000 + spell_flags = 0 + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/item/device/soulstone) + + hud_state = "const_stone" + override_base = "const" + +/spell/aoe_turf/conjure/pylon + name = "Red Pylon" + desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source." + + charge_max = 200 + spell_flags = CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/structure/cult/pylon) + + hud_state = "const_pylon" + +/spell/aoe_turf/conjure/pylon/cast(list/targets) + ..() + var/turf/spawn_place = pick(targets) + for(var/obj/structure/cult/pylon/P in spawn_place.contents) + if(P.isbroken) + P.repair(usr) + continue + return + +/spell/aoe_turf/conjure/forcewall/lesser + name = "Shield" + desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats" + + charge_max = 300 + spell_flags = 0 + invocation = "none" + invocation_type = SpI_NONE + range = 0 + summon_type = list(/obj/effect/forcefield/cult) + duration = 200 + + hud_state = "const_juggwall" + +//Code for the Juggernaut construct's forcefield, that seemed like a good place to put it. +/obj/effect/forcefield/cult + desc = "That eerie looking obstacle seems to have been pulled from another dimension through sheer force" + name = "Juggerwall" + icon = 'icons/effects/effects.dmi' + icon_state = "m_shield_cult" + l_color = "#B40000" + luminosity = 2 + +/obj/effect/forcefield/cult/cultify() + return diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm new file mode 100644 index 0000000000..0c5ada5bd1 --- /dev/null +++ b/code/modules/spells/aoe_turf/conjure/forcewall.dm @@ -0,0 +1,52 @@ +/spell/aoe_turf/conjure/forcewall + name = "Forcewall" + desc = "Create a wall of pure energy at your location." + summon_type = list(/obj/effect/forcefield) + duration = 300 + charge_max = 100 + spell_flags = 0 + range = 0 + cast_sound = null + + hud_state = "wiz_shield" + +/spell/aoe_turf/conjure/forcewall/mime + name = "Invisible wall" + desc = "Create an invisible wall on your location." + school = "mime" + panel = "Mime" + summon_type = list(/obj/effect/forcefield/mime) + invocation_type = SpI_EMOTE + invocation = "mimes placing their hands on a flat surfacing, and pushing against it." + charge_max = 300 + cast_sound = null + + override_base = "grey" + hud_state = "mime_wall" + +/obj/effect/forcefield + desc = "A space wizard's magic wall." + name = "FORCEWALL" + icon = 'icons/effects/effects.dmi' + icon_state = "m_shield" + anchored = 1.0 + opacity = 0 + density = 1 + unacidable = 1 + +/obj/effect/forcefield/bullet_act(var/obj/item/projectile/Proj, var/def_zone) + var/turf/T = get_turf(src.loc) + if(T) + for(var/mob/M in T) + Proj.on_hit(M,M.bullet_act(Proj, def_zone)) + return + +/obj/effect/forcefield/mime + icon_state = "empty" + name = "invisible wall" + desc = "You have a bad feeling about this." + +/obj/effect/forcefield/cultify() + new /obj/effect/forcefield/cult(get_turf(src)) + qdel(src) + return diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm new file mode 100644 index 0000000000..5192ecb664 --- /dev/null +++ b/code/modules/spells/aoe_turf/disable_tech.dm @@ -0,0 +1,23 @@ +/spell/aoe_turf/disable_tech + name = "Disable Tech" + desc = "This spell disables all weapons, cameras and most other technology in range." + charge_max = 400 + spell_flags = NEEDSCLOTHES + invocation = "NEC CANTIO" + invocation_type = SpI_SHOUT + selection_type = "range" + range = 0 + inner_radius = -1 + + cooldown_min = 200 //50 deciseconds reduction per rank + + var/emp_heavy = 6 + var/emp_light = 10 + + hud_state = "wiz_tech" + +/spell/aoe_turf/disable_tech/cast(list/targets) + + for(var/turf/target in targets) + empulse(get_turf(target), emp_heavy, emp_light) + return \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm new file mode 100644 index 0000000000..3b3cae83d6 --- /dev/null +++ b/code/modules/spells/aoe_turf/knock.dm @@ -0,0 +1,44 @@ +/spell/aoe_turf/knock + name = "Knock" + desc = "This spell opens nearby doors and does not require wizard garb." + + school = "transmutation" + charge_max = 100 + spell_flags = 0 + invocation = "AULIE OXIN FIERA" + invocation_type = SpI_WHISPER + range = 3 + cooldown_min = 20 //20 deciseconds reduction per rank + + hud_state = "wiz_knock" + +/spell/aoe_turf/knock/cast(list/targets) + for(var/turf/T in targets) + for(var/obj/machinery/door/door in T.contents) + spawn(1) + if(istype(door,/obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/AL = door //casting is important + AL.locked = 0 + door.open() + return + + +//Construct version +/spell/aoe_turf/knock/harvester + name = "Disintegrate Doors" + desc = "No door shall stop you." + + spell_flags = CONSTRUCT_CHECK + + charge_max = 100 + invocation = "" + invocation_type = "silent" + range = 5 + + hud_state = "const_knock" + +/spell/aoe_turf/knock/harvester/cast(list/targets) + for(var/turf/T in targets) + for(var/obj/machinery/door/door in T.contents) + spawn door.cultify() + return \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/smoke.dm b/code/modules/spells/aoe_turf/smoke.dm new file mode 100644 index 0000000000..e055fc702f --- /dev/null +++ b/code/modules/spells/aoe_turf/smoke.dm @@ -0,0 +1,17 @@ +/spell/aoe_turf/smoke + name = "Smoke" + desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." + + school = "conjuration" + charge_max = 120 + spell_flags = 0 + invocation = "none" + invocation_type = SpI_NONE + range = 1 + inner_radius = -1 + cooldown_min = 20 //25 deciseconds reduction per rank + + smoke_spread = 2 + smoke_amt = 5 + + hud_state = "wiz_smoke" diff --git a/code/modules/spells/aoe_turf/summons.dm b/code/modules/spells/aoe_turf/summons.dm new file mode 100644 index 0000000000..996b583585 --- /dev/null +++ b/code/modules/spells/aoe_turf/summons.dm @@ -0,0 +1,41 @@ +/spell/aoe_turf/conjure/summonEdSwarm //test purposes + name = "Dispense Wizard Justice" + desc = "This spell dispenses wizard justice." + + summon_type = list(/mob/living/bot/secbot/ed209) + summon_amt = 10 + range = 3 + newVars = list("emagged" = 1,"name" = "Wizard's Justicebot") + + hud_state = "wiz_ed" + +/spell/aoe_turf/conjure/carp + name = "Summon Carp" + desc = "This spell conjures a simple carp." + + school = "conjuration" + charge_max = 1200 + spell_flags = NEEDSCLOTHES + invocation = "NOUK FHUNMM SACP RISSKA" + invocation_type = SpI_SHOUT + range = 1 + + summon_type = list(/mob/living/simple_animal/hostile/carp) + + hud_state = "wiz_carp" + +/spell/aoe_turf/conjure/creature + name = "Summon Creature Swarm" + desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" + + school = "conjuration" + charge_max = 1200 + spell_flags = 0 + invocation = "IA IA" + invocation_type = SpI_SHOUT + summon_amt = 10 + range = 3 + + summon_type = list(/mob/living/simple_animal/hostile/creature) + + hud_state = "wiz_creature" \ No newline at end of file diff --git a/code/modules/spells/area_teleport.dm b/code/modules/spells/area_teleport.dm deleted file mode 100644 index 05a8e655ed..0000000000 --- a/code/modules/spells/area_teleport.dm +++ /dev/null @@ -1,82 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/area_teleport - name = "Area teleport" - desc = "This spell teleports you to a type of area of your selection." - - var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list - var/invocation_area = 1 //if the invocation appends the selected area - -/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1) - var/thearea = before_cast(targets) - if(!thearea || !cast_check(1)) - revert_cast() - return - invocation(thearea) - spawn(0) - if(charge_type == "recharge" && recharge) - start_recharge() - cast(targets,thearea) - after_cast(targets) - -/obj/effect/proc_holder/spell/targeted/area_teleport/before_cast(list/targets) - var/A = null - - if(!randomise_selection) - A = input("Area to teleport to", "Teleport", A) in teleportlocs - else - A = pick(teleportlocs) - - var/area/thearea = teleportlocs[A] - - return thearea - -/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea) - for(var/mob/living/target in targets) - var/list/L = list() - for(var/turf/T in get_area_turfs(thearea.type)) - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - L+=T - - if(!L.len) - usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." - return - - if(target && target.buckled) - target.buckled.unbuckle_mob() - - var/list/tempL = L - var/attempt = null - var/success = 0 - while(tempL.len) - attempt = pick(tempL) - success = target.Move(attempt) - if(!success) - tempL.Remove(attempt) - else - break - - if(!success) - target.loc = pick(L) - - return - -/obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null) - if(!invocation_area || !chosenarea) - ..() - else - switch(invocation_type) - if("shout") - usr.say("[invocation] [uppertext(chosenarea.name)]") - if(usr.gender==MALE) - playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) - else - playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) - if("whisper") - usr.whisper("[invocation] [uppertext(chosenarea.name)]") - - return \ No newline at end of file diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm new file mode 100644 index 0000000000..0a96b6aa2e --- /dev/null +++ b/code/modules/spells/artifacts.dm @@ -0,0 +1,19 @@ +//////////////////////Scrying orb////////////////////// + +/obj/item/weapon/scrying + name = "scrying orb" + desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." + icon = 'icons/obj/projectiles.dmi' + icon_state = "bluespace" + throw_speed = 3 + throw_range = 7 + throwforce = 10 + damtype = BURN + force = 10 + hitsound = 'sound/items/welder2.ogg' + +/obj/item/weapon/scrying/attack_self(mob/user as mob) + user << "You can see... everything!" + visible_message("[usr] stares into [src], their eyes glazing over.") + announce_ghost_joinleave(user.ghostize(1), 1, "You feel that they used a powerful artifact to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place with their presence.") + return diff --git a/code/modules/spells/conjure.dm b/code/modules/spells/conjure.dm deleted file mode 100644 index 2034bf931f..0000000000 --- a/code/modules/spells/conjure.dm +++ /dev/null @@ -1,87 +0,0 @@ -/obj/effect/proc_holder/spell/aoe_turf/conjure - name = "Conjure" - desc = "This spell conjures objs of the specified types in range." - - var/list/summon_type = list() //determines what exactly will be summoned - //should be text, like list("/obj/machinery/bot/ed209") - - var/summon_lifespan = 0 // 0=permanent, any other time in deciseconds - var/summon_amt = 1 //amount of objects summoned - var/summon_ignore_density = 0 //if set to 1, adds dense tiles to possible spawn places - var/summon_ignore_prev_spawn_points = 0 //if set to 1, each new object is summoned on a new spawn point - - var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet - //should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example - var/delay = 1//Go Go Gadget Inheritance - -/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets) - - for(var/turf/T in targets) - if(T.density && !summon_ignore_density) - targets -= T - playsound(src.loc, 'sound/items/welder.ogg', 50, 1) - - if(do_after(usr,delay)) - for(var/i=0,iSome strange aura is blocking the way!" - src.canmove = 0 - spawn(2) src.canmove = 1 - -/obj/effect/dummy/spell_jaunt/ex_act(blah) - return -/obj/effect/dummy/spell_jaunt/bullet_act(blah) - return \ No newline at end of file diff --git a/code/modules/spells/explosion.dm b/code/modules/spells/explosion.dm deleted file mode 100644 index b93667ab47..0000000000 --- a/code/modules/spells/explosion.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/explosion - name = "Explosion" - desc = "This spell explodes an area." - - var/ex_severe = 1 - var/ex_heavy = 2 - var/ex_light = 3 - var/ex_flash = 4 - -/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets) - - for(var/mob/living/target in targets) - explosion(target.loc,ex_severe,ex_heavy,ex_light,ex_flash) - - return \ No newline at end of file diff --git a/code/modules/spells/general/area_teleport.dm b/code/modules/spells/general/area_teleport.dm new file mode 100644 index 0000000000..77e1ee47c4 --- /dev/null +++ b/code/modules/spells/general/area_teleport.dm @@ -0,0 +1,85 @@ +/spell/area_teleport + name = "Teleport" + desc = "This spell teleports you to a type of area of your selection." + + school = "abjuration" + charge_max = 600 + spell_flags = NEEDSCLOTHES + invocation = "SCYAR NILA" + invocation_type = SpI_SHOUT + cooldown_min = 200 //100 deciseconds reduction per rank + + smoke_spread = 1 + smoke_amt = 5 + + var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list + var/invocation_area = 1 //if the invocation appends the selected area + + cast_sound = 'sound/effects/teleport.ogg' + + hud_state = "wiz_tele" + +/spell/area_teleport/before_cast() + return + +/spell/area_teleport/choose_targets() + var/A = null + + if(!randomise_selection) + A = input("Area to teleport to", "Teleport", A) in teleportlocs + else + A = pick(teleportlocs) + + var/area/thearea = teleportlocs[A] + + return list(thearea) + +/spell/area_teleport/cast(area/thearea, mob/user) + if(!istype(thearea)) + if(istype(thearea, /list)) + thearea = thearea[1] + var/list/L = list() + for(var/turf/T in get_area_turfs(thearea.type)) + if(!T.density) + var/clear = 1 + for(var/obj/O in T) + if(O.density) + clear = 0 + break + if(clear) + L+=T + + if(!L.len) + user <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." + return + + if(user && user.buckled) + user.buckled = null + + var/attempt = null + var/success = 0 + while(L.len) + attempt = pick(L) + success = user.Move(attempt) + if(!success) + L.Remove(attempt) + else + break + + if(!success) + user.loc = pick(L) + + return + +/spell/area_teleport/after_cast() + return + +/spell/area_teleport/invocation(mob/user, area/chosenarea) + if(!istype(chosenarea)) + return //can't have that, can we + if(!invocation_area || !chosenarea) + ..() + else + invocation += "[uppertext(chosenarea.name)]" + ..() + return \ No newline at end of file diff --git a/code/modules/spells/general/rune_write.dm b/code/modules/spells/general/rune_write.dm new file mode 100644 index 0000000000..c110a76ac1 --- /dev/null +++ b/code/modules/spells/general/rune_write.dm @@ -0,0 +1,175 @@ +/spell/rune_write + name = "Scribe a Rune" + desc = "Let's you instantly manifest a working rune." + + school = "evocation" + charge_max = 100 + charge_type = Sp_RECHARGE + invocation_type = SpI_NONE + + spell_flags = CONSTRUCT_CHECK + + hud_state = "const_rune" + + smoke_amt = 1 + +/spell/rune_write/choose_targets(mob/user = usr) + return list(user) + +/spell/rune_write/cast(null, mob/user = usr) + if(!cultwords["travel"]) + runerandom() + var/list/runes = list("Teleport", "Teleport Other", "Spawn a Tome", "Change Construct Type", "Convert", "EMP", "Drain Blood", "See Invisible", "Resurrect", "Hide Runes", "Reveal Runes", "Astral Journey", "Manifest a Ghost", "Imbue Talisman", "Sacrifice", "Wall", "Free Cultist", "Summon Cultist", "Deafen", "Blind", "BloodBoil", "Communicate", "Stun") + var/r = input(user, "Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. + var/obj/effect/rune/R = new /obj/effect/rune(user.loc) + if(istype(user.loc,/turf)) + var/area/A = get_area(user) + log_and_message_admins("created \an [r] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].", user) + switch(r) + if("Teleport") + if(cast_check(1)) + var/beacon + if(user) + beacon = input(user, "Select the last rune", "Rune Scribing") in rnwords + R.word1=cultwords["travel"] + R.word2=cultwords["self"] + R.word3=beacon + R.check_icon() + if("Teleport Other") + if(cast_check(1)) + var/beacon + if(user) + beacon = input(user, "Select the last rune", "Rune Scribing") in rnwords + R.word1=cultwords["travel"] + R.word2=cultwords["other"] + R.word3=beacon + R.check_icon() + if("Spawn a Tome") + if(cast_check(1)) + R.word1=cultwords["see"] + R.word2=cultwords["blood"] + R.word3=cultwords["hell"] + R.check_icon() + if("Change Construct Type") + if(cast_check(1)) + R.word1=cultwords["hell"] + R.word2=cultwords["destroy"] + R.word3=cultwords["other"] + R.check_icon() + if("Convert") + if(cast_check(1)) + R.word1=cultwords["join"] + R.word2=cultwords["blood"] + R.word3=cultwords["self"] + R.check_icon() + if("EMP") + if(cast_check(1)) + R.word1=cultwords["destroy"] + R.word2=cultwords["see"] + R.word3=cultwords["technology"] + R.check_icon() + if("Drain Blood") + if(cast_check(1)) + R.word1=cultwords["travel"] + R.word2=cultwords["blood"] + R.word3=cultwords["self"] + R.check_icon() + if("See Invisible") + if(cast_check(1)) + R.word1=cultwords["see"] + R.word2=cultwords["hell"] + R.word3=cultwords["join"] + R.check_icon() + if("Resurrect") + if(cast_check(1)) + R.word1=cultwords["blood"] + R.word2=cultwords["join"] + R.word3=cultwords["hell"] + R.check_icon() + if("Hide Runes") + if(cast_check(1)) + R.word1=cultwords["hide"] + R.word2=cultwords["see"] + R.word3=cultwords["blood"] + R.check_icon() + if("Astral Journey") + if(cast_check(1)) + R.word1=cultwords["hell"] + R.word2=cultwords["travel"] + R.word3=cultwords["self"] + R.check_icon() + if("Manifest a Ghost") + if(cast_check(1)) + R.word1=cultwords["blood"] + R.word2=cultwords["see"] + R.word3=cultwords["travel"] + R.check_icon() + if("Imbue Talisman") + if(cast_check(1)) + R.word1=cultwords["hell"] + R.word2=cultwords["technology"] + R.word3=cultwords["join"] + R.check_icon() + if("Sacrifice") + if(cast_check(1)) + R.word1=cultwords["hell"] + R.word2=cultwords["blood"] + R.word3=cultwords["join"] + R.check_icon() + if("Reveal Runes") + if(cast_check(1)) + R.word1=cultwords["blood"] + R.word2=cultwords["see"] + R.word3=cultwords["hide"] + R.check_icon() + if("Wall") + if(cast_check(1)) + R.word1=cultwords["destroy"] + R.word2=cultwords["travel"] + R.word3=cultwords["self"] + R.check_icon() + if("Freedom") + if(cast_check(1)) + R.word1=cultwords["travel"] + R.word2=cultwords["technology"] + R.word3=cultwords["other"] + R.check_icon() + if("Cultsummon") + if(cast_check(1)) + R.word1=cultwords["join"] + R.word2=cultwords["other"] + R.word3=cultwords["self"] + R.check_icon() + if("Deafen") + if(cast_check(1)) + R.word1=cultwords["hide"] + R.word2=cultwords["other"] + R.word3=cultwords["see"] + R.check_icon() + if("Blind") + if(cast_check(1)) + R.word1=cultwords["destroy"] + R.word2=cultwords["see"] + R.word3=cultwords["other"] + R.check_icon() + if("BloodBoil") + if(cast_check(1)) + R.word1=cultwords["destroy"] + R.word2=cultwords["see"] + R.word3=cultwords["blood"] + R.check_icon() + if("Communicate") + if(cast_check(1)) + R.word1=cultwords["self"] + R.word2=cultwords["other"] + R.word3=cultwords["technology"] + R.check_icon() + if("Stun") + if(cast_check(1)) + R.word1=cultwords["join"] + R.word2=cultwords["hide"] + R.word3=cultwords["technology"] + R.check_icon() + else + user << " You do not have enough space to write a proper rune." + return diff --git a/code/modules/spells/genetic.dm b/code/modules/spells/genetic.dm deleted file mode 100644 index bcb7d04280..0000000000 --- a/code/modules/spells/genetic.dm +++ /dev/null @@ -1,31 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/genetic - name = "Genetic" - desc = "This spell inflicts a set of mutations and disabilities upon the target." - - var/disabilities = 0 //bits - var/list/mutations = list() //mutation strings - var/duration = 100 //deciseconds - /* - Disabilities - 1st bit - ? - 2nd bit - ? - 3rd bit - ? - 4th bit - ? - 5th bit - ? - 6th bit - ? - */ - -/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets) - - for(var/mob/living/target in targets) - for(var/x in mutations) - target.mutations.Add(x) - target.disabilities |= disabilities - target.update_mutations() //update target's mutation overlays - spawn(duration) - for(var/x in mutations) - target.mutations.Remove(x) - target.disabilities &= ~disabilities - target.update_mutations() - - return \ No newline at end of file diff --git a/code/modules/spells/horsemask.dm b/code/modules/spells/horsemask.dm deleted file mode 100644 index 32e362f346..0000000000 --- a/code/modules/spells/horsemask.dm +++ /dev/null @@ -1,50 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/horsemask - name = "Curse of the Horseman" - desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes." - school = "transmutation" - charge_type = "recharge" - charge_max = 150 - charge_counter = 0 - clothes_req = 0 - stat_allowed = 0 - invocation = "KN'A FTAGHU, PUCK 'BTHNK!" - invocation_type = "shout" - range = 7 - selection_type = "range" - var/list/compatible_mobs = list(/mob/living/carbon/human) - -/obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr) - if(!targets.len) - user << "No target found in range." - return - - var/mob/living/carbon/target = targets[1] - - if(!(target.type in compatible_mobs)) - user << "It'd be stupid to curse [target] with a horse's head!" - return - - if(!(target in oview(range)))//If they are not in overview after selection. - user << "They are too far away!" - return - - var/obj/item/clothing/mask/horsehead/magic/magichead = new /obj/item/clothing/mask/horsehead/magic - target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ - "Your face burns up, and shortly after the fire you realise you have the face of a horse!") - target.equip_to_slot(magichead, slot_wear_mask) - - flick("e_flash", target.flash) - -//item used by the horsehead spell -/obj/item/clothing/mask/horsehead/magic - //flags_inv = null //so you can still see their face... no. How can you recognize someone when their face is completely different? - voicechange = 1 //NEEEEIIGHH - - dropped(mob/user as mob) - canremove = 1 - ..() - - equipped(var/mob/user, var/slot) - if (slot == slot_wear_mask) - canremove = 0 //curses! - ..() diff --git a/code/modules/spells/inflict_handler.dm b/code/modules/spells/inflict_handler.dm deleted file mode 100644 index 34b810d309..0000000000 --- a/code/modules/spells/inflict_handler.dm +++ /dev/null @@ -1,59 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/inflict_handler - name = "Inflict Handler" - desc = "This spell blinds and/or destroys/damages/heals and/or weakens/stuns the target." - - var/amt_weakened = 0 - var/amt_paralysis = 0 - var/amt_stunned = 0 - - //set to negatives for healing - var/amt_dam_fire = 0 - var/amt_dam_brute = 0 - var/amt_dam_oxy = 0 - var/amt_dam_tox = 0 - - var/amt_eye_blind = 0 - var/amt_eye_blurry = 0 - - var/destroys = "none" //can be "none", "gib" or "disintegrate" - -/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets) - - for(var/mob/living/target in targets) - switch(destroys) - if("gib") - target.gib() - if("gib_brain") - if(ishuman(target) || issmall(target)) - var/mob/living/carbon/C = target - if(!C.has_brain()) // Their brain is already taken out - var/obj/item/organ/brain/B = new(C.loc) - B.transfer_identity(C) - target.gib() - if("disintegrate") - target.dust() - - if(!target) - continue - //damage - if(amt_dam_brute > 0) - if(amt_dam_fire >= 0) - target.take_overall_damage(amt_dam_brute,amt_dam_fire) - else if (amt_dam_fire < 0) - target.take_overall_damage(amt_dam_brute,0) - target.heal_overall_damage(0,amt_dam_fire) - else if(amt_dam_brute < 0) - if(amt_dam_fire > 0) - target.take_overall_damage(0,amt_dam_fire) - target.heal_overall_damage(amt_dam_brute,0) - else if (amt_dam_fire <= 0) - target.heal_overall_damage(amt_dam_brute,amt_dam_fire) - target.adjustToxLoss(amt_dam_tox) - target.oxyloss += amt_dam_oxy - //disabling - target.Weaken(amt_weakened) - target.Paralyse(amt_paralysis) - target.Stun(amt_stunned) - - target.eye_blind += amt_eye_blind - target.eye_blurry += amt_eye_blurry \ No newline at end of file diff --git a/code/modules/spells/knock.dm b/code/modules/spells/knock.dm deleted file mode 100644 index 9ebf664942..0000000000 --- a/code/modules/spells/knock.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/effect/proc_holder/spell/aoe_turf/knock - name = "Knock" - desc = "This spell opens nearby doors and does not require wizard garb." - - school = "transmutation" - charge_max = 100 - clothes_req = 0 - invocation = "AULIE OXIN FIERA" - invocation_type = "whisper" - range = 3 - -/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets) - for(var/turf/T in targets) - for(var/obj/machinery/door/door in T.contents) - spawn(1) - if(istype(door,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = door - A.unlock(1) //forced because it's magic! - door.open() - return diff --git a/code/modules/spells/mind_transfer.dm b/code/modules/spells/mind_transfer.dm deleted file mode 100644 index a4f8258ff7..0000000000 --- a/code/modules/spells/mind_transfer.dm +++ /dev/null @@ -1,116 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/mind_transfer - name = "Mind Transfer" - desc = "This spell allows the user to switch bodies with a target." - - school = "transmutation" - charge_max = 600 - clothes_req = 0 - invocation = "GIN'YU CAPAN" - invocation_type = "whisper" - range = 1 - var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell - var/list/compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk - var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process - var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included) - var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer - var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell - var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell - var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell - -/* -Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do. -Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering. -Also, you never added distance checking after target is selected. I've went ahead and did that. -*/ -/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr) - if(!targets.len) - user << "No mind found." - return - - if(targets.len > 1) - user << "Too many minds! You're not a hive damnit!"//Whaa...aat? - return - - var/mob/living/target = targets[1] - - if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. - user << "They are too far away!" - return - - if(!(target.type in compatible_mobs)) - user << "Their mind isn't compatible with yours." - return - - if(target.stat == DEAD) - user << "You didn't study necromancy back at the Space Wizard Federation academy." - return - - if(!target.key || !target.mind) - user << "They appear to be catatonic. Not even magic can affect their vacant mind." - return - - if(target.mind.special_role in protected_roles) - user << "Their mind is resisting your spell." - return - - var/mob/living/victim = target//The target of the spell whos body will be transferred to. - var/mob/caster = user//The wizard/whomever doing the body transferring. - - //SPELL LOSS BEGIN - admin_attack_log(caster, victim, "Used mind transfer on", "Had mind transfer used on him by", "used mind transfer on") - - //NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost. - var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly. - var/list/checked_spells = user.spell_list - checked_spells -= m_transfer //Remove Mind Transfer from the list. - - if(caster.spell_list.len)//If they have any spells left over after mind transfer is taken out. If they don't, we don't need this. - for(var/i=spell_loss_amount,(i>0&&checked_spells.len),i--)//While spell loss amount is greater than zero and checked_spells has spells in it, run this proc. - for(var/j=checked_spells.len,(j>0&&checked_spells.len),j--)//While the spell list to check is greater than zero and has spells in it, run this proc. - if(prob(base_spell_loss_chance)) - checked_spells -= pick(checked_spells)//Pick a random spell to remove. - spawn(msg_wait) - victim << "The mind transfer has robbed you of a spell." - break//Spell lost. Break loop, going back to the previous for() statement. - else//Or keep checking, adding spell chance modifier to increase chance of losing a spell. - base_spell_loss_chance += spell_loss_chance_modifier - - checked_spells += m_transfer//Add back Mind Transfer. - user.spell_list = checked_spells//Set user spell list to whatever the new list is. - //SPELL LOSS END - - //MIND TRANSFER BEGIN - if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list. - for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. - caster.verbs -= V//But a safety nontheless. - - if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. - for(var/V in victim.mind.special_verbs) - victim.verbs -= V - - var/mob/dead/observer/ghost = victim.ghostize(0) - ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob. - - caster.mind.transfer_to(victim) - victim.spell_list = caster.spell_list//Now they are inside the victim's body. - - if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. - for(var/V in caster.mind.special_verbs)//Not too important but could come into play. - caster.verbs += V - - ghost.mind.transfer_to(caster) - caster.key = ghost.key //have to transfer the key since the mind was not active - caster.spell_list = ghost.spell_list - - if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. - for(var/V in caster.mind.special_verbs) - caster.verbs += V - //MIND TRANSFER END - - //Here we paralyze both mobs and knock them out for a time. - caster.Paralyse(paralysis_amount_caster) - victim.Paralyse(paralysis_amount_victim) - - //After a certain amount of time the victim gets a message about being in a different body. - spawn(msg_wait) - caster << "\red You feel woozy and lightheaded. Your body doesn't seem like your own." diff --git a/code/modules/spells/no_clothes.dm b/code/modules/spells/no_clothes.dm new file mode 100644 index 0000000000..782fe1909f --- /dev/null +++ b/code/modules/spells/no_clothes.dm @@ -0,0 +1,5 @@ +/spell/noclothes + name = "No Clothes" + desc = "This is a placeholder for knowing if you dont need clothes for any spell." + + spell_flags = NO_BUTTON \ No newline at end of file diff --git a/code/modules/spells/projectile.dm b/code/modules/spells/projectile.dm deleted file mode 100644 index 24c79a0a1c..0000000000 --- a/code/modules/spells/projectile.dm +++ /dev/null @@ -1,83 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/projectile - name = "Projectile" - desc = "This spell summons projectiles which try to hit the targets." - - var/proj_icon = 'icons/obj/projectiles.dmi' - var/proj_icon_state = "spell" - var/proj_name = "a spell projectile" - - var/proj_trail = 0 //if it leaves a trail - var/proj_trail_lifespan = 0 //deciseconds - var/proj_trail_icon = 'icons/obj/wizard.dmi' - var/proj_trail_icon_state = "trail" - - var/proj_type = "/obj/effect/proc_holder/spell/targeted" //IMPORTANT use only subtypes of this - - var/proj_lingering = 0 //if it lingers or disappears upon hitting an obstacle - var/proj_homing = 1 //if it follows the target - var/proj_insubstantial = 0 //if it can pass through dense objects or not - var/proj_trigger_range = 0 //the range from target at which the projectile triggers cast(target) - - var/proj_lifespan = 15 //in deciseconds * proj_step_delay - var/proj_step_delay = 1 //lower = faster - -/obj/effect/proc_holder/spell/targeted/projectile/cast(list/targets, mob/user = usr) - - for(var/mob/living/target in targets) - spawn(0) - var/obj/effect/proc_holder/spell/targeted/projectile - if(istext(proj_type)) - var/projectile_type = text2path(proj_type) - projectile = new projectile_type(user) - if(istype(proj_type,/obj/effect/proc_holder/spell)) - projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user) - projectile:linked_spells += proj_type - projectile.icon = proj_icon - projectile.icon_state = proj_icon_state - projectile.set_dir(get_dir(target,projectile)) - projectile.name = proj_name - - var/current_loc = usr.loc - - projectile.loc = current_loc - - for(var/i = 0,i < proj_lifespan,i++) - if(!projectile) - break - - if(proj_homing) - if(proj_insubstantial) - projectile.set_dir(get_dir(projectile,target)) - projectile.loc = get_step_to(projectile,target) - else - step_to(projectile,target) - else - if(proj_insubstantial) - projectile.loc = get_step(projectile,dir) - else - step(projectile,dir) - - if(!proj_lingering && projectile.loc == current_loc) //if it didn't move since last time - del(projectile) - break - - if(proj_trail && projectile) - spawn(0) - if(projectile) - var/obj/effect/overlay/trail = new /obj/effect/overlay(projectile.loc) - trail.icon = proj_trail_icon - trail.icon_state = proj_trail_icon_state - trail.density = 0 - spawn(proj_trail_lifespan) - del(trail) - - if(projectile.loc in range(target.loc,proj_trigger_range)) - projectile.perform(list(target)) - break - - current_loc = projectile.loc - - sleep(proj_step_delay) - - if(projectile) - del(projectile) \ No newline at end of file diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm deleted file mode 100644 index 2ae347ee4a..0000000000 --- a/code/modules/spells/spell.dm +++ /dev/null @@ -1,302 +0,0 @@ -/client/proc/give_spell(mob/T as mob in mob_list) // -- Urist - set category = "Fun" - set name = "Give Spell" - set desc = "Gives a spell to a mob." - var/list/spell_names = list() - for(var/v in spells) - // "/obj/effect/proc_holder/spell/" 30 symbols ~Intercross21 - spell_names.Add(copytext("[v]", 31, 0)) - var/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spell_names - if(!S) return - var/path = text2path("/obj/effect/proc_holder/spell/[S]") - T.spell_list += new path - feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") - message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) - -/obj/effect/proc_holder - var/panel = "Debug"//What panel the proc holder needs to go on. - -var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin verb for now - -/obj/effect/proc_holder/spell - name = "Spell" - desc = "A wizard spell" - density = 0 - opacity = 0 - - var/school = "evocation" //not relevant at now, but may be important later if there are changes to how spells work. the ones I used for now will probably be changed... maybe spell presets? lacking flexibility but with some other benefit? - - var/charge_type = "recharge" //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that - - var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges" - var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges" - - var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" - var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used - - var/clothes_req = 1 //see if it requires clothes - var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells - var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell - var/invocation_type = "none" //can be none, whisper and shout - var/range = 7 //the range of the spell; outer radius for aoe spells - var/message = "" //whatever it says to the guy affected by it - var/selection_type = "view" //can be "range" or "view" - - var/overlay = 0 - var/overlay_icon = 'icons/obj/wizard.dmi' - var/overlay_icon_state = "spell" - var/overlay_lifespan = 0 - - var/sparks_spread = 0 - var/sparks_amt = 0 //cropped at 10 - var/smoke_spread = 0 //1 - harmless, 2 - harmful - var/smoke_amt = 0 //cropped at 10 - - var/critfailchance = 0 - var/centcomm_cancast = 1 //Whether or not the spell should be allowed on z2 - -/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - - if(!(src in usr.spell_list)) - usr << "\red You shouldn't have this spell! Something's wrong." - return 0 - - if(usr.z == 2 && !centcomm_cancast) //Certain spells are not allowed on the centcomm zlevel - return 0 - - if(!skipcharge) - switch(charge_type) - if("recharge") - if(charge_counter < charge_max) - usr << "[name] is still recharging." - return 0 - if("charges") - if(!charge_counter) - usr << "[name] has no charges left." - return 0 - - if(usr.stat && !stat_allowed) - usr << "Not when you're incapacitated." - return 0 - - if(ishuman(usr) || issmall(usr)) - if(istype(usr.wear_mask, /obj/item/clothing/mask/muzzle)) - usr << "Mmmf mrrfff!" - return 0 - - if(clothes_req) //clothes check - if(!istype(usr, /mob/living/carbon/human)) - usr << "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans." - return 0 - if(!istype(usr:wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(user:wear_suit, /obj/item/clothing/suit/space/void/wizard)) - usr << "I don't feel strong enough without my robe." - return 0 - if(!istype(usr:shoes, /obj/item/clothing/shoes/sandal)) - usr << "I don't feel strong enough without my sandals." - return 0 - if(!istype(usr:head, /obj/item/clothing/head/wizard) && !istype(user:head, /obj/item/clothing/head/helmet/space/void/wizard)) - usr << "I don't feel strong enough without my hat." - return 0 - - if(!skipcharge) - switch(charge_type) - if("recharge") - charge_counter = 0 //doesn't start recharging until the targets selecting ends - if("charges") - charge_counter-- //returns the charge if the targets selecting fails - if("holdervar") - adjust_var(user, holder_var_type, holder_var_amount) - - return 1 - -/obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount - - switch(invocation_type) - if("shout") - if(prob(50))//Auto-mute? Fuck that noise - usr.say(invocation) - else - usr.say(replacetext(invocation," ","`")) - if(usr.gender==MALE) - playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) - else - playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) - if("whisper") - if(prob(50)) - usr.whisper(invocation) - else - usr.whisper(replacetext(invocation," ","`")) - -/obj/effect/proc_holder/spell/New() - ..() - - charge_counter = charge_max - -/obj/effect/proc_holder/spell/Click() - if(cast_check()) - choose_targets() - return 1 - -/obj/effect/proc_holder/spell/proc/choose_targets(mob/user = usr) //depends on subtype - /targeted or /aoe_turf - return - -/obj/effect/proc_holder/spell/proc/start_recharge() - while(charge_counter < charge_max) - sleep(1) - charge_counter++ - -/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1) //if recharge is started is important for the trigger spells - before_cast(targets) - invocation() - spawn(0) - if(charge_type == "recharge" && recharge) - start_recharge() - if(prob(critfailchance)) - critfail(targets) - else - cast(targets) - after_cast(targets) - -/obj/effect/proc_holder/spell/proc/before_cast(list/targets) - if(overlay) - for(var/atom/target in targets) - var/location - if(istype(target,/mob/living)) - location = target.loc - else if(istype(target,/turf)) - location = target - var/obj/effect/overlay/spell = new /obj/effect/overlay(location) - spell.icon = overlay_icon - spell.icon_state = overlay_icon_state - spell.anchored = 1 - spell.density = 0 - spawn(overlay_lifespan) - del(spell) - -/obj/effect/proc_holder/spell/proc/after_cast(list/targets) - for(var/atom/target in targets) - var/location - if(istype(target,/mob/living)) - location = target.loc - else if(istype(target,/turf)) - location = target - if(istype(target,/mob/living) && message) - target << text("[message]") - if(sparks_spread) - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() - sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is - sparks.start() - if(smoke_spread) - if(smoke_spread == 1) - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is - smoke.start() - else if(smoke_spread == 2) - var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad() - smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is - smoke.start() - -/obj/effect/proc_holder/spell/proc/cast(list/targets) - return - -/obj/effect/proc_holder/spell/proc/critfail(list/targets) - return - -/obj/effect/proc_holder/spell/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge - switch(charge_type) - if("recharge") - charge_counter = charge_max - if("charges") - charge_counter++ - if("holdervar") - adjust_var(user, holder_var_type, -holder_var_amount) - - return - -/obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types - switch(type) - if("bruteloss") - target.adjustBruteLoss(amount) - if("fireloss") - target.adjustFireLoss(amount) - if("toxloss") - target.adjustToxLoss(amount) - if("oxyloss") - target.adjustOxyLoss(amount) - if("stunned") - target.AdjustStunned(amount) - if("weakened") - target.AdjustWeakened(amount) - if("paralysis") - target.AdjustParalysis(amount) - else - target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existant vars - return - -/obj/effect/proc_holder/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob - var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range - var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast - var/include_user = 0 //if it includes usr in the target list - -/obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends) - var/inner_radius = -1 //for all your ring spell needs - -/obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr) - var/list/targets = list() - - switch(max_targets) - if(0) //unlimited - for(var/mob/living/target in view_or_range(range, user, selection_type)) - targets += target - if(1) //single target can be picked - if(range < 0) - targets += user - else - var/possible_targets = list() - - for(var/mob/living/M in view_or_range(range, user, selection_type)) - if(!include_user && user == M) - continue - possible_targets += M - - targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets - else - var/list/possible_targets = list() - for(var/mob/living/target in view_or_range(range, user, selection_type)) - possible_targets += target - for(var/i=1,i<=max_targets,i++) - if(!possible_targets.len) - break - if(target_ignore_prev) - var/target = pick(possible_targets) - possible_targets -= target - targets += target - else - targets += pick(possible_targets) - - if(!include_user && (user in targets)) - targets -= user - - if(!targets.len) //doesn't waste the spell - revert_cast(user) - return - - perform(targets) - - return - -/obj/effect/proc_holder/spell/aoe_turf/choose_targets(mob/user = usr) - var/list/targets = list() - - for(var/turf/target in view_or_range(range,user,selection_type)) - if(!(target in view_or_range(inner_radius,user,selection_type))) - targets += target - - if(!targets.len) //doesn't waste the spell - revert_cast() - return - - perform(targets) - - return \ No newline at end of file diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm new file mode 100644 index 0000000000..0847146c9a --- /dev/null +++ b/code/modules/spells/spell_code.dm @@ -0,0 +1,341 @@ +var/list/spells = typesof(/spell) //needed for the badmin verb for now + +/spell + name = "Spell" + desc = "A spell" + parent_type = /atom/movable + var/panel = "Spells"//What panel the proc holder needs to go on. + + var/school = "evocation" //not relevant at now, but may be important later if there are changes to how spells work. the ones I used for now will probably be changed... maybe spell presets? lacking flexibility but with some other benefit? + + var/charge_type = Sp_RECHARGE //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that + + var/charge_max = 100 //recharge time in deciseconds if charge_type = Sp_RECHARGE or starting charges if charge_type = Sp_CHARGES + var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = Sp_RECHARGE or -- each cast if charge_type = Sp_CHARGES + var/still_recharging_msg = "The spell is still recharging." + + var/silenced = 0 //not a binary - the length of time we can't cast this for + + var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" + var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used + + var/spell_flags = NEEDSCLOTHES + var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell + var/invocation_type = SpI_NONE //can be none, whisper, shout, and emote + var/range = 7 //the range of the spell; outer radius for aoe spells + var/message = "" //whatever it says to the guy affected by it + var/selection_type = "view" //can be "range" or "view" + var/atom/movable/holder //where the spell is. Normally the user, can be a projectile + + var/duration = 0 //how long the spell lasts + + var/list/spell_levels = list(Sp_SPEED = 0, Sp_POWER = 0) //the current spell levels - total spell levels can be obtained by just adding the two values + var/list/level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 0) //maximum possible levels in each category. Total does cover both. + var/cooldown_reduc = 0 //If set, defines how much charge_max drops by every speed upgrade + var/delay_reduc = 0 + var/cooldown_min = 0 //minimum possible cooldown for a charging spell + + var/overlay = 0 + var/overlay_icon = 'icons/obj/wizard.dmi' + var/overlay_icon_state = "spell" + var/overlay_lifespan = 0 + + var/sparks_spread = 0 + var/sparks_amt = 0 //cropped at 10 + var/smoke_spread = 0 //1 - harmless, 2 - harmful + var/smoke_amt = 0 //cropped at 10 + + var/critfailchance = 0 + + var/cast_delay = 1 + var/cast_sound = "" + + var/hud_state = "" //name of the icon used in generating the spell hud object + var/override_base = "" + +/////////////////////// +///SETUP AND PROCESS/// +/////////////////////// + +/spell/New() + ..() + + //still_recharging_msg = "[name] is still recharging." + charge_counter = charge_max + +/spell/proc/process() + spawn while(charge_counter < charge_max) + charge_counter++ + sleep(1) + return + +/spell/Click() + ..() + + perform(usr) + +///////////////// +/////CASTING///// +///////////////// + +/spell/proc/choose_targets(mob/user = usr) //depends on subtype - see targeted.dm, aoe_turf.dm, dumbfire.dm, or code in general folder + return + +/spell/proc/perform(mob/user = usr, skipcharge = 0) //if recharge is started is important for the trigger spells + if(!holder) + holder = user //just in case + if(!cast_check(skipcharge, user)) + return + if(cast_delay && !spell_do_after(user, cast_delay)) + return + var/list/targets = choose_targets(user) + if(targets && targets.len) + invocation(user, targets) + take_charge(user, skipcharge) + + before_cast(targets) //applies any overlays and effects + user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) cast the spell [name].") + if(prob(critfailchance)) + critfail(targets, user) + else + cast(targets, user) + after_cast(targets) //generates the sparks, smoke, target messages etc. + + +/spell/proc/cast(list/targets, mob/user) //the actual meat of the spell + return + +/spell/proc/critfail(list/targets, mob/user) //the wizman has fucked up somehow + return + +/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types + switch(type) + if("bruteloss") + target.adjustBruteLoss(amount) + if("fireloss") + target.adjustFireLoss(amount) + if("toxloss") + target.adjustToxLoss(amount) + if("oxyloss") + target.adjustOxyLoss(amount) + if("stunned") + target.AdjustStunned(amount) + if("weakened") + target.AdjustWeakened(amount) + if("paralysis") + target.AdjustParalysis(amount) + else + target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existant vars + return + +/////////////////////////// +/////CASTING WRAPPERS////// +/////////////////////////// + +/spell/proc/before_cast(list/targets) + var/valid_targets[0] + for(var/atom/target in targets) + // Check range again (fixes long-range EI NATH) + if(!(target in view_or_range(range,usr,selection_type))) + continue + + valid_targets += target + + if(overlay) + var/location + if(istype(target,/mob/living)) + location = target.loc + else if(istype(target,/turf)) + location = target + var/obj/effect/overlay/spell = new /obj/effect/overlay(location) + spell.icon = overlay_icon + spell.icon_state = overlay_icon_state + spell.anchored = 1 + spell.density = 0 + spawn(overlay_lifespan) + qdel(spell) + return valid_targets + +/spell/proc/after_cast(list/targets) + for(var/atom/target in targets) + var/location = get_turf(target) + if(istype(target,/mob/living) && message) + target << text("[message]") + if(sparks_spread) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is + sparks.start() + if(smoke_spread) + if(smoke_spread == 1) + var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() + smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is + smoke.start() + else if(smoke_spread == 2) + var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad() + smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is + smoke.start() + +///////////////////// +////CASTING TOOLS//// +///////////////////// +/*Checkers, cost takers, message makers, etc*/ + +/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell + + if(!(src in user.spell_list)) + user << "You shouldn't have this spell! Something's wrong." + return 0 + + if(silenced > 0) + return + + if(user.z == 2 && spell_flags & Z2NOCAST) //Certain spells are not allowed on the centcomm zlevel + return 0 + + if(spell_flags & CONSTRUCT_CHECK) + for(var/turf/T in range(holder, 1)) + if(findNullRod(T)) + return 0 + + if(istype(user, /mob/living/simple_animal)) + var/mob/living/simple_animal/SA = user + if(SA.purge) + SA << "The nullrod's power interferes with your own!" + return 0 + + if(!src.check_charge(skipcharge, user)) //sees if we can cast based on charges alone + return 0 + + if(!(spell_flags & GHOSTCAST)) + if(user.stat && !(spell_flags & STATALLOWED)) + usr << "Not when you're incapacitated." + return 0 + + if(ishuman(user) && !(invocation_type in list(SpI_EMOTE, SpI_NONE))) + if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) + user << "Mmmf mrrfff!" + return 0 + + var/spell/noclothes/spell = locate() in user.spell_list + if((spell_flags & NEEDSCLOTHES) && !(spell && istype(spell)))//clothes check + if(!user.wearing_wiz_garb()) + return 0 + + return 1 + +/spell/proc/check_charge(var/skipcharge, mob/user) + if(!skipcharge) + switch(charge_type) + if(Sp_RECHARGE) + if(charge_counter < charge_max) + user << still_recharging_msg + return 0 + if(Sp_CHARGES) + if(!charge_counter) + user << "[name] has no charges left." + return 0 + return 1 + +/spell/proc/take_charge(mob/user = user, var/skipcharge) + if(!skipcharge) + switch(charge_type) + if(Sp_RECHARGE) + charge_counter = 0 //doesn't start recharging until the targets selecting ends + src.process() + return 1 + if(Sp_CHARGES) + charge_counter-- //returns the charge if the targets selecting fails + return 1 + if(Sp_HOLDVAR) + adjust_var(user, holder_var_type, holder_var_amount) + return 1 + return 0 + return 1 + +/spell/proc/invocation(mob/user = usr, var/list/targets) //spelling the spell out and setting it on recharge/reducing charges amount + + switch(invocation_type) + if(SpI_SHOUT) + if(prob(50))//Auto-mute? Fuck that noise + user.say(invocation) + else + user.say(replacetext(invocation," ","`")) + if(SpI_WHISPER) + if(prob(50)) + user.whisper(invocation) + else + user.whisper(replacetext(invocation," ","`")) + if(SpI_EMOTE) + user.emote("me", 1, invocation) //the 1 means it's for everyone in view, the me makes it an emote, and the invocation is written accordingly. + +///////////////////// +///UPGRADING PROCS/// +///////////////////// + +/spell/proc/can_improve(var/upgrade_type) + if(level_max[Sp_TOTAL] <= ( spell_levels[Sp_SPEED] + spell_levels[Sp_POWER] )) //too many levels, can't do it + return 0 + + if(upgrade_type && upgrade_type in spell_levels && upgrade_type in level_max) + if(spell_levels[upgrade_type] >= level_max[upgrade_type]) + return 0 + + return 1 + +/spell/proc/empower_spell() + return + +/spell/proc/quicken_spell() + if(!can_improve(Sp_SPEED)) + return 0 + + spell_levels[Sp_SPEED]++ + + if(delay_reduc && cast_delay) + cast_delay = max(0, cast_delay - delay_reduc) + else if(cast_delay) + cast_delay = round( max(0, initial(cast_delay) * ((level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) / level_max[Sp_SPEED] ) ) ) + + if(charge_type == Sp_RECHARGE) + if(cooldown_reduc) + charge_max = max(cooldown_min, charge_max - cooldown_reduc) + else + charge_max = round( max(cooldown_min, initial(charge_max) * ((level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) / level_max[Sp_SPEED] ) ) ) //the fraction of the way you are to max speed levels is the fraction you lose + if(charge_max < charge_counter) + charge_counter = charge_max + + var/temp = "" + name = initial(name) + switch(level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) + if(3) + temp = "You have improved [name] into Efficient [name]." + name = "Efficient [name]" + if(2) + temp = "You have improved [name] into Quickened [name]." + name = "Quickened [name]" + if(1) + temp = "You have improved [name] into Free [name]." + name = "Free [name]" + if(0) + temp = "You have improved [name] into Instant [name]." + name = "Instant [name]" + + return temp + +/spell/proc/spell_do_after(var/mob/user as mob, delay as num, var/numticks = 5) + if(!user || isnull(user)) + return 0 + if(numticks == 0) + return 1 + + var/delayfraction = round(delay/numticks) + var/Location = user.loc + var/originalstat = user.stat + + for(var/i = 0, i= 1 && max_uses >=1) - uses-- - /* - */ - var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", summonguns = "Summon Guns", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation") - var/already_knows = 0 - for(var/obj/effect/proc_holder/spell/aspell in H.spell_list) - if(available_spells[href_list["spell_choice"]] == aspell.name) - already_knows = 1 - temp = "You already know that spell." - uses++ - break - /* - */ - if(!already_knows) - switch(href_list["spell_choice"]) - if("magicmissile") - feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(H) - temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If a projectile hits a target, the target is stunned for some time." - if("fireball") - feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(H) - temp = "This spell fires a fireball in the direction you're facing and does not require wizard garb. Be careful not to fire it at people that are standing next to you." - if("disintegrate") - feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(H) - temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." - if("disabletech") - feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(H) - temp = "This spell releases an EMP from your person disabling most technology within range; computers, doors, prosthetics, etc." - if("smoke") - feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/smoke(H) - temp = "This spell spawns a cloud of vision obscuring smoke at your location and does not require wizard garb." - if("blind") - feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/trigger/blind(H) - temp = "This spell temporarly blinds a single person and does not require wizard garb." - if("mindswap") - feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(H) - temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." - if("forcewall") - feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(H) - temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." - if("blink") - feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(H) - temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." - if("teleport") - feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(H) - temp = "This spell teleports you to an area of your selection, and creates a cloud of smoke around you upon arrival. Very useful if you are in danger.." - if("mutate") - feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/genetic/mutate(H) - temp = "This spell causes you to turn into a hulk, gaining super strength and the ability to punch down walls! You also gain the ability to fire lasers from your eyes!" - if("etherealjaunt") - feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(H) - temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - if("knock") - feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(H) - temp = "This spell opens nearby doors and does not require wizard garb." - if("horseman") - feedback_add_details("wizard_spell_learned","HH") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.spell_list += new /obj/effect/proc_holder/spell/targeted/horsemask(H) - temp = "This spell will curse a person to wear an unremovable horse mask (it has glue on the inside) and speak like a horse. It does not require a wizard garb. Do note the curse will disintegrate the target's current mask if they are wearing one." - if("summonguns") - feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - rightandwrong() - max_uses-- - temp = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill eachother. Just be careful not to get hit in the crossfire!" - if("staffchange") - feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - new /obj/item/weapon/gun/energy/staff(get_turf(H)) - temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself" - max_uses-- - if("mentalfocus") - feedback_add_details("wizard_spell_learned","MF") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - new /obj/item/weapon/gun/energy/staff/focus(get_turf(H)) - temp = "An artefact that channels the will of the user into destructive bolts of force." - max_uses-- - if("soulstone") - feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H)) - H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(H) - temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot." - max_uses-- - if("armor") - feedback_add_details("wizard_spell_learned","HS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - new /obj/item/clothing/shoes/sandal(get_turf(H)) //In case they've lost them. - new /obj/item/clothing/gloves/purple(get_turf(H))//To complete the outfit - new /obj/item/clothing/suit/space/void/wizard(get_turf(H)) - new /obj/item/clothing/head/helmet/space/void/wizard(get_turf(H)) - temp = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." - max_uses-- - if("staffanimation") - feedback_add_details("wizard_spell_learned","SA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - new /obj/item/weapon/gun/energy/staff/animate(get_turf(H)) - temp = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." - max_uses-- - if("scrying") - feedback_add_details("wizard_spell_learned","SO") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - new /obj/item/weapon/scrying(get_turf(H)) - if (!(XRAY in H.mutations)) - H.mutations.Add(XRAY) - H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) - H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - H << "The walls suddenly disappear." - temp = "You have purchased a scrying orb, and gained x-ray vision." - max_uses-- - else - if(href_list["temp"]) - temp = null - attack_self(H) - - return +/obj/item/weapon/spellbook + name = "spell book" + desc = "The legendary book of spells of the wizard." + icon = 'icons/obj/library.dmi' + icon_state ="spellbook" + throw_speed = 1 + throw_range = 5 + w_class = 1.0 + var/uses = 5 + var/temp = null + var/max_uses = 5 + var/op = 1 + +/obj/item/weapon/spellbook/attack_self(mob/user = usr) + if(!user) + return + user.set_machine(src) + var/dat + if(temp) + dat = "[temp]

          Clear" + else + + // AUTOFIXED BY fix_string_idiocy.py + dat = {"The Book of Spells:
          + Spells left to memorize: [uses]
          +
          + Memorize which spell:
          + The number after the spell name is the cooldown time.
          + Magic Missile (10)
          + This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.
          + Fireball (10)
          + This spell fires a fireball in the direction you're facing and does not require wizard garb. Be careful not to fire it at people that are standing next to you.
          + Disintegrate (60)
          + This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.
          + Disable Technology (60)
          + This spell disables all weapons, cameras and most other technology in range.
          + Smoke (10)
          + This spell spawns a cloud of choking smoke at your location and does not require wizard garb.
          + Blind (30)
          + This spell temporarly blinds a single person and does not require wizard garb.
          + Subjugation (30)
          + This spell temporarily subjugates a target's mind and does not require wizard garb.
          + Mind Transfer (60)
          + This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process.
          + Forcewall (10)
          + This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb.
          + Blink (2)
          + This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.
          + Teleport (60)
          + This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.
          + Mutate (60)
          + This spell causes you to turn into a hulk and gain telekinesis for a short while.
          + Ethereal Jaunt (60)
          + This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.
          + Knock (10)
          + This spell opens nearby doors and does not require wizard garb.
          + Curse of the Horseman (15)
          + This spell will curse a person to wear an unremovable horse mask (it has glue on the inside) and speak like a horse. It does not require wizard garb.
          + Flesh to Stone (60)
          + This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed.
          + Remove Clothes Requirement Warning: this takes away 2 spell choices.
          +
          + Artefacts:
          + Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells.
          + It is recommended that only experienced wizards attempt to wield such artefacts.
          +
          + Staff of Change
          + An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself.
          +
          + Mental Focus
          + An artefact that channels the will of the user into destructive bolts of force.
          +
          + Six Soul Stone Shards and the spell Artificer
          + Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot.
          +
          + Mastercrafted Armor Set
          + An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space.
          +
          + Staff of Animation
          + An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines.
          +
          + Scrying Orb
          + An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision.
          +
          "} + // END AUTOFIX + if(op) + dat += "Re-memorize Spells
          " + user << browse(dat, "window=radio") + onclose(user, "radio") + return + +/obj/item/weapon/spellbook/Topic(href, href_list) + ..() + var/mob/living/carbon/human/H = usr + + if(H.stat || H.restrained()) + return + if(!istype(H, /mob/living/carbon/human)) + return 1 + + if(H.mind.special_role == "apprentice") + temp = "If you got caught sneaking a peak from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not." + return + + if(loc == H || (in_range(src, H) && istype(loc, /turf))) + H.set_machine(src) + if(href_list["spell_choice"]) + if(href_list["spell_choice"] == "rememorize") + var/area/wizard_station/A = locate() + if(usr in A.contents) + uses = max_uses + H.spellremove() + temp = "All spells have been removed. You may now memorize a new set of spells." + feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + else + temp = "You may only re-memorize spells whilst located inside the wizard sanctuary." + else if(uses >= 1 && max_uses >=1) + if(href_list["spell_choice"] == "noclothes") + if(uses < 2) + return + uses-- + /* + */ + var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes",fleshtostone = "Flesh to Stone") + var/already_knows = 0 + for(var/spell/aspell in H.spell_list) + if(available_spells[href_list["spell_choice"]] == initial(aspell.name)) + already_knows = 1 + if(!aspell.can_improve()) + temp = "This spell cannot be improved further." + uses++ + break + else + if(aspell.can_improve("speed") && aspell.can_improve("power")) + switch(alert(src, "Do you want to upgrade this spell's speed or power?", "Select Upgrade", "Speed", "Power", "Cancel")) + if("Speed") + temp = aspell.quicken_spell() + if("Power") + temp = aspell.empower_spell() + else + uses++ + break + else if (aspell.can_improve("speed")) + temp = aspell.quicken_spell() + else if (aspell.can_improve("power")) + temp = aspell.empower_spell() + /* + */ + if(!already_knows) + switch(href_list["spell_choice"]) + if("noclothes") + feedback_add_details("wizard_spell_learned","NC") + H.add_spell(new/spell/noclothes) + temp = "This teaches you how to use your spells without your magical garb, truely you are the wizardest." + uses-- + if("magicmissile") + feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/projectile/magic_missile) + temp = "You have learned magic missile." + if("fireball") + feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/projectile/dumbfire/fireball) + temp = "You have learned fireball." + if("disintegrate") + feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/disintegrate) + temp = "You have learned disintegrate." + if("disabletech") + feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/aoe_turf/disable_tech) + temp = "You have learned disable technology." + if("smoke") + feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/aoe_turf/smoke) + temp = "You have learned smoke." + if("blind") + feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/genetic/blind) + temp = "You have learned blind." + if("subjugation") + feedback_add_details("wizard_spell_learned","SJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/subjugation) + temp = "You have learned subjugate." + if("mindswap") + feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/mind_transfer) + temp = "You have learned mindswap." + if("forcewall") + feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/aoe_turf/conjure/forcewall) + temp = "You have learned forcewall." + if("blink") + feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/aoe_turf/blink) + temp = "You have learned blink." + if("teleport") + feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/area_teleport) + temp = "You have learned teleport." + if("mutate") + feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/genetic/mutate) + temp = "You have learned mutate." + if("etherealjaunt") + feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/ethereal_jaunt) + temp = "You have learned ethereal jaunt." + if("knock") + feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/aoe_turf/knock) + temp = "You have learned knock." + if("horseman") + feedback_add_details("wizard_spell_learned","HH") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/horsemask) + temp = "You have learned curse of the horseman." + if("fleshtostone") + feedback_add_details("wizard_spell_learned","FS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.add_spell(new/spell/targeted/flesh_to_stone) + temp = "You have learned flesh to stone." + if("staffchange") + feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/gun/energy/staff(get_turf(H)) + temp = "You have purchased a staff of change." + max_uses-- + if("mentalfocus") + feedback_add_details("wizard_spell_learned","MF") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/gun/energy/staff/focus(get_turf(H)) + temp = "An artefact that channels the will of the user into destructive bolts of force." + max_uses-- + if("soulstone") + feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H)) + H.add_spell(new/spell/aoe_turf/conjure/construct) + temp = "You have purchased a belt full of soulstones and have learned the artificer spell." + max_uses-- + if("armor") + feedback_add_details("wizard_spell_learned","HS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/clothing/shoes/sandal(get_turf(H)) //In case they've lost them. + new /obj/item/clothing/gloves/purple(get_turf(H))//To complete the outfit + new /obj/item/clothing/suit/space/void/wizard(get_turf(H)) + new /obj/item/clothing/head/helmet/space/void/wizard(get_turf(H)) + temp = "You have purchased a suit of wizard armor." + max_uses-- + if("staffanimation") + feedback_add_details("wizard_spell_learned","SA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/gun/energy/staff/animate(get_turf(H)) + temp = "You have purchased a staff of animation." + max_uses-- + if("scrying") + feedback_add_details("wizard_spell_learned","SO") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/scrying(get_turf(H)) + if (!(XRAY in H.mutations)) + H.mutations.Add(XRAY) + H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) + H.see_in_dark = 8 + H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + H << "\blue The walls suddenly disappear." + temp = "You have purchased a scrying orb, and gained x-ray vision." + max_uses-- + else + if(href_list["temp"]) + temp = null + attack_self() + + return + +//Single Use Spellbooks// + +/obj/item/weapon/spellbook/oneuse + var/spell = /spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic + var/spellname = "sandbox" + var/used = 0 + name = "spellbook of " + uses = 1 + max_uses = 1 + desc = "This template spellbook was never meant for the eyes of man..." + +/obj/item/weapon/spellbook/oneuse/New() + ..() + name += spellname + +/obj/item/weapon/spellbook/oneuse/attack_self(mob/user as mob) + var/spell/S = new spell(user) + for(var/spell/knownspell in user.spell_list) + if(knownspell.type == S.type) + if(user.mind) + if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard") + user <<"You're already far more versed in this spell than this flimsy how-to book can provide." + else + user <<"You've already read this one." + return + if(used) + recoil(user) + else + user.add_spell(S) + user <<"you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!" + user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).") + onlearned(user) + +/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob) + user.visible_message("[src] glows in a black light!") + +/obj/item/weapon/spellbook/oneuse/proc/onlearned(mob/user as mob) + used = 1 + user.visible_message("[src] glows dark for a second!") + +/obj/item/weapon/spellbook/oneuse/attackby() + return + +/obj/item/weapon/spellbook/oneuse/fireball + spell = /spell/targeted/projectile/dumbfire/fireball + spellname = "fireball" + icon_state ="bookfireball" + desc = "This book feels warm to the touch." + +/obj/item/weapon/spellbook/oneuse/fireball/recoil(mob/user as mob) + ..() + explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) + qdel(src) + +/obj/item/weapon/spellbook/oneuse/smoke + spell = /spell/aoe_turf/smoke + spellname = "smoke" + icon_state ="booksmoke" + desc = "This book is overflowing with the dank arts." + +/obj/item/weapon/spellbook/oneuse/smoke/recoil(mob/user as mob) + ..() + user <<"Your stomach rumbles..." + if(user.nutrition) + user.nutrition -= 200 + if(user.nutrition <= 0) + user.nutrition = 0 + +/obj/item/weapon/spellbook/oneuse/blind + spell = /spell/targeted/genetic/blind + spellname = "blind" + icon_state ="bookblind" + desc = "This book looks blurry, no matter how you look at it." + +/obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user as mob) + ..() + user <<"You go blind!" + user.eye_blind = 10 + +/obj/item/weapon/spellbook/oneuse/mindswap + spell = /spell/targeted/mind_transfer + spellname = "mindswap" + icon_state ="bookmindswap" + desc = "This book's cover is pristine, though its pages look ragged and torn." + var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps + +/obj/item/weapon/spellbook/oneuse/mindswap/onlearned() + spellname = pick("fireball","smoke","blind","forcewall","knock","horses","charge") + icon_state = "book[spellname]" + name = "spellbook of [spellname]" //Note, desc doesn't change by design + ..() + +/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user as mob) + ..() + if(stored_swap in dead_mob_list) + stored_swap = null + if(!stored_swap) + stored_swap = user + user <<"For a moment you feel like you don't even know who you are anymore." + return + if(stored_swap == user) + user <<"You stare at the book some more, but there doesn't seem to be anything else to learn..." + return + + if(user.mind.special_verbs.len) + for(var/V in user.mind.special_verbs) + user.verbs -= V + + if(stored_swap.mind.special_verbs.len) + for(var/V in stored_swap.mind.special_verbs) + stored_swap.verbs -= V + + var/mob/dead/observer/ghost = stored_swap.ghostize(0) + ghost.spell_list = stored_swap.spell_list + + user.mind.transfer_to(stored_swap) + stored_swap.spell_list = user.spell_list + + if(stored_swap.mind.special_verbs.len) + for(var/V in user.mind.special_verbs) + user.verbs += V + + ghost.mind.transfer_to(user) + user.key = ghost.key + user.spell_list = ghost.spell_list + + if(user.mind.special_verbs.len) + for(var/V in user.mind.special_verbs) + user.verbs += V + + stored_swap <<"You're suddenly somewhere else... and someone else?!" + user <<"Suddenly you're staring at [src] again... where are you, who are you?!" + stored_swap = null + +/obj/item/weapon/spellbook/oneuse/forcewall + spell = /spell/aoe_turf/conjure/forcewall + spellname = "forcewall" + icon_state ="bookforcewall" + desc = "This book has a dedication to mimes everywhere inside the front cover." + +/obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/user as mob) + ..() + user <<"You suddenly feel very solid!" + var/obj/structure/closet/statue/S = new /obj/structure/closet/statue(user.loc, user) + S.timer = 30 + user.drop_item() + + +/obj/item/weapon/spellbook/oneuse/knock + spell = /spell/aoe_turf/knock + spellname = "knock" + icon_state ="bookknock" + desc = "This book is hard to hold closed properly." + +/obj/item/weapon/spellbook/oneuse/knock/recoil(mob/user as mob) + ..() + user <<"You're knocked down!" + user.Weaken(20) + +/obj/item/weapon/spellbook/oneuse/horsemask + spell = /spell/targeted/horsemask + spellname = "horses" + icon_state ="bookhorses" + desc = "This book is more horse than your mind has room for." + +/obj/item/weapon/spellbook/oneuse/horsemask/recoil(mob/living/carbon/user as mob) + if(istype(user, /mob/living/carbon/human)) + user <<"HOR-SIE HAS RISEN" + var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead + magichead.canremove = 0 //curses! + magichead.flags_inv = null //so you can still see their face + magichead.voicechange = 1 //NEEEEIIGHH + user.drop_from_inventory(user.wear_mask) + user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) + qdel(src) + else + user <<"I say thee neigh" + +/obj/item/weapon/spellbook/oneuse/charge + spell = /spell/aoe_turf/charge + spellname = "charging" + icon_state ="bookcharge" + desc = "This book is made of 100% post-consumer wizard." + +/obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob) + ..() + user <<"[src] suddenly feels very warm!" + empulse(src, 1, 1) diff --git a/code/modules/spells/spells.dm b/code/modules/spells/spells.dm new file mode 100644 index 0000000000..d20eea00dc --- /dev/null +++ b/code/modules/spells/spells.dm @@ -0,0 +1,64 @@ +/mob/Life() + ..() + if(spell_masters && spell_masters.len) + for(var/obj/screen/movable/spell_master/spell_master in spell_masters) + spell_master.update_spells(0, src) + +/mob/Stat() + ..() + if(spell_list && spell_list.len && statpanel("Spells")) + for(var/spell/S in spell_list) + switch(S.charge_type) + if(Sp_RECHARGE) + statpanel("Spells","[S.charge_counter/10.0]/[S.charge_max/10]",S) + if(Sp_CHARGES) + statpanel("Spells","[S.charge_counter]/[S.charge_max]",S) + if(Sp_HOLDVAR) + statpanel("Spells","[S.holder_var_type] [S.holder_var_amount]",S) + +/mob/proc/add_spell(var/spell/spell_to_add, var/spell_base = "wiz_spell_ready", var/master_type = /obj/screen/movable/spell_master) + if(!spell_masters) + spell_masters = list() + + if(spell_masters.len) + for(var/obj/screen/movable/spell_master/spell_master in spell_masters) + if(spell_master.type == master_type) + spell_list.Add(spell_to_add) + spell_master.add_spell(spell_to_add) + return 1 + + var/obj/screen/movable/spell_master/new_spell_master = new master_type //we're here because either we didn't find our type, or we have no spell masters to attach to + if(client) + src.client.screen += new_spell_master + new_spell_master.spell_holder = src + new_spell_master.add_spell(spell_to_add) + if(spell_base) + new_spell_master.icon_state = spell_base + spell_masters.Add(new_spell_master) + spell_list.Add(spell_to_add) + return 1 + +/mob/proc/remove_spell(var/spell/spell_to_remove) + if(!spell_to_remove || !istype(spell_to_remove)) + return + + if(!(spell_to_remove in spell_list)) + return + + if(!spell_masters || !spell_masters.len) + return + + spell_list.Remove(spell_to_remove) + for(var/obj/screen/movable/spell_master/spell_master in spell_masters) + spell_master.remove_spell(spell_to_remove) + return 1 + +/mob/proc/silence_spells(var/amount = 0) + if(!(amount >= 0)) + return + + if(!spell_masters || !spell_masters.len) + return + + for(var/obj/screen/movable/spell_master/spell_master in spell_masters) + spell_master.silence_spells(amount) diff --git a/code/modules/spells/targeted/disintegrate.dm b/code/modules/spells/targeted/disintegrate.dm new file mode 100644 index 0000000000..c3f0ee80e9 --- /dev/null +++ b/code/modules/spells/targeted/disintegrate.dm @@ -0,0 +1,27 @@ +/spell/targeted/disintegrate + name = "Disintegrate" + desc = "This spell instantly kills somebody adjacent to you with the vilest of magick." + + school = "evocation" + charge_max = 600 + spell_flags = NEEDSCLOTHES + invocation = "EI NATH" + invocation_type = SpI_SHOUT + range = 1 + cooldown_min = 200 //100 deciseconds reduction per rank + + sparks_spread = 1 + sparks_amt = 4 + + hud_state = "wiz_disint" + +/spell/targeted/disintegrate/cast(var/list/targets) + ..() + for(var/mob/living/target in targets) + if(ishuman(target)) + var/mob/living/carbon/C = target + if(!C.has_brain()) // Their brain is already taken out + var/obj/item/organ/brain/B = new(C.loc) + B.transfer_identity(C) + target.gib() + return \ No newline at end of file diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm new file mode 100644 index 0000000000..12dfd55caa --- /dev/null +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -0,0 +1,98 @@ +/spell/targeted/ethereal_jaunt + name = "Ethereal Jaunt" + desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." + + school = "transmutation" + charge_max = 300 + spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER + invocation = "none" + invocation_type = SpI_NONE + range = -1 + max_targets = 1 + cooldown_min = 100 //50 deciseconds reduction per rank + duration = 50 //in deciseconds + + hud_state = "wiz_jaunt" + +/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded + for(var/mob/living/target in targets) + target.monkeyizing = 1 //protects the mob from being transformed (replaced) midjaunt and getting stuck in bluespace + if(target.buckled) target.buckled = null + spawn(0) + var/mobloc = get_turf(target.loc) + var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc ) + var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc ) + animation.name = "water" + animation.density = 0 + animation.anchored = 1 + animation.icon = 'icons/mob/mob.dmi' + animation.layer = 5 + animation.master = holder + target.ExtinguishMob() + if(target.buckled) + target.buckled = null + jaunt_disappear(animation, target) + target.loc = holder + target.monkeyizing=0 //mob is safely inside holder now, no need for protection. + jaunt_steam(mobloc) + sleep(duration) + mobloc = get_turf(target.loc) + animation.loc = mobloc + jaunt_steam(mobloc) + target.canmove = 0 + holder.reappearing = 1 + sleep(20) + jaunt_reappear(animation, target) + sleep(5) + if(!target.forceMove(mobloc)) + for(var/direction in list(1,2,4,8,5,6,9,10)) + var/turf/T = get_step(mobloc, direction) + if(T) + if(target.forceMove(T)) + break + target.canmove = 1 + target.client.eye = target + qdel(animation) + qdel(holder) + +/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) + animation.icon_state = "liquify" + flick("liquify",animation) + +/spell/targeted/ethereal_jaunt/proc/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target) + flick("reappear",animation) + +/spell/targeted/ethereal_jaunt/proc/jaunt_steam(var/mobloc) + var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() + steam.set_up(10, 0, mobloc) + steam.start() + +/obj/effect/dummy/spell_jaunt + name = "water" + icon = 'icons/effects/effects.dmi' + icon_state = "nothing" + var/canmove = 1 + var/reappearing = 0 + density = 0 + anchored = 1 + +/obj/effect/dummy/spell_jaunt/Destroy() + // Eject contents if deleted somehow + for(var/atom/movable/AM in src) + AM.loc = get_turf(src) + return ..() + +/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction) + if (!src.canmove || reappearing) return + var/turf/newLoc = get_step(src,direction) + if(!(newLoc.flags & NOJAUNT)) + loc = newLoc + else + user << "Some strange aura is blocking the way!" + src.canmove = 0 + spawn(2) src.canmove = 1 + +/obj/effect/dummy/spell_jaunt/ex_act(blah) + return +/obj/effect/dummy/spell_jaunt/bullet_act(blah) + return \ No newline at end of file diff --git a/code/modules/spells/targeted/flesh_to_stone.dm b/code/modules/spells/targeted/flesh_to_stone.dm new file mode 100644 index 0000000000..e640fba5c6 --- /dev/null +++ b/code/modules/spells/targeted/flesh_to_stone.dm @@ -0,0 +1,21 @@ +/spell/targeted/flesh_to_stone + name = "Flesh to Stone" + desc = "This spell turns a single person into an inert statue for a long period of time." + + school = "transmutation" + charge_max = 600 + spell_flags = NEEDSCLOTHES + range = 3 + max_targets = 1 + invocation = "STAUN EI" + invocation_type = SpI_SHOUT + amt_stunned = 5//just exists to make sure the statue "catches" them + cooldown_min = 200 //100 deciseconds reduction per rank + + hud_state = "wiz_statue" + +/spell/targeted/flesh_to_stone/cast(var/list/targets, mob/user) + ..() + for(var/mob/living/target in targets) + new /obj/structure/closet/statue(target.loc, target) //makes the statue + return \ No newline at end of file diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm new file mode 100644 index 0000000000..028cdafba0 --- /dev/null +++ b/code/modules/spells/targeted/genetic.dm @@ -0,0 +1,68 @@ +/* +Other mutation or disability spells can be found in +code\game\dna\genes\vg_powers.dm //hulk is in this file +code\game\dna\genes\goon_disabilities.dm +code\game\dna\genes\goon_powers.dm +*/ +/spell/targeted/genetic + name = "Genetic modifier" + desc = "This spell inflicts a set of mutations and disabilities upon the target." + + var/disabilities = 0 //bits + var/list/mutations = list() //mutation strings + duration = 100 //deciseconds + + +/spell/targeted/genetic/cast(list/targets) + ..() + for(var/mob/living/target in targets) + for(var/x in mutations) + target.mutations.Add(x) + target.disabilities |= disabilities + target.update_mutations() //update target's mutation overlays + spawn(duration) + for(var/x in mutations) + target.mutations.Remove(x) + target.disabilities &= ~disabilities + target.update_mutations() + return + +/spell/targeted/genetic/blind + name = "Blind" + disabilities = 1 + duration = 300 + + charge_max = 300 + + spell_flags = 0 + invocation = "STI KALY" + invocation_type = SpI_WHISPER + message = "Your eyes cry out in pain!" + cooldown_min = 50 + + range = 7 + max_targets = 0 + + amt_eye_blind = 10 + amt_eye_blurry = 20 + + hud_state = "wiz_blind" + +/spell/targeted/genetic/mutate + name = "Mutate" + desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." + + school = "transmutation" + charge_max = 400 + spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER + invocation = "BIRUZ BENNAR" + invocation_type = SpI_SHOUT + message = "\blue You feel strong! You feel a pressure building behind your eyes!" + range = 0 + max_targets = 1 + + mutations = list(LASER, HULK) + duration = 300 + cooldown_min = 300 //25 deciseconds reduction per rank + + hud_state = "wiz_hulk" diff --git a/code/modules/spells/targeted/harvest.dm b/code/modules/spells/targeted/harvest.dm new file mode 100644 index 0000000000..6903efbfd9 --- /dev/null +++ b/code/modules/spells/targeted/harvest.dm @@ -0,0 +1,36 @@ +/spell/targeted/harvest + name = "Harvest" + desc = "Back to where I come from, and you're coming with me." + + school = "transmutation" + charge_max = 200 + spell_flags = Z2NOCAST | CONSTRUCT_CHECK | INCLUDEUSER + invocation = "" + invocation_type = SpI_NONE + range = 0 + max_targets = 0 + + overlay = 1 + overlay_icon = 'icons/effects/effects.dmi' + overlay_icon_state = "rune_teleport" + overlay_lifespan = 0 + + hud_state = "const_harvest" + +/spell/targeted/harvest/cast(list/targets, mob/user)//because harvest is already a proc + ..() + + var/destination = null + for(var/obj/singularity/narsie/large/N in narsie_list) + destination = N.loc + break + if(destination) + var/prey = 0 + for(var/mob/living/M in targets) + if(!findNullRod(M)) + M.forceMove(destination) + if(M != user) + prey = 1 + user << "You warp back to Nar-Sie[prey ? " along with your prey":""]." + else + user << "...something's wrong!"//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world. diff --git a/code/modules/spells/targeted/horsemask.dm b/code/modules/spells/targeted/horsemask.dm new file mode 100644 index 0000000000..dad2032b72 --- /dev/null +++ b/code/modules/spells/targeted/horsemask.dm @@ -0,0 +1,35 @@ +/spell/targeted/horsemask + name = "Curse of the Horseman" + desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes." + school = "transmutation" + charge_type = Sp_RECHARGE + charge_max = 150 + charge_counter = 0 + spell_flags = 0 + invocation = "KN'A FTAGHU, PUCK 'BTHNK!" + invocation_type = SpI_SHOUT + range = 7 + max_targets = 1 + cooldown_min = 30 //30 deciseconds reduction per rank + selection_type = "range" + + compatible_mobs = list(/mob/living/carbon/human) + + hud_state = "wiz_horse" + +/spell/targeted/horsemask/cast(list/targets, mob/user = usr) + ..() + for(var/mob/living/target in targets) + var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead + magichead.canremove = 0 //curses! + magichead.flags_inv = null //so you can still see their face + magichead.voicechange = 1 //NEEEEIIGHH + target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ + "Your face burns up, and shortly after the fire you realise you have the face of a horse!") + var/obj/old_mask = target.wear_mask + if(old_mask) + target.drop_from_inventory(old_mask) + qdel(old_mask) //get rid of this shit + target.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) + + flick("e_flash", target.flash) \ No newline at end of file diff --git a/code/modules/spells/targeted/mind_transfer.dm b/code/modules/spells/targeted/mind_transfer.dm new file mode 100644 index 0000000000..6f4525b62c --- /dev/null +++ b/code/modules/spells/targeted/mind_transfer.dm @@ -0,0 +1,73 @@ +/spell/targeted/mind_transfer + name = "Mind Transfer" + desc = "This spell allows the user to switch bodies with a target." + + school = "transmutation" + charge_max = 600 + spell_flags = 0 + invocation = "GIN'YU CAPAN" + invocation_type = SpI_WHISPER + max_targets = 1 + range = 1 + cooldown_min = 200 //100 deciseconds reduction per rank + compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk + + var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell + var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell + amt_paralysis = 20 //how much the victim is paralysed for after the spell + + hud_state = "wiz_mindswap" + +/spell/targeted/mind_transfer/cast(list/targets, mob/user) + ..() + + for(var/mob/living/target in targets) + if(target.stat == DEAD) + user << "You didn't study necromancy back at the Space Wizard Federation academy." + continue + + if(!target.key || !target.mind) + user << "They appear to be catatonic. Not even magic can affect their vacant mind." + continue + + if(target.mind.special_role in protected_roles) + user << "Their mind is resisting your spell." + continue + + var/mob/living/victim = target//The target of the spell whos body will be transferred to. + var/mob/caster = user//The wizard/whomever doing the body transferring. + + //MIND TRANSFER BEGIN + if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list. + for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. + caster.verbs -= V//But a safety nontheless. + + if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. + for(var/V in victim.mind.special_verbs) + victim.verbs -= V + + var/mob/dead/observer/ghost = victim.ghostize(0) + ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob. + + caster.mind.transfer_to(victim) + victim.spell_list = caster.spell_list//Now they are inside the victim's body. + + if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. + for(var/V in caster.mind.special_verbs)//Not too important but could come into play. + caster.verbs += V + + ghost.mind.transfer_to(caster) + caster.key = ghost.key //have to transfer the key since the mind was not active + caster.spell_list = ghost.spell_list + + if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. + for(var/V in caster.mind.special_verbs) + caster.verbs += V + //MIND TRANSFER END + + //Target is handled in ..(), so we handle the caster here + caster.Paralyse(amt_paralysis) + + //After a certain amount of time the victim gets a message about being in a different body. + spawn(msg_wait) + caster << "\red You feel woozy and lightheaded. Your body doesn't seem like your own." diff --git a/code/modules/spells/targeted/projectile/dumbfire.dm b/code/modules/spells/targeted/projectile/dumbfire.dm new file mode 100644 index 0000000000..cd13f7169c --- /dev/null +++ b/code/modules/spells/targeted/projectile/dumbfire.dm @@ -0,0 +1,13 @@ +/spell/targeted/projectile/dumbfire + name = "dumbfire spell" + +/spell/targeted/projectile/dumbfire/choose_targets(mob/user = usr) + var/list/targets = list() + + var/starting_dir = user.dir //where are we facing at the time of casting? + var/turf/starting_turf = get_turf(user) + var/current_turf = starting_turf + for(var/i = 1; i <= src.range; i++) + current_turf = get_step(current_turf, starting_dir) + targets += current_turf + return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/fireball.dm b/code/modules/spells/targeted/projectile/fireball.dm new file mode 100644 index 0000000000..ec48c4ab49 --- /dev/null +++ b/code/modules/spells/targeted/projectile/fireball.dm @@ -0,0 +1,39 @@ +/spell/targeted/projectile/dumbfire/fireball + name = "Fireball" + desc = "This spell fires a fireball at a target and does not require wizard garb." + + proj_type = /obj/item/projectile/spell_projectile/fireball + + school = "evocation" + charge_max = 100 + spell_flags = 0 + invocation = "ONI SOMA" + invocation_type = SpI_SHOUT + range = 20 + cooldown_min = 20 //10 deciseconds reduction per rank + + spell_flags = 0 + + duration = 20 + proj_step_delay = 1 + + amt_dam_brute = 20 + amt_dam_fire = 25 + + var/ex_severe = -1 + var/ex_heavy = 1 + var/ex_light = 2 + var/ex_flash = 5 + + hud_state = "wiz_fireball" + +/spell/targeted/projectile/dumbfire/fireball/prox_cast(var/list/targets, spell_holder) + for(var/mob/living/M in targets) + apply_spell_damage(M) + explosion(get_turf(spell_holder), ex_severe, ex_heavy, ex_light, ex_flash) + +//PROJECTILE + +/obj/item/projectile/spell_projectile/fireball + name = "fireball" + icon_state = "fireball" \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/magic_missile.dm b/code/modules/spells/targeted/projectile/magic_missile.dm new file mode 100644 index 0000000000..c3589ce94b --- /dev/null +++ b/code/modules/spells/targeted/projectile/magic_missile.dm @@ -0,0 +1,40 @@ +/spell/targeted/projectile/magic_missile + name = "Magic Missile" + desc = "This spell fires several, slow moving, magic projectiles at nearby targets." + + school = "evocation" + charge_max = 150 + spell_flags = NEEDSCLOTHES + invocation = "FORTI GY AMA" + invocation_type = SpI_SHOUT + range = 7 + cooldown_min = 90 //15 deciseconds reduction per rank + + max_targets = 0 + + proj_type = /obj/item/projectile/spell_projectile/seeking/magic_missile + duration = 10 + proj_step_delay = 5 + + hud_state = "wiz_mm" + + amt_paralysis = 3 + amt_stunned = 3 + + amt_dam_fire = 10 + +/spell/targeted/projectile/magic_missile/prox_cast(var/list/targets, atom/spell_holder) + spell_holder.visible_message("\The [spell_holder] pops with a flash!") + for(var/mob/living/M in targets) + apply_spell_damage(M) + return + +//PROJECTILE + +/obj/item/projectile/spell_projectile/seeking/magic_missile + name = "magic missile" + icon_state = "magicm" + + proj_trail = 1 + proj_trail_lifespan = 5 + proj_trail_icon_state = "magicmd" diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm new file mode 100644 index 0000000000..a0c403b51a --- /dev/null +++ b/code/modules/spells/targeted/projectile/projectile.dm @@ -0,0 +1,53 @@ +/* +Projectile spells make special projectiles (obj/item/spell_projectile) and fire them at targets +Dumbfire projectile spells fire directly ahead of the user +spell_projectiles call their spell's (carried) prox_cast when they get in range of a target +If the spell_projectile is seeking, it will update its target every process and follow them +*/ + +/spell/targeted/projectile + name = "projectile spell" + + range = 7 + + var/proj_type = /obj/item/projectile/spell_projectile //use these. They are very nice + + var/proj_step_delay = 1 //lower = faster + var/cast_prox_range = 1 + +/spell/targeted/projectile/cast(list/targets, mob/user = usr) + + if(istext(proj_type)) + proj_type = text2path(proj_type) // sanity filters + + for(var/atom/target in targets) + var/obj/item/projectile/projectile = new proj_type(user.loc, user.dir) + + if(!projectile) + return + + projectile.original = target + projectile.starting = get_turf(user) + projectile.shot_from = user //fired from the user + projectile.current = projectile.original + projectile.yo = target.y - user.y + projectile.xo = target.x - user.x + projectile.kill_count = src.duration + projectile.hitscan = !proj_step_delay + projectile.step_delay = proj_step_delay + if(istype(projectile, /obj/item/projectile/spell_projectile)) + var/obj/item/projectile/spell_projectile/SP = projectile + SP.carried = src //casting is magical + spawn projectile.process() + return + +/spell/targeted/projectile/proc/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder) + var/list/targets = list() + for(var/mob/living/M in range(spell_holder, cast_prox_range)) + if(M == user && !(spell_flags & INCLUDEUSER)) + continue + targets += M + return targets + +/spell/targeted/projectile/proc/prox_cast(var/list/targets, var/atom/movable/spell_holder) + return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/shift.dm b/code/modules/spells/targeted/shift.dm new file mode 100644 index 0000000000..8f8ef57e51 --- /dev/null +++ b/code/modules/spells/targeted/shift.dm @@ -0,0 +1,24 @@ +/spell/targeted/ethereal_jaunt/shift + name = "Phase Shift" + desc = "This spell allows you to pass through walls" + + charge_max = 200 + spell_flags = Z2NOCAST | INCLUDEUSER | CONSTRUCT_CHECK + invocation_type = SpI_NONE + range = -1 + duration = 50 //in deciseconds + + hud_state = "const_shift" + +/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) + animation.icon_state = "phase_shift" + animation.dir = target.dir + flick("phase_shift",animation) + +/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target) + animation.icon_state = "phase_shift2" + animation.dir = target.dir + flick("phase_shift2",animation) + +/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) + return \ No newline at end of file diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm new file mode 100644 index 0000000000..76cbcea777 --- /dev/null +++ b/code/modules/spells/targeted/subjugate.dm @@ -0,0 +1,20 @@ +/spell/targeted/subjugation + name = "Subjugation" + desc = "This spell temporarily subjugates a target's mind and does not require wizard garb." + + school = "transmutation" + charge_max = 300 + spell_flags = 0 + invocation = "DII ODA BAJI" + invocation_type = SpI_WHISPER + message = "You suddenly feel completely overwhelmed!" + + max_targets = 1 + + amt_dizziness = 300 + amt_confused = 300 + amt_stuttering = 300 + + compatible_mobs = list(/mob/living/carbon/human) + + hud_state = "wiz_subj" diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm new file mode 100644 index 0000000000..96bbab9905 --- /dev/null +++ b/code/modules/spells/targeted/targeted.dm @@ -0,0 +1,145 @@ +/* +Targeted spells (with the exception of dumbfire) select from all the mobs in the defined range +Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are explained in setup.dm +*/ + + +/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob + var/max_targets = 1 //leave 0 for unlimited targets in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range + var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast + + + var/amt_weakened = 0 + var/amt_paralysis = 0 + var/amt_stunned = 0 + + var/amt_dizziness = 0 + var/amt_confused = 0 + var/amt_stuttering = 0 + + //set to negatives for healing + var/amt_dam_fire = 0 + var/amt_dam_brute = 0 + var/amt_dam_oxy = 0 + var/amt_dam_tox = 0 + + var/amt_eye_blind = 0 + var/amt_eye_blurry = 0 + + var/list/compatible_mobs = list() + + +/spell/targeted/choose_targets(mob/user = usr) + var/list/targets = list() + + if(max_targets == 0) //unlimited + if(range == -2) + targets = living_mob_list + else + for(var/mob/living/target in view_or_range(range, user, selection_type)) + targets += target + + else if(max_targets == 1) //single target can be picked + if((range == 0 || range == -1) && spell_flags & INCLUDEUSER) + targets += user + else + var/list/possible_targets = list() + var/list/starting_targets + if(range == -2) + starting_targets = living_mob_list + else + starting_targets = view_or_range(range, user, selection_type) + + for(var/mob/living/M in starting_targets) + if(!(spell_flags & INCLUDEUSER) && M == user) + continue + if(compatible_mobs && compatible_mobs.len) + if(!is_type_in_list(M, compatible_mobs)) continue + if(compatible_mobs && compatible_mobs.len && !is_type_in_list(M, compatible_mobs)) + continue + possible_targets += M + + if(possible_targets.len) + if(spell_flags & SELECTABLE) //if we are allowed to choose. see setup.dm for details + var/mob/temp_target = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets + if(temp_target) + targets += temp_target + else + targets += pick(possible_targets) + //Adds a safety check post-input to make sure those targets are actually in range. + + + else + var/list/possible_targets = list() + var/list/starting_targets + + if(range == -2) + starting_targets = living_mob_list + else + starting_targets = view_or_range(range, user, selection_type) + + for(var/mob/living/target in starting_targets) + if(!(spell_flags & INCLUDEUSER) && target == user) + continue + if(compatible_mobs && !is_type_in_list(target, compatible_mobs)) + continue + possible_targets += target + + if(spell_flags & SELECTABLE) + for(var/i = 1; i<=max_targets, i++) + if(!possible_targets.len) + break + var/mob/M = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets + if(!M) + break + if(range != -2) + if(!(M in view_or_range(range, user, selection_type))) + continue + targets += M + possible_targets -= M + else + for(var/i=1,i<=max_targets,i++) + if(!possible_targets.len) + break + if(target_ignore_prev) + var/target = pick(possible_targets) + possible_targets -= target + targets += target + else + targets += pick(possible_targets) + + if(!(spell_flags & INCLUDEUSER) && (user in targets)) + targets -= user + + if(compatible_mobs && compatible_mobs.len) + for(var/mob/living/target in targets) //filters out all the non-compatible mobs + if(!is_type_in_list(target, compatible_mobs)) + targets -= target + + return targets + +/spell/targeted/cast(var/list/targets, mob/user) + for(var/mob/living/target in targets) + if(range >= 0) + if(!(target in view_or_range(range, user, selection_type))) //filter at time of casting + targets -= target + continue + apply_spell_damage(target) + +/spell/targeted/proc/apply_spell_damage(mob/living/target) + target.adjustBruteLoss(amt_dam_brute) + target.adjustFireLoss(amt_dam_fire) + target.adjustToxLoss(amt_dam_tox) + target.adjustOxyLoss(amt_dam_oxy) + //disabling + target.Weaken(amt_weakened) + target.Paralyse(amt_paralysis) + target.Stun(amt_stunned) + if(amt_weakened || amt_paralysis || amt_stunned) + if(target.buckled) + target.buckled = null + target.eye_blind += amt_eye_blind + target.eye_blurry += amt_eye_blurry + target.dizziness += amt_dizziness + target.confused += amt_confused + target.stuttering += amt_stuttering \ No newline at end of file diff --git a/code/modules/spells/trigger.dm b/code/modules/spells/trigger.dm deleted file mode 100644 index 5e2ed8475f..0000000000 --- a/code/modules/spells/trigger.dm +++ /dev/null @@ -1,28 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/trigger - name = "Trigger" - desc = "This spell triggers another spell or a few." - - var/list/linked_spells = list() //those are just referenced by the trigger spell and are unaffected by it directly - var/list/starting_spells = list() //those are added on New() to contents from default spells and are deleted when the trigger spell is deleted to prevent memory leaks - -/obj/effect/proc_holder/spell/targeted/trigger/New() - ..() - - for(var/spell in starting_spells) - var/spell_to_add = text2path(spell) - new spell_to_add(src) //should result in adding to contents, needs testing - -/obj/effect/proc_holder/spell/targeted/trigger/Del() - for(var/spell in contents) - del(spell) - - ..() - -/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets) - for(var/mob/living/target in targets) - for(var/obj/effect/proc_holder/spell/spell in contents) - spell.perform(list(target),0) - for(var/obj/effect/proc_holder/spell/spell in linked_spells) - spell.perform(list(target),0) - - return \ No newline at end of file diff --git a/code/modules/spells/turf_teleport.dm b/code/modules/spells/turf_teleport.dm deleted file mode 100644 index d59bff313a..0000000000 --- a/code/modules/spells/turf_teleport.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/turf_teleport - name = "Turf Teleport" - desc = "This spell teleports the target to the turf in range." - - var/inner_tele_radius = 1 - var/outer_tele_radius = 2 - - var/include_space = 0 //whether it includes space tiles in possible teleport locations - var/include_dense = 0 //whether it includes dense tiles in possible teleport locations - -/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets) - for(var/mob/living/target in targets) - var/list/turfs = new/list() - for(var/turf/T in range(target,outer_tele_radius)) - if(T in range(target,inner_tele_radius)) continue - if(istype(T,/turf/space) && !include_space) continue - if(T.density && !include_dense) continue - if(T.x>world.maxx-outer_tele_radius || T.xworld.maxy-outer_tele_radius || T.y[src] hums with power as [usr] deals a blow to reality itself!
          ") - else - user << "\red The unearthly energies that powered the blade are now dormant" - -// Scrying orb // - -/obj/item/weapon/scrying - name = "scrying orb" - desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." - icon = 'icons/obj/projectiles.dmi' - icon_state = "bluespace" - throw_speed = 3 - throw_range = 7 - throwforce = 10 - damtype = BURN - force = 10 - hitsound = 'sound/items/welder2.ogg' - -/obj/item/weapon/scrying/attack_self(mob/user as mob) - user << "You can see... everything!" - visible_message("[usr] stares into [src], their eyes glazing over.") - announce_ghost_joinleave(user.ghostize(1), 1, "You feel that they used a powerful artifact to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place with their presence.") - return \ No newline at end of file diff --git a/code/modules/spells/wizard_spells.dm b/code/modules/spells/wizard_spells.dm deleted file mode 100644 index f5d7fe9a8e..0000000000 --- a/code/modules/spells/wizard_spells.dm +++ /dev/null @@ -1,327 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/projectile/magic_missile - name = "Magic Missile" - desc = "This spell fires several, slow moving, magic projectiles at nearby targets." - - school = "evocation" - charge_max = 150 - clothes_req = 1 - invocation = "FORTI GY AMA" - invocation_type = "shout" - range = 7 - - max_targets = 0 - - proj_icon_state = "magicm" - proj_name = "a magic missile" - proj_lingering = 1 - proj_type = "/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile" - - proj_lifespan = 20 - proj_step_delay = 5 - - proj_trail = 1 - proj_trail_lifespan = 5 - proj_trail_icon_state = "magicmd" - -/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile - amt_weakened = 5 - amt_dam_fire = 10 - -/obj/effect/proc_holder/spell/targeted/genetic/mutate - name = "Mutate" - desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." - - school = "transmutation" - charge_max = 400 - clothes_req = 1 - invocation = "BIRUZ BENNAR" - invocation_type = "shout" - message = "\blue You feel strong! You feel a pressure building behind your eyes!" - range = -1 - include_user = 1 - - mutations = list(LASER, HULK) - duration = 300 - -/obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate - name = "Disintegrate" - desc = "This spell instantly kills somebody adjacent to you with the vilest of magick." - - school = "evocation" - charge_max = 600 - clothes_req = 1 - invocation = "EI NATH" - invocation_type = "shout" - range = 1 - - destroys = "gib_brain" - - sparks_spread = 1 - sparks_amt = 4 - -/obj/effect/proc_holder/spell/targeted/smoke - name = "Smoke" - desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - - school = "conjuration" - charge_max = 120 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = -1 - include_user = 1 - - smoke_spread = 2 - smoke_amt = 10 - -/obj/effect/proc_holder/spell/targeted/emplosion/disable_tech - name = "Disable Tech" - desc = "This spell disables all weapons, cameras and most other technology in range." - charge_max = 400 - clothes_req = 1 - invocation = "NEC CANTIO" - invocation_type = "shout" - range = -1 - include_user = 1 - - emp_heavy = 6 - emp_light = 10 - -/obj/effect/proc_holder/spell/targeted/turf_teleport/blink - name = "Blink" - desc = "This spell randomly teleports you a short distance." - - school = "abjuration" - charge_max = 20 - clothes_req = 1 - invocation = "none" - invocation_type = "none" - range = -1 - include_user = 1 - - smoke_spread = 1 - smoke_amt = 10 - - inner_tele_radius = 0 - outer_tele_radius = 6 - - centcomm_cancast = 0 //prevent people from getting to centcomm - -/obj/effect/proc_holder/spell/targeted/area_teleport/teleport - name = "Teleport" - desc = "This spell teleports you to a type of area of your selection." - - school = "abjuration" - charge_max = 600 - clothes_req = 1 - invocation = "SCYAR NILA" - invocation_type = "shout" - range = -1 - include_user = 1 - - smoke_spread = 1 - smoke_amt = 5 - -/obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall - name = "Forcewall" - desc = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." - - school = "transmutation" - charge_max = 100 - clothes_req = 0 - invocation = "TARCOL MINTI ZHERI" - invocation_type = "whisper" - range = 0 - - summon_type = list("/obj/effect/forcefield") - summon_lifespan = 300 - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/carp - name = "Summon Carp" - desc = "This spell conjures a simple carp." - - school = "conjuration" - charge_max = 1200 - clothes_req = 1 - invocation = "NOUK FHUNMM SACP RISSKA" - invocation_type = "shout" - range = 1 - - summon_type = list(/mob/living/simple_animal/hostile/carp) - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/construct - name = "Artificer" - desc = "This spell conjures a construct which may be controlled by Shades" - - school = "conjuration" - charge_max = 600 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = 0 - - summon_type = list(/obj/structure/constructshell) - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/creature - name = "Summon Creature Swarm" - desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" - - school = "conjuration" - charge_max = 1200 - clothes_req = 0 - invocation = "IA IA" - invocation_type = "shout" - summon_amt = 10 - range = 3 - - summon_type = list(/mob/living/simple_animal/hostile/creature) - -/obj/effect/proc_holder/spell/targeted/trigger/blind - name = "Blind" - desc = "This spell temporarily blinds a single person and does not require wizard garb." - - school = "transmutation" - charge_max = 300 - clothes_req = 0 - invocation = "STI KALY" - invocation_type = "whisper" - message = "\blue Your eyes cry out in pain!" - - starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind","/obj/effect/proc_holder/spell/targeted/genetic/blind") - -/obj/effect/proc_holder/spell/targeted/inflict_handler/blind - amt_eye_blind = 10 - amt_eye_blurry = 20 - -/obj/effect/proc_holder/spell/targeted/genetic/blind - disabilities = 1 - duration = 300 - -/obj/effect/proc_holder/spell/dumbfire/fireball - name = "Fireball" - desc = "This spell fires a fireball at a target and does not require wizard garb." - - school = "evocation" - charge_max = 100 - clothes_req = 0 - invocation = "ONI SOMA" - invocation_type = "shout" - range = 20 - - proj_icon_state = "fireball" - proj_name = "a fireball" - proj_type = "/obj/effect/proc_holder/spell/turf/fireball" - - proj_lifespan = 200 - proj_step_delay = 1 - -/obj/effect/proc_holder/spell/turf/fireball/cast(var/turf/T) - explosion(T, -1, 1, 2, 3) - - -/obj/effect/proc_holder/spell/targeted/inflict_handler/fireball - amt_dam_brute = 20 - amt_dam_fire = 25 - -/obj/effect/proc_holder/spell/targeted/explosion/fireball - ex_severe = -1 - ex_heavy = -1 - ex_light = 2 - ex_flash = 5 - - - - - - -//////////////////////////////Construct Spells///////////////////////// - -/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser - charge_max = 1800 - -/obj/effect/proc_holder/spell/aoe_turf/conjure/floor - name = "Floor Construction" - desc = "This spell constructs a cult floor" - - school = "conjuration" - charge_max = 20 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = 0 - summon_type = list(/turf/simulated/floor/engine/cult) - centcomm_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles - -/obj/effect/proc_holder/spell/aoe_turf/conjure/wall - name = "Leser Construction" - desc = "This spell constructs a cult wall" - - school = "conjuration" - charge_max = 100 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = 0 - summon_type = list(/turf/simulated/wall/cult) - centcomm_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles - -/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced - name = "Greater Construction" - desc = "This spell constructs a reinforced metal wall" - - school = "conjuration" - charge_max = 300 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = 0 - centcomm_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles - delay = 50 - - summon_type = list(/turf/simulated/wall/r_wall) - -/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone - name = "Summon Soulstone" - desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space" - - school = "conjuration" - charge_max = 3000 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = 0 - - summon_type = list(/obj/item/device/soulstone) - - -/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall - name = "Shield" - desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire" - - school = "transmutation" - charge_max = 300 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = 0 - summon_type = list(/obj/effect/forcefield) - summon_lifespan = 50 - - -/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift - name = "Phase Shift" - desc = "This spell allows you to pass through walls" - - school = "transmutation" - charge_max = 200 - clothes_req = 0 - invocation = "none" - invocation_type = "none" - range = -1 - include_user = 1 - phaseshift = 1 - jaunt_duration = 50 //in deciseconds - centcomm_cancast = 0 //Stop people from getting to centcomm \ No newline at end of file diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 6cdf0c3e91..e9a23bb23b 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -47,6 +47,7 @@ var/damage_archived = 0 var/safe_alert = "Crystaline hyperstructure returning to safe operating levels." var/safe_warned = 0 + var/public_alert = 0 //Stick to Engineering frequency except for big warnings when integrity bad var/warning_point = 100 var/warning_alert = "Danger! Crystal hyperstructure instability!" var/emergency_point = 700 @@ -88,11 +89,11 @@ /obj/machinery/power/supermatter/New() . = ..() - radio = new (src) + radio = new /obj/item/device/radio{channels=list("Engineering")}(src) -/obj/machinery/power/supermatter/Del() - del radio +/obj/machinery/power/supermatter/Destroy() + qdel(radio) . = ..() /obj/machinery/power/supermatter/proc/explode() @@ -111,7 +112,7 @@ mob.apply_effect(rads, IRRADIATE) spawn(pull_time) explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) - del src + qdel(src) return //Changes color and luminosity of the light to these values if they were not already set @@ -126,7 +127,7 @@ integrity = round(100 - integrity * 100) integrity = integrity < 0 ? 0 : integrity var/alert_msg = " Integrity at [integrity]%" - + if(damage > emergency_point) alert_msg = emergency_alert + alert_msg lastwarning = world.timeofday - WARNING_DELAY * 4 @@ -141,7 +142,15 @@ else alert_msg = null if(alert_msg) - radio.autosay(alert_msg, "Supermatter Monitor") + radio.autosay(alert_msg, "Supermatter Monitor", "Engineering") + //Public alerts + if((damage > emergency_point) && !public_alert) + radio.autosay("WARNING: SUPERMATTER CRYSTAL DELAMINATION IMMINENT!", "Supermatter Monitor") + public_alert = 1 + else if(safe_warned && public_alert) + radio.autosay(alert_msg, "Supermatter Monitor") + public_alert = 0 + /obj/machinery/power/supermatter/process() @@ -311,7 +320,7 @@ user.dust() power += 200 else - del user + qdel(user) power += 200 @@ -332,29 +341,7 @@ defer_powernet_rebuild = 1 // Let's just make this one loop. for(var/atom/X in orange(pull_radius,src)) - // Movable atoms only - if(istype(X, /atom/movable)) - if(is_type_in_list(X, uneatable)) continue - if(((X) && (!istype(X,/mob/living/carbon/human)))) - step_towards(X,src) - if(istype(X, /obj)) //unanchored objects pulled twice as fast - var/obj/O = X - if(!O.anchored) - step_towards(X,src) - else - step_towards(X,src) - if(istype(X, /obj/structure/window)) //shatter windows - var/obj/structure/window/W = X - W.ex_act(2.0) - else if(istype(X,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = X - if(istype(H.shoes,/obj/item/clothing/shoes/magboots)) - var/obj/item/clothing/shoes/magboots/M = H.shoes - if(M.magpulse) - step_towards(H,src) //step just once with magboots - continue - step_towards(H,src) //step twice - step_towards(H,src) + X.singularity_pull(src, STAGE_FIVE) if(defer_powernet_rebuild != 2) defer_powernet_rebuild = 0 diff --git a/code/modules/surgery/headreattach.dm b/code/modules/surgery/headreattach.dm index 9957ee8b78..ad47b14429 100644 --- a/code/modules/surgery/headreattach.dm +++ b/code/modules/surgery/headreattach.dm @@ -1,5 +1,6 @@ //This is an uguu head restoration surgery TOTALLY not yoinked from chinsky's limb reattacher /datum/surgery_step/attach_head/ + priority = 3 // Must be higher than /datum/surgery_step/internal allowed_tools = list(/obj/item/organ/external/head = 100) can_infect = 0 @@ -7,20 +8,20 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if(..()) - var/obj/item/organ/external/head = target.get_organ(target_zone) - return !head && target_zone == "head" + var/obj/item/organ/external/head = target.get_organ(target_zone) + return isnull(head) && target_zone == "head" && !isnull(target.species.has_limbs["head"]) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts attaching [tool] to [target]'s reshaped neck.", \ - "You start attaching [tool] to [target]'s reshaped neck.") + user.visible_message("[user] starts attaching [tool] to [target]'s neck.", \ + "You start attaching [tool] to [target]'s neck.") end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\blue [user] has attached [target]'s head to the body.", \ "\blue You have attached [target]'s head to the body.") var/obj/item/organ/external/head = tool - head.loc = target + user.drop_from_inventory(head) head.replaced(target) + head.loc = target head.status = 0 target.update_body() target.updatehealth() diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 8f5d7155dd..182c3eac2a 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -228,7 +228,7 @@ var/list/attached_organs = list() for(var/organ in target.internal_organs_by_name) var/obj/item/organ/I = target.internal_organs_by_name[organ] - if(!I.status && I.parent_organ == target_zone) + if(I && !I.status && I.parent_organ == target_zone) attached_organs |= organ var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs @@ -347,7 +347,7 @@ return 0 else if(target.species.has_organ[O.organ_tag]) - if(O.is_damaged()) + if(O.damage > (O.max_damage * 0.75)) user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." return 2 @@ -410,7 +410,7 @@ var/list/removable_organs = list() for(var/organ in target.internal_organs_by_name) var/obj/item/organ/I = target.internal_organs_by_name[organ] - if(I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone) + if(I && I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone) removable_organs |= organ var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm index e845d8bb7b..d8214837bf 100644 --- a/code/modules/surgery/robolimbs.dm +++ b/code/modules/surgery/robolimbs.dm @@ -41,7 +41,7 @@ for(var/part_name in L.part) if(!isnull(target.get_organ(part_name))) continue - var/list/organ_data = target.species.has_limbs["[target_zone]"] + var/list/organ_data = target.species.has_limbs["[part_name]"] if(!organ_data) continue var/new_limb_type = organ_data["path"] @@ -54,7 +54,7 @@ target.updatehealth() target.UpdateDamageIcon() - del(tool) + qdel(tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\red [user]'s hand slips, damaging [target]'s flesh!", \ diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 968a09c287..b539dde039 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -306,7 +306,7 @@ var/datum/vehicle_dummy_load/dummy_load = load load = dummy_load.actual_load dummy_load.actual_load = null - del(dummy_load) + qdel(dummy_load) overlays.Cut() ..() diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index c39c8ec047..e733ad8df4 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -149,7 +149,7 @@ /obj/vehicle/emp_act(severity) var/was_on = on stat |= EMPED - var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc ) + var/obj/effect/overlay/pulse2 = PoolOrNew(new/obj/effect/overlay, src.loc) pulse2.icon = 'icons/effects/effects.dmi' pulse2.icon_state = "empdisable" pulse2.name = "emp sparks" @@ -157,7 +157,7 @@ pulse2.set_dir(pick(cardinal)) spawn(10) - pulse2.delete() + qdel(pulse2) if(on) turn_off() spawn(severity*300) @@ -201,8 +201,8 @@ src.visible_message("\red [src] blows apart!", 1) var/turf/Tsec = get_turf(src) - new /obj/item/stack/rods(Tsec) - new /obj/item/stack/rods(Tsec) + PoolOrNew(/obj/item/stack/rods, Tsec) + PoolOrNew(/obj/item/stack/rods, Tsec) new /obj/item/stack/cable_coil/cut(Tsec) if(cell) @@ -220,7 +220,7 @@ new /obj/effect/gibspawner/robot(Tsec) new /obj/effect/decal/cleanable/blood/oil(src.loc) - del(src) + qdel(src) /obj/vehicle/proc/healthcheck() if(health <= 0) diff --git a/code/modules/virus2/biohazard destroyer.dm b/code/modules/virus2/biohazard destroyer.dm index abd1803de8..c6281e1680 100644 --- a/code/modules/virus2/biohazard destroyer.dm +++ b/code/modules/virus2/biohazard destroyer.dm @@ -10,7 +10,7 @@ for(var/path in accepts) if(I.type in typesof(path)) user.drop_item() - del(I) + qdel(I) overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle") return user.drop_item() diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index 741fdb099d..7508818a6d 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -64,7 +64,7 @@ for(var/mob/living/carbon/target in view(1, get_turf(src))) if(airborne_can_reach(get_turf(src), get_turf(target))) infect_virus2(target, src.virus2) - del src + qdel(src) /obj/item/weapon/virusdish/examine(mob/user) ..() @@ -91,7 +91,7 @@ if(prob(50)) user << "\The [src] shatters!" - del src + qdel(src) ///////////////GNA DISK/////////////// diff --git a/code/setup.dm b/code/setup.dm index 29ea83aeaf..68c2b94c75 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -1,5 +1,10 @@ #define DEBUG +#define GAME_STATE_PREGAME 1 +#define GAME_STATE_SETTING_UP 2 +#define GAME_STATE_PLAYING 3 +#define GAME_STATE_FINISHED 4 + // Math constants. #define M_E 2.71828183 #define M_PI 3.14159265 @@ -192,6 +197,7 @@ #define NOBLOODY 512 // Used for items if they don't want to get a blood overlay. #define NODELAY 8192 // 1 second attack-by delay skipped (Can be used once every 0.2s). Most objects have a 1s attack-by delay, which doesn't require a flag. +//Use these flags to indicate if an item obscures the specified slots from view, whereas body_parts_covered seems to be used to indicate what body parts the item protects. #define GLASSESCOVERSEYES 256 #define MASKCOVERSEYES 256 // Get rid of some of the other retardation in these flags. #define HEADCOVERSEYES 256 // Feel free to reallocate these numbers for other purposes. @@ -255,10 +261,12 @@ #define slot_legs 21 #define slot_tie 22 -// Mob sprite sheets. These need to be strings as numbers -// cannot be used as associative list keys. -#define icon_l_hand "slot_l_hand" -#define icon_r_hand "slot_r_hand" +// Inventory slot strings. +// since numbers cannot be used as associative list keys. +#define slot_back_str "back" +#define slot_l_hand_str "slot_l_hand" +#define slot_r_hand_str "slot_r_hand" +#define slot_w_uniform_str "w_uniform" // Bitflags for clothing parts. #define HEAD 1 @@ -756,6 +764,7 @@ var/list/be_special_flags = list( #define MAX_MESSAGE_LEN 1024 #define MAX_PAPER_MESSAGE_LEN 3072 #define MAX_BOOK_MESSAGE_LEN 9216 +#define MAX_LNAME_LEN 64 #define MAX_NAME_LEN 26 // Event defines. @@ -778,8 +787,6 @@ var/list/be_special_flags = list( //General-purpose life speed define for plants. #define HYDRO_SPEED_MULTIPLIER 1 -#define NANO_IGNORE_DISTANCE 1 - // Robot AI notifications #define ROBOT_NOTIFICATION_NEW_UNIT 1 #define ROBOT_NOTIFICATION_NEW_NAME 2 @@ -863,3 +870,87 @@ var/list/be_special_flags = list( #define DROPLIMB_EDGE 0 #define DROPLIMB_BLUNT 1 #define DROPLIMB_BURN 2 + +// Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc. +#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 +#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed +#define OBFUSCATION_LAYER 14 //Where images covering the view for eyes are put +#define SCREEN_LAYER 17 //Mob HUD/effects layer + + +///////////////// +////WIZARD ////// +///////////////// + +/* WIZARD SPELL FLAGS */ +#define GHOSTCAST 1 //can a ghost cast it? +#define NEEDSCLOTHES 2 //does it need the wizard garb to cast? Nonwizard spells should not have this +#define NEEDSHUMAN 4 //does it require the caster to be human? +#define Z2NOCAST 8 //if this is added, the spell can't be cast at centcomm +#define STATALLOWED 16 //if set, the user doesn't have to be conscious to cast. Required for ghost spells +#define IGNOREPREV 32 //if set, each new target does not overlap with the previous one +//The following flags only affect different types of spell, and therefore overlap +//Targeted spells +#define INCLUDEUSER 64 //does the spell include the caster in its target selection? +#define SELECTABLE 128 //can you select each target for the spell? +//AOE spells +#define IGNOREDENSE 64 //are dense turfs ignored in selection? +#define IGNORESPACE 128 //are space turfs ignored in selection? +//End split flags +#define CONSTRUCT_CHECK 256 //used by construct spells - checks for nullrods +#define NO_BUTTON 512 //spell won't show up in the HUD with this + +//invocation +#define SpI_SHOUT "shout" +#define SpI_WHISPER "whisper" +#define SpI_EMOTE "emote" +#define SpI_NONE "none" + +//upgrading +#define Sp_SPEED "speed" +#define Sp_POWER "power" +#define Sp_TOTAL "total" + +//casting costs +#define Sp_RECHARGE "recharge" +#define Sp_CHARGES "charges" +#define Sp_HOLDVAR "holdervar" + +///////WIZ END///////// + +//singularity defines +#define STAGE_ONE 1 +#define STAGE_TWO 3 +#define STAGE_THREE 5 +#define STAGE_FOUR 7 +#define STAGE_FIVE 9 +#define STAGE_SUPER 11 + +// Camera networks +#define NETWORK_CRESCENT "Crescent" +#define NETWORK_CIVILIAN_EAST "Civilian East" +#define NETWORK_CIVILIAN_WEST "Civilian West" +#define NETWORK_COMMAND "Command" +#define NETWORK_ENGINE "Engine" +#define NETWORK_ENGINEERING "Engineering" +#define NETWORK_ENGINEERING_OUTPOST "Engineering Outpost" +#define NETWORK_ERT "ERT" +#define NETWORK_EXODUS "Exodus" +#define NETWORK_MEDICAL "Medical" +#define NETWORK_MINE "MINE" +#define NETWORK_RESEARCH "Research" +#define NETWORK_RESEARCH_OUTPOST "Research Outpost" +#define NETWORK_PRISON "Prison" +#define NETWORK_SECURITY "Security" +#define NETWORK_TELECOM "Tcomsat" +#define NETWORK_THUNDER "thunder" + +// Languages +#define LANGUAGE_SOL_COMMON "Sol Common" +#define LANGUAGE_UNATHI "Sinta'unathi" +#define LANGUAGE_SIIK_MAAS "Siik'maas" +#define LANGUAGE_SIIK_TAJR "Siik'tajr" +#define LANGUAGE_SKRELLIAN "Skrellian" +#define LANGUAGE_ROOTSPEAK "Rootspeak" +#define LANGUAGE_TRADEBAND "Tradeband" +#define LANGUAGE_GUTTER "Gutter" diff --git a/code/world.dm b/code/world.dm index 01c6b0d1c5..58823fec88 100644 --- a/code/world.dm +++ b/code/world.dm @@ -8,7 +8,7 @@ var/global/datum/global_init/init = new () makeDatumRefLists() load_configuration() - del(src) + qdel(src) /world diff --git a/config/example/config.txt b/config/example/config.txt index a0c999bcf4..a8dcac8e27 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -329,9 +329,14 @@ STARLIGHT 0 ## Example races include: Human, Tajara, Skrell, Unathi # ERT_SPECIES Human;Skrell;Unathi -## Defines how Law Zero is phrased. Primarily in the Malfunction gamemode. +## Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode. # LAW_ZERO ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010 -## Enable asteroid tunnel/cave generation. Will behave strangely if turned off with a map that expects it on. + +## Enable asteroid tunnel/cave generation. Will behave strangely if turned off with a map that expects it on. # GENERATE_ASTEROID + + +## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog +#AGGRESSIVE_CHANGELOG diff --git a/html/80x15.png b/html/80x15.png deleted file mode 100644 index ed028fed9d..0000000000 Binary files a/html/80x15.png and /dev/null differ diff --git a/html/AddToChangelog.exe b/html/AddToChangelog.exe deleted file mode 100644 index 3625bd27cc..0000000000 Binary files a/html/AddToChangelog.exe and /dev/null differ diff --git a/html/admin_pm.html b/html/admin_pm.html deleted file mode 100644 index 6993b21502..0000000000 --- a/html/admin_pm.html +++ /dev/null @@ -1,53 +0,0 @@ - - Shittiest Player Ever - PM - - -
          - - Badmin: Hey why the fuck are you killing that dude???

          - Shittiest Player Ever: he tok ym baten n id and i ahd to use the lasre on his *ss

          - Badmin: wow good fucking job, you are the best player ever!!!!!!

          - Badmin: where the fuck did you learn english?

          - Shittiest Player Ever: he tryed to k;ikll me

          - Badmin: you are shit!!!!! -
          - -
          -
          - - - -
          - - \ No newline at end of file diff --git a/html/changelog.css b/html/changelog.css index 1d2b6a6445..0637dffa67 100644 --- a/html/changelog.css +++ b/html/changelog.css @@ -1,36 +1,35 @@ -.top{font-family:Tahoma,sans-serif;font-size:12px;} -h2{font-family:Tahoma,sans-serif;} -a img {border:none;} -.bgimages16 li { - padding:2px 10px 2px 30px; - background-position:6px center; - background-repeat:no-repeat; - border:1px solid #ddd; - border-left:4px solid #999; - margin-bottom:2px; -} -.bugfix {background-image:url(bug-minus.png)} -.wip {background-image:url(hard-hat-exclamation.png)} -.tweak {background-image:url(wrench-screwdriver.png)} -.soundadd {background-image:url(music-plus.png)} -.sounddel {background-image:url(music-minus.png)} -.rscdel {background-image:url(cross-circle.png)} -.rscadd {background-image:url(tick-circle.png)} -.imageadd {background-image:url(image-plus.png)} -.imagedel {background-image:url(image-minus.png)} -.spellcheck {background-image:url(spell-check.png)} -.experiment {background-image:url(burn-exclamation.png)} -.tgs {background-image:url(tg-notif.png)} -.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} -.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} -.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} -.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} -.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} -.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} -.hidden {display:none;} -.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} -.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} -.indrop img {margin-right:5px;vertical-align:middle;} -.closed {background:url(chevron-expand.png) right center no-repeat;} -.open {background:url(chevron.png) right center no-repeat;} +.top{font-family:Tahoma,sans-serif;font-size:12px;} +h2{font-family:Tahoma,sans-serif;} +a img {border:none;} +.bgimages16 li { + padding:2px 10px 2px 30px; + background-position:6px center; + background-repeat:no-repeat; + border:1px solid #ddd; + border-left:4px solid #999; + margin-bottom:2px; +} +.bugfix {background-image:url(bug-minus.png)} +.wip {background-image:url(hard-hat-exclamation.png)} +.tweak {background-image:url(wrench-screwdriver.png)} +.soundadd {background-image:url(music-plus.png)} +.sounddel {background-image:url(music-minus.png)} +.rscdel {background-image:url(cross-circle.png)} +.rscadd {background-image:url(tick-circle.png)} +.imageadd {background-image:url(image-plus.png)} +.imagedel {background-image:url(image-minus.png)} +.spellcheck {background-image:url(spell-check.png)} +.experiment {background-image:url(burn-exclamation.png)} +.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} +.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} +.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} +.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} +.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} +.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} +.hidden {display:none;} +.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} +.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} +.indrop img {margin-right:5px;vertical-align:middle;} +.closed {background:url(chevron-expand.png) right center no-repeat;} +.open {background:url(chevron.png) right center no-repeat;} .lic {font-size:9px;} \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 11ccdbedce..e3cee7c713 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -3,6 +3,7 @@ Baystation 12 Changelog + -
          Space Station 13
          +

          - Code licensed under GPLv3. Content licensed under CC BY-SA 3.0.

          + Code licensed under AGPLv3. Content licensed under CC BY-SA 3.0.

          + Visit our IRC channel: #bs12 on irc.sorcery.net
          +
          Baystation 12 Credit List
          + Current Project Maintainers: -Click Here-
          + Currently Active GitHub contributor list: -Click Here-
          Code: Abi79, Aryn, Cael_Aislinn, Ccomp5950, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, JoeyJo0, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, PsiOmegaDelta, SkyMarshal, Snapshot, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty
          Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, JoeyJo0, Miniature, Searif, Xenone, faux
          Sounds: Aryn
          - Thanks To: /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot. + Main Testers: Anyone who has submitted a bug to the issue tracker
          + Thanks to: /tg/ station, /vg/station, GoonStation devs, the original SpaceStation developers and Invisty for the title image.
          Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on irc.
          +
          Have a bug to report?
          Visit our Issue Tracker.
          - + +
          +

          05 May 2015

          +

          PsiOmegaDelta updated:

          +
            +
          • Grilles no longer return too many rods when destroyed (using means other than wirecutters).
          • +
          +

          RavingManiac updated:

          +
            +
          • Intent menu now appears while zooming with a sniper rifle.
          • +
          - +

          02 May 2015

          +

          HarpyEagle updated:

          +
            +
          • Neck-grabbing someone now stuns them properly.
          • +
          +

          PsiOmegaDelta updated:

          +
            +
          • The spider infestation event now makes an announcement much sooner.
          • +
          • Admins can now toggle OOC/LOOC separately.
          • +
          • Mice are now numbered to aid admins.
          • +
          +

          Yoshax updated:

          +
            +
          • Adds an option and verb to the AI to send emergency messages to Central, functions same as comms console option.
          • +
          • Changes comms console to only have one level of ID require, meaning all heads of staff have what was captain access, allowing them to change alert, send emergency messages and make announcements.
          • +
          • Adds an emergency bluespace relay machine which is mapped into teletcomms, this machine takes emergency messages and sends them to central, if one does not exist on any Z, you cannot send any emergency messages.
          • +
          • Adds an emergency bluespace relay assembly kit orderable from cargo for when the ones on telecomms are destroyed. Assembly is required.
          • +
          • Adds the emergency bluespace relay circuitboard to be researchable and printable in R&D, with sufficient tech levels.
          • +
          - +

          30 April 2015

          +

          Yoshax updated:

          +
            +
          • Adds more items to custom loadout, including a number of dressy suits and some other things.
          • +
          - +

          29 April 2015

          +

          Daranz updated:

          +
            +
          • Paper bundles can now have papers inserted at arbitrary points. This can be done by clicking the previous/next page links with a sheet of paper in hand.
          • +
          +

          HarpyEagle updated:

          +
            +
          • Added new fire modes to various guns: c20r, STS-35, WT-550, Z8, L6 SAW, and double barreled shotgun. The firing modes work the same way as the egun; click on the weapon with it in your active hand to cycle between modes. Unloading these weapons now requires that you click on them with an empty hand.
          • +
          +

          PsiOmegaDelta updated:

          +
            +
          • Portable atmospheric pumps and scrubbers now use NanoUI.
          • +
          • Two new events which will cause damage to APCs or cameras when triggered.
          • +
          -
          -

          24 February 2015

          -

          Zuhayr updated:

          -
            -
          • Major changes to the kitchen and hydroponics mechanics. Review the detailed changelog here,
          • -
          -
          +

          28 April 2015

          +

          Jarcolr updated:

          +
            +
          • Added 9 new bar sign designs/sprites.
          • +
          +

          Kelenius updated:

          +
            +
          • Good news to the roboticists! The long waited firmware update for the bots has arrived. You can expect the following changes:
          • +
          • Medbots have improved the disease detection algorithms.
          • +
          • Floorbot firmware has been bugtested. In particular, they will no longer get stuck near the windows, hopelessly trying to fix the floor under the glass.
          • +
          • Floorbots have also received an internal low-power metal synthesizer. They will use it to make their own tiles. Slowly.
          • +
          • Following the complains from humanitarian organizations regarding securitron brutality, stength of their stunners has been toned down. They will also politely demand that you get on the floor before arresting you. Except for the taser-mounted guys, they will still tase you down.
          • +
          • Other minor fixes.
          • +
          • The lasertag bots are now forbidden to build and use following the incident #1526672. Please don't let it happen again.
          • +
          • The farmbot design has been finished! Made from a watertank, robot arm, plant analyzer, bucket, minihoe and a proximity sensor, these small (not really) bots will be a useful companion to any gardener and/or xenobotanist.
          • +
          • Spider learning alert: they have learned to recognize the bots and will mercilessly attack them.
          • +
          • An experimental CPU upgrade would theoretically allow any of the bots to function with the same intelligence capacity as the maintenance drones. We still have no idea what causes it to boot up. Science!
          • +
          • INCOMING TRANSMISSION: Greetings to agents, pirates, operatives, and anyone who otherwise uses our equipment. Following the NT update of bot firmware, we have updated the cryptographic sequencer's hacking routines as well. The medbots you emag will not poison you anymore, the clanbots won't clean after themselves immediately, and floorbots... wear a space suit. Oh, and it works on the new farmbots, too.
          • +
          +

          PsiOmegaDelta updated:

          +
            +
          • Beware. Airlocks can now crush more things than just mobs.
          • +
          • AIs now have a personal atmospherics control subsystem.
          • +
          • Some borg modules now have additional subsystems.
          • +
          • Improves borg module handling.
          • +
          • Secure airlocks now buzz when access is denied.
          • +
          • The mental health office door now requires psychiatrist access, and the related button now opens/closes the door instead of bolting.
          • +
          • Restores an old soundtrack 'Thunderdome.ogg'.
          • +
          • Some holodeck programs now have custom ambience tracks.
          • +
          +

          RavingManiac updated:

          +
            +
          • The phoron research lab has been renovated to include a heat-exchange system, a gas mixer/filter and a waste gas disposal pump.
          • +
          • Candles now burn for about 30 mintutes.
          • +
          +

          Yoshax updated:

          +
            +
          • Adds items to the orderable antag surgical kit so its actually useful for surgery.
          • +
          • Adjusts custom loadout costs to be more standardised and balances. Purely cosmetic items, shoes, hats, and all things that do not provide a straight advtange (sterile mask, or pAI, protection from viruses and possible door hacking or records access, respectively), each cost 1 point, items that provide an advantage like those just mentioned, or provide armor or storage cost 2 points.
          • +
          • Adds practice rounds, both .45 for Sec and Detective's guns, also 9mm top mounted for the Saber, and for the Bulldog.
          • +
          • Adds the .45 and 9mm practice rounds to the armory.
          • +
          • Adds all the practice rounds to the autolathe.
          • +
          • Adds r_walls to the back of the firing range, leaves the sides normal.
          • +
          • Fixes HoS' office door to not be CMO locked.
          • +
          +

          24 April 2015

          +

          Dennok updated:

          +
            +
          • Fixes overmap ship speed calculations.
          • +
          • Adds overmap ship rotation.
          • +
          • Added a floorlayer.
          • +
          -
          -

          18 February 2015

          -

          PsiOmegaDelta updated:

          -
            -
          • Synths now have timestamped radio and chat messages.
          • -
          • New and updated uplink items.
          • -
          • Multiple AIs can now share the same holopad.
          • -
          • The AI now has built-in consoles, accessible from the subsystem tab.
          • -
          -
          +

          23 April 2015

          +

          Dennok updated:

          +
            +
          • Added an automatic pipelayer.
          • +
          • Added an automatic cablelayer.
          • +
          +

          PsiOmegaDelta updated:

          +
            +
          • Shower curtains no longer lose their default color upon being washed.
          • +
          • Emergency shutters can again be examined, and from the proper distance.
          • +
          • The virus event will now only infect mobs on the station, currently controlled by player that has been active in the last 5 minutes.
          • +
          • Laptops now use the proper proc for checking camera status.
          • +
          • Makes it possible to eject PDA cartridges using a verb.
          • +
          • Makes it possible to shake tables with one's bare hands to stop climbers.
          • +
          • Added a mass driver door in disposals to prevent trash from floating out into space before proper ejection.
          • +
          • Rig/Hardsuit module tab - Less informative than the NanoUI hardsuit interface but allows quicker access to the various rig modules.
          • +
          • Silicons with the medical augmentation sensors enabled now also see alive/dead status if sensors are set accordingly.
          • +
          • Emergency shutters opened by silicons are now treated as having been forced open by a crowbar.
          • +
          • An active AI chassis can now be pushed, just as an empty chassis can be.
          • +
          • The AI can now use the crew monitor console to track crew members with full sensors enabled.
          • +
          • The AI now has a shortcut to track people holding up messages to cameras.
          • +
          • The AI now has a shortcut to track people sending PDA messages.
          • +
          • Multiple AIs can now share the same holopad.
          • +
          • Admin ghosts can now transfer other ghosts into mobs by drag-clicking.
          • +
          • Ghosts can now toggle seeing darkness and other ghosts separately.
          • +
          • Moving while dead now auto-ghosts you.
          • +
          • Two new random events: Space dust and gravitation failure.
          • +
          • Upgraded wizard spell interface and new spells.
          • +
          • More uplink items.
          • +
          • Uplink items now have rudimentary descriptions.
          • +
          +

          Yoshax updated:

          +
            +
          • Adjusts fruits and other stuff to have a minmum of 10 units of juice and stuff.
          • +
          +

          18 April 2015

          +

          PsiOmegaDelta updated:

          +
            +
          • Added a changelog editing system that should cause fewer conflicts and more accurate timestamps.
          • +
          +

          07 April 2015

          +

          RavingManiac updated:

          +
            +
          • You can now pay vending machines and EFTPOS scanners without removing your ID from your PDA or wallet. Clicking on the vending machine with your ID/PDA/wallet/cash also brings up the menu now instead of attacking the vending machine.
          • +
          -
          -

          16 February 2015

          -

          RavingManiac updated:

          -
            -
          • Say hello to the new Thermoelectric Supermatter Engine. Read the operating manual to get started.
          • -
          -
          +

          24 February 2015

          +

          Zuhayr updated:

          +
            +
          • Major changes to the kitchen and hydroponics mechanics. Review the detailed changelog here,
          • +
          +

          18 February 2015

          +

          PsiOmegaDelta updated:

          +
            +
          • Synths now have timestamped radio and chat messages.
          • +
          • New and updated uplink items.
          • +
          • Multiple AIs can now share the same holopad.
          • +
          • The AI now has built-in consoles, accessible from the subsystem tab.
          • +
          -
          -

          12 February 2015

          -

          Daranz updated:

          -
            -
          • Vending machines now use NanoUI and accept cash. The vendor account can now be suspended to disable all sales in all machines on station.
          • -
          -
          +

          16 February 2015

          +

          RavingManiac updated:

          +
            +
          • Say hello to the new Thermoelectric Supermatter Engine. Read the operating manual to get started.
          • +
          -
          -

          4 February 2015

          -

          RavingManiac updated:

          -
            -
          • Holodeck is now bigger and better, with toggleable gravity and a new courtroom setting
          • -

            TwistedAkai updated:

            -
              -
            • Purple Combs should now be visible and have their proper icon
            • -
            -
          +

          12 February 2015

          +

          Daranz updated:

          +
            +
          • Vending machines now use NanoUI and accept cash. The vendor account can now be suspended to disable all sales in all machines on station.
          • +
          +

          04 February 2015

          +

          RavingManiac updated:

          +
            +
          • Holodeck is now bigger and better, with toggleable gravity and a new courtroom setting
          • +
          +

          TwistedAkai updated:

          +
            +
          • Purple Combs should now be visible and have their proper icon
          • +
          -
          -

          1 September 2014

          -

          9 January 2015

          -

          Zuhayr updated:

          -
            -
          • Voice changers no longer use ID cards. They have Toggle and Set Voice verbs on the actual mask object now.
          • -
          • Readded moonwalking. Alt-dir to face new dir, or Face-Direction verb to face current dir.
          • -
          -
          +

          09 January 2015

          +

          Zuhayr updated:

          +
            +
          • Voice changers no longer use ID cards. They have Toggle and Set Voice verbs on the actual mask object now.
          • +
          • Readded moonwalking. Alt-dir to face new dir, or Face-Direction verb to face current dir.
          • +
          +

          22 November 2014

          +

          Zuhayr updated:

          +
            +
          • Added the /obj/item/weapon/rig class - back-mounted deployable hardsuits.
          • +
          • Replaced existing hardsuits with 'voidsuits', functionally identical.
          • +
          • Removed the mounted device and helmet/boot procs from voidsuits.
          • +
          • Refactored a shit-ton of ninja code into the new rig class.
          • +
          • This is more than likely going to take a lot of balancing to get into a good place.
          • +
          -
          -

          22 November 2014

          -

          Zuhayr updated:

          -
            -
          • Added the /obj/item/weapon/rig class - back-mounted deployable hardsuits.
          • -
          • Replaced existing hardsuits with 'voidsuits', functionally identical.
          • -
          • Removed the mounted device and helmet/boot procs from voidsuits.
          • -
          • Refactored a shit-ton of ninja code into the new rig class.
          • -
          • This is more than likely going to take a lot of balancing to get into a good place.
          • -
          -
          +

          08 November 2014

          +

          PsiOmegaDelta updated:

          +
            +
          • Service personnel now have their own frequency to communicate over. Use "say :v".
          • +
          • The AI can now has proper quick access to its private channel. Use "say :o".
          • +
          • Newscasters supports photo captions. Simply pen one on the attached photo.
          • +
          • Once made visible by a cultist ghosts can toggle visiblity at will.
          • +
          • Detonating cyborgs using the cyborg monitor console now notifies the master AI, if any.
          • +
          • More machinery, such as APCs, air alarms, etc., now support attaching signalers to the wires.
          • +
          • Random event overhaul. Admins may wish check the verb "Event Manager Panel".
          • +
          +

          04 November 2014

          +

          TwistedAkai updated:

          +
            +
          • Almost any window which has been fully unsecured can now be dismantled with a wrench.
          • +
          -
          -

          8 november 2014

          -

          PsiOmegaDelta updated:

          -
            -
          • Service personnel now have their own frequency to communicate over. Use "say :v".
          • -
          • The AI can now has proper quick access to its private channel. Use "say :o".
          • -
          • Newscasters supports photo captions. Simply pen one on the attached photo.
          • -
          • Once made visible by a cultist ghosts can toggle visiblity at will.
          • -
          • Detonating cyborgs using the cyborg monitor console now notifies the master AI, if any.
          • -
          • More machinery, such as APCs, air alarms, etc., now support attaching signalers to the wires.
          • -
          • Random event overhaul. Admins may wish check the verb "Event Manager Panel".
          • -
          -
          +

          01 November 2014

          +

          PsiOmegaDelta updated:

          +
            +
          • Adds the last missing step to deconstruct fire alarms. Apply wirecutters.
          • +
          • There's a "new" mining outpost nearby the Research outpost.
          • +
          • Manifest ghosts now have spookier names.
          • +
          • Adds a gas monitor computer for the toxin mixing chamber.
          • +
          • AI can now change the display of individual AI status screens.
          • +
          • More ion laws..
          • +
          • All turrets have been replaced with portable variants. Potential targets can be configured on a per turret basis.
          • +
          • Improved crew monitor map positioning.
          • +
          • Can now order plastic, body-, and statis bags from cargo
          • +
          • PDAs now receive newscasts.
          • +
          • (De)constructable emergency shutters.
          • +
          • Borgs can now select to simply state their laws or select a radio channel, same as the AI.
          • +
          +

          01 October 2014

          +

          RavingManiac updated:

          +
            +
          • Zooming with the sniper rifle now adds a view offset in the direction you are facing.
          • +
          • Added binoculars - functionally similar to sniper scope. Adminspawn-only for now.
          • +
          • Bottles from chemistry now, like beakers, use chemical overlays instead of fixed sprites.
          • +
          • Being in space while not magbooted to something will cause your sprite to bob up and down.
          • +
          +

          Zuhayr updated:

          +
            +
          • Added species organ checks to several areas (phoron burn, welder burn, appendicitis, vox cortical stacks, flashes).
          • +
          • Added VV option to add or remove organs.
          • +
          • Added simple bioprinter (adminspawn).
          • +
          • Added smashing/slashing behavior from xenos to some unarmed attacks.
          • +
          • Added some new state icons for diona nymphs.
          • +
          • Added borer husk functionality (cortical borers can turn dead humans into zombies).
          • +
          • Added tackle verb.
          • +
          • Added NO_SLIP.
          • +
          • Added species-specific orans to Dionaea, new Xenomorphs and vox.
          • +
          • Added colour and species to blood data.
          • +
          • Added lethal consequences to missing your heart.
          • +
          • Removed robot_talk_understand and alien_talk_understand.
          • +
          • Removed attack_alien() and several flavours of is_alien() procs.
          • +
          • Removed /mob/living/carbon/alien/humanoid.
          • +
          • Removed alien_hud().
          • +
          • Removed IS_SLOW, NEEDS_LIGHT and RAD_ABSORB.
          • +
          • Renamed is_larva() to is_alien().
          • +
          • Refactored a ton of files, either condensing or expanding them, or moving them to new directories.
          • +
          • Refactored some attack vars from simple_animal to mob/living level.
          • +
          • Refactored internal organs to /mob/living/carbon level.
          • +
          • Refactored rad and light absorbtion to organ level.
          • +
          • Refactored brains to /obj/item/organ/brain.
          • +
          • Refactored a lot of blood splattering to use blood_splatter() proc.
          • +
          • Refactored broadcast languages (changeling and alien hiveminds, drone and binary chat) to actual languages.
          • +
          • Refactored xenomorph abilities to work for humans.
          • +
          • Refactored xenomorphs into human species.
          • +
          • Rewrote larva_hud() and human_hud(). The latter now takes data from the species datum.
          • +
          • Rewrote diona nymphs as descendents of /mob/living/carbon/alien.
          • +
          • Rewrote xenolarva as descendents of /mob/living/carbon/alien.
          • +
          • Rewrote /mob/living/carbon/alien.
          • +
          • Moved alcohol and toxin processing to the liver.
          • +
          • Moved drone light proc to robot level, added integrated_light_power and local_transmit vars to robots.
          • +
          • Moved human brainloss onto the brain organ.
          • +
          • Shuffled around and collapsed several redundant procs down to carbon level (hide, ventcrawl, Bump).
          • +
          • Fixed species swaps from NO_BLOOD to those with blood killing the subject instantly.
          • +
          -
          -

          4 November 2014

          -

          TwistedAkai updated:

          -
            -
          • Almost any window which has been fully unsecured can now be dismantled with a wrench.
          • -
          -
          +

          28 September 2014

          +

          Gamerofthegame updated:

          +
            +
          • Hoverpods fully supported, currently orderable from cargo. Two slots, three cargo, space flight and a working mech for all other intents and purposes.
          • +
          • Added the Rigged laser and Passenger Compartment equipment. The rigged laser is a weapon for working exosuits - just a ordinary laser, but with triple the cool down and rather power inefficient. The passenger compartment allows other people to board and hitch a ride on the mech - such as in fire rescue or for space flight.
          • +
          +

          Zuhayr updated:

          +
            +
          • Organs can now be removed and transplanted.
          • +
          • Brain surgery is now the same as chest surgery regarding the steps leading up to it.
          • +
          • Appendix and kidney now share the groin and removing the first will prevent appendicitis.
          • +
          • Lots of backend surgery/organ stuff, see the PR if you need to know.
          • +
          +

          20 September 2014

          +

          HarpyEagle updated:

          +
            +
          • Fixes evidence bags and boxes eating each other. Evidence bags now store items by dragging the bag onto the item to be stored.
          • +
          -
          -

          1 november 2014

          -

          PsiOmegaDelta updated:

          -
            -
          • Adds the last missing step to deconstruct fire alarms. Apply wirecutters.
          • -
          • There's a "new" mining outpost nearby the Research outpost.
          • -
          • Manifest ghosts now have spookier names.
          • -
          • Adds a gas monitor computer for the toxin mixing chamber.
          • -
          • AI can now change the display of individual AI status screens.
          • -
          • More ion laws..
          • -
          • All turrets have been replaced with portable variants. Potential targets can be configured on a per turret basis.
          • -
          • Improved crew monitor map positioning.
          • -
          • Can now order plastic, body-, and statis bags from cargo
          • -
          • PDAs now receive newscasts.
          • -
          • (De)constructable emergency shutters.
          • -
          • Borgs can now select to simply state their laws or select a radio channel, same as the AI.
          • -
          -
          +

          05 September 2014

          +

          RavingManiac updated:

          +
            +
          • NewPipe implemented: Supply and scrubber pipes can be run in parallel without connecting to each other.
          • +
          • Supply pipes will only connect to supply pipes, vents and Universal Pipe Adapters(UPAs).
          • +
          • Scrubber pipes will only connect to scrubber pipes, scrubbers and UPAs.
          • +
          • UPAs will connect to regular, scrubber and supply pipes.
          • +
          +

          31 August 2014

          +

          Whitellama updated:

          +
            +
          • Matches and candles can be used to burn papers, too.
          • +
          • Observers have a bit more time (20 seconds, instead of 7.5) before the Diona join prompt disappears.
          • +
          -
          -

          1 October 2014

          -

          RavingManiac updated:

          -
            -
          • Zooming with the sniper rifle now adds a view offset in the direction you are facing.
          • -
          • Added binoculars - functionally similar to sniper scope. Adminspawn-only for now.
          • -
          • Bottles from chemistry now, like beakers, use chemical overlays instead of fixed sprites.
          • -
          • Being in space while not magbooted to something will cause your sprite to bob up and down.
          • -
          -
          +

          27 August 2014

          +

          Whitellama updated:

          +
            +
          • Made destination taggers more intuitive so you know when you've tagged something
          • +
          • Ported package label and tag sprites
          • +
          • Ported using a pen on a package to give it a title, or to write a note
          • +
          • Donut boxes and egg boxes can be constructed out of cardboard
          • +
          +

          05 August 2014

          +

          HarpyEagle updated:

          +
            +
          • Atmos Rewrite. Many atmos devices now use power according to their load and gas physics
          • +
          • Pressure regulator device. Replaces the passive gate and can regulate input or output pressure
          • +
          • Gas heaters and gas coolers are now constructable and can be upgraded with parts from research
          • +
          • Fixes recharger and cell charger power draw. Rechargers draw 15 kW, wall chargers draw 25 kW, and heavy-duty cell chargers draw 40 kW. Cyborg charging stations draw 75 kW.
          • +
          • Laptops, and various other machines, now draw more reasonable amounts of power
          • +
          • Machines will periodically update their powered status if moved from a powered to an unpowered area and vice versa
          • +
          -
          -

          1 October 2014

          -

          Zuhayr updated:

          -
            -
          • Added species organ checks to several areas (phoron burn, welder burn, appendicitis, vox cortical stacks, flashes).
          • -
          • Added VV option to add or remove organs.
          • -
          • Added simple bioprinter (adminspawn).
          • -
          • Added smashing/slashing behavior from xenos to some unarmed attacks.
          • -
          • Added some new state icons for diona nymphs.
          • -
          • Added borer husk functionality (cortical borers can turn dead humans into zombies).
          • -
          • Added tackle verb.
          • -
          • Added NO_SLIP.
          • -
          • Added species-specific orans to Dionaea, new Xenomorphs and vox.
          • -
          • Added colour and species to blood data.
          • -
          • Added lethal consequences to missing your heart.
          • -
          • Removed robot_talk_understand and alien_talk_understand.
          • -
          • Removed attack_alien() and several flavours of is_alien() procs.
          • -
          • Removed /mob/living/carbon/alien/humanoid.
          • -
          • Removed alien_hud().
          • -
          • Removed IS_SLOW, NEEDS_LIGHT and RAD_ABSORB.
          • -
          • Renamed is_larva() to is_alien().
          • -
          • Refactored a ton of files, either condensing or expanding them, or moving them to new directories.
          • -
          • Refactored some attack vars from simple_animal to mob/living level.
          • -
          • Refactored internal organs to /mob/living/carbon level.
          • -
          • Refactored rad and light absorbtion to organ level.
          • -
          • Refactored brains to /obj/item/organ/brain.
          • -
          • Refactored a lot of blood splattering to use blood_splatter() proc.
          • -
          • Refactored broadcast languages (changeling and alien hiveminds, drone and binary chat) to actual languages.
          • -
          • Refactored xenomorph abilities to work for humans.
          • -
          • Refactored xenomorphs into human species.
          • -
          • Rewrote larva_hud() and human_hud(). The latter now takes data from the species datum.
          • -
          • Rewrote diona nymphs as descendents of /mob/living/carbon/alien.
          • -
          • Rewrote xenolarva as descendents of /mob/living/carbon/alien.
          • -
          • Rewrote /mob/living/carbon/alien.
          • -
          • Moved alcohol and toxin processing to the liver.
          • -
          • Moved drone light proc to robot level, added integrated_light_power and local_transmit vars to robots.
          • -
          • Moved human brainloss onto the brain organ.
          • -
          • Shuffled around and collapsed several redundant procs down to carbon level (hide, ventcrawl, Bump).
          • -
          • Fixed species swaps from NO_BLOOD to those with blood killing the subject instantly.
          • -
          -
          +

          02 August 2014

          +

          Whitellama updated:

          +
            +
          • Arcane tomes can now be stored on bookshelves.
          • +
          • Dionaea players no longer crash on death, and now become nymphs properly.
          • +
          -
          -

          28 September 2014

          -

          Gamerofthegame updated:

          -
            -
          • Hoverpods fully supported, currently orderable from cargo. Two slots, three cargo, space flight and a working mech for all other intents and purposes.
          • -
          • Added the Rigged laser and Passenger Compartment equipment. The rigged laser is a weapon for working exosuits - just a ordinary laser, but with triple the cool down and rather power inefficient. The passenger compartment allows other people to board and hitch a ride on the mech - such as in fire rescue or for space flight.
          • -
          -
          +

          31 July 2014

          +

          HarpyEagle updated:

          +
            +
          • Stun batons now work like tasers and deal agony instead of stun
          • +
          • Being hit in the hands with a stun weapon will cause whatever is being held to be dropped
          • +
          • Handcuffs now require an aggressive grab to be used
          • +
          -
          -

          28 September 2014

          -

          Zuhayr updated:

          -
            -
          • Organs can now be removed and transplanted.
          • -
          • Brain surgery is now the same as chest surgery regarding the steps leading up to it.
          • -
          • Appendix and kidney now share the groin and removing the first will prevent appendicitis.
          • -
          • Lots of backend surgery/organ stuff, see the PR if you need to know.
          • -
          -
          +

          26 July 2014

          +

          Whitellama updated:

          +
            +
          • Added dynamic flavour text.
          • +
          • Fixed bug with suit fibers and fingerprints.
          • +
          +

          20 July 2014

          +

          PsiOmegaDelta updated:

          +
            +
          • AI can now store up to five camera locations and return to them when desired.
          • +
          • AI can now alt+left click turfs in camera view to list and interact with the objects.
          • +
          • AI can now ctrl+click turret controls to enable/disable turrets.
          • +
          • AI can now alt+click turret controls to toggle stun/lethal mode.
          • +
          • AI can now select which channel to state laws on.
          • +
          -
          -

          20 September 2014

          -

          HarpyEagle updated:

          -
            -
          • Fixes evidence bags and boxes eating each other. Evidence bags now store items by dragging the bag onto the item to be stored.
          • -
          -
          +

          06 July 2014

          +

          HarpyEagle updated:

          +
            +
          • Re-enabled and rewrote the wound infection system
          • +
          • Infections can be prevented by properly bandaging and salving wounds
          • +
          • Infections are cured by spaceacillin
          • +
          +

          01 July 2014

          +

          Various updated:

          +
            +
          • Hardsuit breaching.
          • +
          • Rewritten fire.
          • +
          • Supermatter now glows and sucks things into it as it approaches criticality.
          • +
          • Station Vox (Vox pariahs) are now available.
          • +
          • Wheelchairs.
          • +
          • Cargo Trains.
          • +
          • Hardsuit cycler machinery.
          • +
          • Rewritten lighting (coloured lights!)
          • +
          • New Mining machinery and rewritten smelting.
          • +
          • Rewritten autolathe
          • +
          • Mutiny mode.
          • +
          • NanoUI airlock and docking controllers.
          • +
          • Completely rewritten shuttle code.
          • +
          • Derelict Z-level replacement: construction site.
          • +
          • Computer3 laptops.
          • +
          • Constructable SMES units.
          • +
          • Omni-directional atmos machinery.
          • +
          • Climbable tables and crates.
          • +
          • Xenoflora added to Science.
          • +
          • Utensils can be used to eat food.
          • +
          • Decks of cards are now around the station.
          • +
          • Service robots can speak languages.
          • +
          • Xenoarch updates and fixes.
          • +
          • Rewritten species-specific gear icon handling.
          • +
          • Cats and borers can be picked up.
          • +
          • Botanist renamed to Gardener.
          • +
          • Hydroponics merged with the Kitchen.
          • +
          • Latejoin spawn points (Arrivals, Cryostorage, Gateway).
          • +
          • Escape pods only launch automatically during emergency evacuations
          • +
          • Escape pods can be made to launch during regular crew transfers using the control panel inside the pod, or by emagging the panel outside the pod
          • +
          • When swiped or emagged, the crew transfer shuttle can be delayed in addition to being launched early
          • +
          -
          -

          31 August 2014

          -

          Whitellama updated:

          -
            -
          • Matches and candles can be used to burn papers, too.
          • -
          • Observers have a bit more time (20 seconds, instead of 7.5) before the Diona join prompt disappears.
          • -
          -
          +

          20 June 2014

          +

          Cael_Aislinn updated:

          +
            +
          • New discoverable items added to xenoarchaeology, and new features for some existing ones. Artifact harvesters can now harvest the secondary effect of artifacts as well as the primary one.
            +
          • +
          • Artifact utilisers should be much nicer/easier to use now.
            +
          • Alden-Saraspova counters and talking items should work properly now.
            +
          • +
            +
          -
          -

          5 September 2014

          -

          RavingManiac updated:

          -
            -
          • NewPipe implemented: Supply and scrubber pipes can be run in parallel without connecting to each other.
          • -
          • Supply pipes will only connect to supply pipes, vents and Universal Pipe Adapters(UPAs).
          • -
          • Scrubber pipes will only connect to scrubber pipes, scrubbers and UPAs.
          • -
          • UPAs will connect to regular, scrubber and supply pipes.
          • -
          -
          +

          19 June 2014

          +

          Chinsky updated:

          +
            +
          • Adds guest terminals on the map. These wall terminals let anyone issue temporary IDs. Only access that issuer has can be granted, and maximum time pass can be issued for is 20 minutes. All operations are logged in terminals.
          • +
          +

          15 June 2014

          +

          HarpyEagle updated:

          +
            +
          • Fixed wound autohealing regardless of damage amount. The appropriate wound will now be assigned correctly based on damage amount and type
          • +
          • Fixed several other bugs related wounds that resulted in damage magically disappearing
          • +
          • Fixed various sharp objects not being counted as sharp, bullets in particular
          • +
          • Fixed armour providing more protection from bullets than it was supposed to
          • +
          -
          -

          27 August 2014

          -

          Whitellama updated:

          -
            -
          • Made destination taggers more intuitive so you know when you've tagged something
          • -
          • Ported package label and tag sprites
          • -
          • Ported using a pen on a package to give it a title, or to write a note
          • -
          • Donut boxes and egg boxes can be constructed out of cardboard
          • -
          -
          +

          13 June 2014

          +

          HarpyEagle updated:

          +
            +
          • Added docking ports for shuttles
          • +
          • Shuttle airlocks will automatically open and close, preventing people from being sucked into space by because someone on another z-level called a shuttle
          • +
          • Some docking ports can also double as airlocks
          • +
          • Docking ports can be overriden to prevent any automatic action. Shuttles will wait for players to open/close doors manually
          • +
          • Shuttles can be forced launched, which will make them not wait for airlocks to be properly closed
          • +
          -

          PsiOmegaDelta updated:

          -
            -
          • AI can now make priority announcements.
          • -
          • PDAs display the station time upon examination.
          • -
          • Status displays can now also show the station time.
          • -
          • Security HUDs now have improved handling of alt-titles.
          • -
          • Crew record photos can now be updated through security consoles.
          • -
          • pAI settings can now be configured from the character setup screen.
          • -
          • Pipes can now be placed by clicking the floor, similar to power cables.
          • -
          • Mechas and cargo trains can no longer enter the transfer shuttle, Odysseys with patients excepted.
          • -
          -

          Kelenius updated:

          -
            -
          • Wizards now use a new item: scrying orb. It grants x-ray vision upon purchase, and can be used to temporary leave your body as a ghost.
          • -
          -
          +

          03 June 2014

          +

          Hubblenaut updated:

          +
            +
          • Added wheelchairs
          • +
          • Replaced stool in Medical Examination with wheelchair
          • +
          • Using a fire-extinguisher to propel you on a chair can have consequences (drive into walls and people, do it!)
          • +
          +

          31 May 2014

          +

          Jarcolr updated:

          +
            +
          • 21 New cargo crates, go check them out!
          • +
          • Peanuts have now been added, food items are now being developed.
          • +
          • 2 new cargo groups, Miscellaneous and Supply.
          • +
          • Sugarcane seeds can now be gotten from the seed dispenser.
          • +
          • 5 new satchels when selecting "satchel" for RD, scientist, botanist, virologist, geneticist (disabled) and chemist.
          • +
          • Clicking on a player with a paper/book when you have the eyes selected shows them the book/paper forcefully.
          • +
          -
          -

          5 August 2014

          -

          HarpyEagle updated:

          -
            -
          • Atmos Rewrite. Many atmos devices now use power according to their load and gas physics
          • -
          • Pressure regulator device. Replaces the passive gate and can regulate input or output pressure
          • -
          • Gas heaters and gas coolers are now constructable and can be upgraded with parts from research
          • -
          • Fixes recharger and cell charger power draw. Rechargers draw 15 kW, wall chargers draw 25 kW, and heavy-duty cell chargers draw 40 kW. Cyborg charging stations draw 75 kW.
          • -
          • Laptops, and various other machines, now draw more reasonable amounts of power
          • -
          • Machines will periodically update their powered status if moved from a powered to an unpowered area and vice versa
          • -
          -
          +

          28 May 2014

          +

          Chinsky updated:

          +
            +
          • Adds few new paperBBcode tags, to make up for HTML removal.
          • +
          • [logo] tag draws NT logo image (one from wiki).
          • +
          • [table] [/table] tags mark borders of tables. [grid] [/grid] are borderless tables, useful of making layouts. Inside tables following tags are used: [row] marks beginning of new table row, [cell] - beginning of new table cell.
          • +
          -
          -

          31 August 2014

          -

          Whitellama updated:

          -
            -
          • Matches and candles can be used to burn papers, too.
          • -
          • Observers have a bit more time (20 seconds, instead of 7.5) before the Diona join prompt disappears.
          • -
          -
          +

          23 May 2014

          +

          Hubble updated:

          +
            +
          • Personal lockers are now resettable
          • +
          • Take off people's accessories or change their sensors in the drag and drop-interface
          • +
          • Merge paper bundles by hitting one with another
          • +
          • Line breaks in Security, Medical and Employment Records
          • +
          • Record printouts will have names on it
          • +
          • Set other people's internals in belt and suit storage slots
          • +
          • No longer changing suit sensors while cuffed
          • +
          • No longer emptying other people's pockets when they are not full yet
          • +
          -
          -

          2 August 2014

          -

          2 August 2014

          -

          Whitellama updated:

          -
            -
          • Arcane tomes can now be stored on bookshelves.
          • -
          • Dionaea players no longer crash on death, and now become nymphs properly.
          • -
          -
          +

          16 May 2014

          +

          HarpyEagle updated:

          +
            +
          • Silicon mob types (AI, cyborgs, PAI) can now speak certain species languages depending on type and module
          • +
          • Languages can now be whispered when using the language code with either the whisper verb or the whisper speech code
          • +
          -
          -

          31 July 2014

          -

          HarpyEagle updated:

          -
            -
          • Stun batons now work like tasers and deal agony instead of stun
          • -
          • Being hit in the hands with a stun weapon will cause whatever is being held to be dropped
          • -
          • Handcuffs now require an aggressive grab to be used
          • -
          -
          +

          06 May 2014

          +

          Hubble updated:

          +
            +
          • Clip papers together by hitting a paper with a paper or photo
          • +
          • Adds icons for copied stamps
          • +
          -
          -

          26 July 2014

          -

          Whitellama updated:

          -
            -
          • Added dynamic flavour text.
          • -
          • Fixed bug with suit fibers and fingerprints.
          • -
          -
          - - -
          -

          20 July 2014

          -

          PsiOmegaDelta updated:

          -
            -
          • AI can now store up to five camera locations and return to them when desired.
          • -
          • AI can now alt+left click turfs in camera view to list and interact with the objects.
          • -
          • AI can now ctrl+click turret controls to enable/disable turrets.
          • -
          • AI can now alt+click turret controls to toggle stun/lethal mode.
          • -
          • AI can now select which channel to state laws on.
          • -
          -
          - -
          -

          6 July 2014

          -

          HarpyEagle updated:

          -
            -
          • Re-enabled and rewrote the wound infection system
          • -
          • Infections can be prevented by properly bandaging and salving wounds
          • -
          • Infections are cured by spaceacillin
          • -
          -
          - -
          -

          1 July 2014

          -

          Various updated:

          -
            -
          • Hardsuit breaching.
          • -
          • Rewritten fire.
          • -
          • Supermatter now glows and sucks things into it as it approaches criticality.
          • -
          • Station Vox (Vox pariahs) are now available.
          • -
          • Wheelchairs.
          • -
          • Cargo Trains.
          • -
          • Hardsuit cycler machinery.
          • -
          • Rewritten lighting (coloured lights!)
          • -
          • New Mining machinery and rewritten smelting.
          • -
          • Rewritten autolathe
          • -
          • Mutiny mode.
          • -
          • NanoUI airlock and docking controllers.
          • -
          • Completely rewritten shuttle code.
          • -
          • Derelict Z-level replacement: construction site.
          • -
          • Computer3 laptops.
          • -
          • Constructable SMES units.
          • -
          • Omni-directional atmos machinery.
          • -
          • Climbable tables and crates.
          • -
          • Xenoflora added to Science.
          • -
          • Utensils can be used to eat food.
          • -
          • Decks of cards are now around the station.
          • -
          • Service robots can speak languages.
          • -
          • Xenoarch updates and fixes.
          • -
          • Rewritten species-specific gear icon handling.
          • -
          • Cats and borers can be picked up.
          • -
          • Botanist renamed to Gardener.
          • -
          • Hydroponics merged with the Kitchen.
          • -
          • Latejoin spawn points (Arrivals, Cryostorage, Gateway).
          • -
          • Escape pods only launch automatically during emergency evacuations
          • -
          • Escape pods can be made to launch during regular crew transfers using the control panel inside the pod, or by emagging the panel outside the pod
          • -
          • When swiped or emagged, the crew transfer shuttle can be delayed in addition to being launched early
          • -
          -
          - - -
          -

          19 Ð¸ÑŽÐ½Ñ 2014

          -

          Chinsky updated:

          -
            -
          • Adds guest terminals on the map. These wall terminals let anyone issue temporary IDs. Only access that issuer has can be granted, and maximum time pass can be issued for is 20 minutes. All operations are logged in terminals.
          • -
          -
          - -
          -

          15 June 2014

          -

          HarpyEagle updated:

          -
            -
          • Fixed wound autohealing regardless of damage amount. The appropriate wound will now be assigned correctly based on damage amount and type
          • -
          • Fixed several other bugs related wounds that resulted in damage magically disappearing
          • -
          • Fixed various sharp objects not being counted as sharp, bullets in particular
          • -
          • Fixed armour providing more protection from bullets than it was supposed to
          • -
          -
          - -
          -

          20 June 2014

          -

          Cael_Aislinn updated:

          -
            -
          • New discoverable items added to xenoarchaeology, and new features for some existing ones. Artifact harvesters can now harvest the secondary effect of artifacts as well as the primary one.
            -
          • -
          • Artifact utilisers should be much nicer/easier to use now.
            -
          • Alden-Saraspova counters and talking items should work properly now.
            -
          • -
          -
          - -
          -

          13 June 2014

          -

          HarpyEagle updated:

          -
            -
          • Added docking ports for shuttles
          • -
          • Shuttle airlocks will automatically open and close, preventing people from being sucked into space by because someone on another z-level called a shuttle
          • -
          • Some docking ports can also double as airlocks
          • -
          • Docking ports can be overriden to prevent any automatic action. Shuttles will wait for players to open/close doors manually
          • -
          • Shuttles can be forced launched, which will make them not wait for airlocks to be properly closed
          • -
          -
          - -
          -

          3 Juni 2014

          -

          Hubblenaut updated:

          -
            -
          • Added wheelchairs
          • -
          • Replaced stool in Medical Examination with wheelchair
          • -
          • Using a fire-extinguisher to propel you on a chair can have consequences (drive into walls and people, do it!)
          • -
          -
          - -
          -

          31 May 2014

          -

          Jarcolr updated:

          -
            -
          • 21 New cargo crates, go check them out!
          • -
          • Peanuts have now been added, food items are now being developed.
          • -
          • 2 new cargo groups, Miscellaneous and Supply.
          • -
          • Sugarcane seeds can now be gotten from the seed dispenser.
          • -
          • 5 new satchels when selecting "satchel" for RD, scientist, botanist, virologist, geneticist (disabled) and chemist.
          • -
          • Clicking on a player with a paper/book when you have the eyes selected shows them the book/paper forcefully.
          • -
          -
          - -
          -

          23 Mai 2014

          -

          Hubble updated:

          -
            -
          • Personal lockers are now resettable
          • -
          • Take off people's accessories or change their sensors in the drag and drop-interface
          • -
          • Merge paper bundles by hitting one with another
          • -
          • Line breaks in Security, Medical and Employment Records
          • -
          • Record printouts will have names on it
          • -
          • Set other people's internals in belt and suit storage slots
          • -
          • No longer changing suit sensors while cuffed
          • -
          • No longer emptying other people's pockets when they are not full yet
          • -
          -
          - -
          -

          16 May 2014

          -

          HarpyEagle updated:

          -
            -
          • Silicon mob types (AI, cyborgs, PAI) can now speak certain species languages depending on type and module
          • -
          • Languages can now be whispered when using the language code with either the whisper verb or the whisper speech code
          • -
          -
          - -
          -

          6 Mai 2014

          -

          Hubble updated:

          -
            -
          • Clip papers together by hitting a paper with a paper or photo
          • -
          • Adds icons for copied stamps
          • -
          -
          - -
          -

          23 Mai 2014

          -

          Hubble updated:

          -
            -
          • Personal lockers are now resettable
          • -
          • Take off people's accessories or change their sensors in the drag and drop-interface
          • -
          • Merge paper bundles by hitting one with another
          • -
          • Line breaks in Security, Medical and Employment Records
          • -
          • Record printouts will have names on it
          • -
          • Set other people's internals in belt and suit storage slots
          • -
          • No longer changing suit sensors while cuffed
          • -
          • No longer emptying other people's pockets when they are not full yet
          • -
          -
          - - -
          -

          6 Mai 2014

          -

          Hubble updated:

          -
            -
          • Clip papers together by hitting a paper with a paper or photo
          • -
          • Adds icons for copied stamps
          • -
          -
          - - -
          -

          3 May 2014

          -

          Cael_Aislinn updated:

          -
            -
          • Coming out of nowhere the past few months, the Garland Corporation has made headlines with a new prehistoric theme park delighting travellers with species thought extinct. Now available for research stations everywhere is the technology that made it all possible! Features include:
            +

            03 May 2014

            +

            Cael_Aislinn updated:

            +
              +
            • Coming out of nowhere the past few months, the Garland Corporation has made headlines with a new prehistoric theme park delighting travellers with species thought extinct. Now available for research stations everywhere is the technology that made it all possible! Features include:
              - 13 discoverable prehistoric species to clone from fossils (including 5 brand new ones).
              - 11 discoverable prehistoric plants to clone from fossils (including 9 brand new ones).
              - New minigame that involves correctly ordering the genomes inside each genetic sequence to unlock an animal/plant.
              - Some prehistoric animals and plants may seem strangely familiar... while others may bring more than the erstwhile scientist bargains for.
              -
            • -
            -
          - - - -
          -

          28 Ð¼Ð°Ñ 2014

          -

          Chinsky updated:

          -
            -
          • Adds few new paperBBcode tags, to make up for HTML removal.
          • -
          • [logo] tag draws NT logo image (one from wiki).
          • -
          • [table] [/table] tags mark borders of tables. [grid] [/grid] are borderless tables, useful of making layouts. Inside tables following tags are used: [row] marks beginning of new table row, [cell] - beginning of new table cell.
          • -
          -
          -
          - - - -
          -

          28 Ð¼Ð°Ñ 2014

          -

          Chinsky updated:

          -
            -
          • Adds few new paperBBcode tags, to make up for HTML removal.
          • -
          • [logo] tag draws NT logo image (one from wiki).
          • -
          • [table] [/table] tags mark borders of tables. [grid] [/grid] are borderless tables, useful of making layouts. Inside tables following tags are used: [row] marks beginning of new table row, [cell] - beginning of new table cell.
          • -
          -
          -
          - -
          -

          29 April 2014

          -

          HarpyEagle updated:

          -
            -
          • Webbing vest storage can now be accessed by clicking on the item in inventory
          • -
          • Holsters can be accessed by clicking on them in inventory
          • -
          • Webbings and other suit attachments are now visible on the icon in inventory
          • -
          • Removing jumpsuits now requires drag and drop to prevent accidental undressing
          • -
          • Added an action icon for magboots that can be used to toggle them similar to flashlights
          • -
          • Fuel tanks now spill fuel when wrenched open
          • -
          -
          - -
          -

          25 April 2014

          -

          Various updated:

          -
            -
          • Overhauled saycode, you can now use languages over the radio.
          • -
          • Chamelon items beyond just the suit.
          • -
          • NanoUI Virology
          • -
          • 3D Sounds
          • -
          • AI Channel color for when they want to be all sneaky
          • -
          • New inflatable walls and airlocks for your breach sealing pleasure.
          • -
          • Carbon Copy papers, so you can subject everyone to your authority and paperwork, but mainly paperwork
          • -
          • Undershirts and rolling down jumpsuits
          • -
          • Insta-hit tasers, can be shot through glass as well.
          • -
          • Changeling balances, an emphasis put more on stealth.
          • -
          • Genetics disabled
          • -
          • Telescience removed, might be added again when we come up with a less math headache enducing version of it.
          • -
          • Bugfixes galore!
          • -
          -
          - -
          -

          11 April 2014

          -

          Jarcolr updated:

          -
          • You can now flip coins like a D2
          • -
          • Miscellaneous cargo crates got a tiny buff, Standard Costume crate is now Costume Crate
          • -
          • Grammar patch,telekinesis/amputated arm exploit fixes,more in the future
          • -
          • Grille kicking now does less damage
          • -
          • TELESCOPIC baton no longer knocks anybody down,still got a lot of force though
          • -
          • Other small-ish changes and fixes that aren't worth mentioning
          - - - -
          -

          6 April 2014

          -

          RavingManiac updated:

          -
            -
          • Tape recorders and station-bounced radios now work inside containers and closets.
          • -
          -
          - -
          -

          30 March 2014

          -

          RavingManiac updated:

          -
            -
          • Inflatable walls and doors added. Useful for sealing off hull breaches, but easily punctured by sharp objects and Tajarans.
          • -
          -
          - -
          -

          10 March 2014

          -

          Chinsky updated:

          -
            -
          • Viruses now affect certain range of species, different for each virus
          • -
          • Spaceacilline now prevents infection, and has a small chance to cure viruses at Stage 1. It does not give them antibodies though, so they can get sick again!
          • -
          • Biosuits and spacesuits now offer more protection against viruses. Full biosuit competely prevents airborne infection, when coupled with gloves they both protect quite well from contact ones
          • -
          • Sneezing now spreads viruses in front of mob. Sometimes he gets a warning beforehand though
          • -
          -
          - -
          -

          5 March 2014

          -

          RavingManiac updated:

          -
            -
          • Smartfridges added to the bar, chemistry and virology. No more clutter!
          • -
          • A certain musical instrument has returned to the bar.
          • -
          • There is now a ten second delay between ingesting a pill/donut/milkshake and regretting it.
          • -
          -
          - -
          -

          1 March 2014

          -

          Various updated:

          -
            -
          • Paint Mixing, red and blue makes purple!
          • -
          • New posters to tell you to respect those darned cat people
          • -
          • NanoUI for APC's, Canisters, Tank Transfer Valves and the heaters / coolers
          • -
          • PDA bombs are now less annoying, and won't always blow up / cause internal bleeding
          • -
          • Blob made less deadly
          • -
          • Objectiveless Antags now a configuration option, choose your own adventure!
          • -
          • Engineering redesign, now with better monitoring of the explodium supermatter!
          • -
          • Security EOD
          • -
          • New playable race, IPC's, go beep boop boop all over the station!
          • -
          • Gamemode autovoting, now players don't have to call for gamemode votes, it's automatic!
          • -
          -
          - -
          -

          19 February 2014

          -

          Aryn updated:

          -
            -
          • New air model. Nothing should change to a great degree, but temperature flow might be affected due to closed connections not sticking around.
          • -
          -
          - -
          -

          1 February 2014

          -

          Various updated:

          -
            -
          • NanoUI for PDA
          • -
          • Write in blood while a ghost in cult rounds with enough cultists
          • -
          • Cookies, absurd sandwiches, and even cookable dioanae nymphs!
          • -
          • A bunch of new guns and other weapons
          • -
          • Species specific blood
          • -
          -
          - -
          -

          1 January 2014

          -

          Various updated:

          -
            -
          • AntagHUD and MedicalHUD for ghosts, see who the baddies are, check for new configuration options.
          • -
          • Ghosts will now have bold text if they are in the same room as the person making conversations easier to follow.
          • -
          • New hairstyles! Now you can use something other then hotpink floor length braid.
          • -
          • DNA rework, tell us how you were cloned and became albino!
          • -
          • Dirty floors, so now you know exactly how lazy the janitors are!
          • -
          • A new UI system, feel free to color it yourself, don't set it to completely clear or you will have a bad time.
          • -
          • Cryogenic storage, for all your SSD needs.
          • -
          • New hardsuits for those syndicate tajaran
          • -
          -
          - -
          -

          18 December 2013

          -

          RavingManiac updated:

          -
            -
          • Mousetraps can now be "hidden" through the right-click menu. This makes them go under tables, clutter and the like. The filthy rodents will never see it coming!
          • -
          • Monkeys will no longer move randomly while being pulled.
          • -
          -
          - -
          -

          1 December 2013

          -

          Various Developers banged their keyboards together:

          -
            -
          • New Engine, the supermatter, figure out what a cooling loop is, or don't and blow up engineering!
          • -
          • Each department will have it's own fax, make a copy of your butt and fax it to the admins!
          • -
          • Booze and soda dispensers, they are like chemmasters, only with booze and soda!
          • -
          • Bluespace and Cryostasis beakers, how do they work? Fuggin bluespace how do they work?
          • -
          • You can now shove things into vending machines, impress your friends on how things magically disappear out of your hands into the machine!
          • -
          • Robots and Androids (And gynoids too!) can now use custom job titles
          • -
          • Various bugfixes
          • -
          -
          - -
          -

          24 November 2013

          -

          Yinadele updated:

          -
            -
          • Supermatter engine added! Please treat your new engine gently, and report any strangeness!
          • -
          • Rebalanced events so people don't explode into appendicitis or have their organs constantly explode.
          • -
          • Vending machines have had bottled water, iced tea, and grape soda added.
          • -
          • Head reattachment surgery added! Sew heads back on proper rather than monkey madness.
          • -
          • Pain crit rebalanced - Added aim variance depending on pain levels, nerfed blackscreen severely.
          • -
          • Cyborg alt titles: Robot, and Android added! These will make you spawn as a posibrained robot. Please enjoy!
          • -
          • Fixed the sprite on the modified welding goggles, added a pair to the CE's office where they'll be used.
          • -
          • Fixed atmos computers- They are once again responsive!
          • -
          • Added in functionality proper for explosive implants- You can now set their level of detonation, and their effects are more responsively concrete depending on setting.
          • -
          • Hemostats re-added to autolathe!
          • -
          • Added two manuals on atmosia and EVA, by MagmaRam! Found in engineering and the engineering bookcase.
          • -
          • Fixed areas in medbay to have fully functional APC sectors.
          • -
          • Girders are now lasable.
          • -
          • Please wait warmly, new features planned for next merge!
          • -
          -
          - -
          -

          23 November 2013

          -

          Ccomp5950 updated:

          -
            -
          • Players are now no longer able to commit suicide with a lasertag gun, and will feel silly for doing so.
          • -
          • Ghosts hit with the cult book shall now actually become visible.
          • -
          • The powercells spawned with Exosuits will now properly be named to not confuse bearded roboticists.
          • -
          • Blindfolded players will now no longer require eye surgery to repair their sight, removing the blindfold will be sufficient.
          • -
          • Atmospheric Technicians will now have access to Exterior airlocks.
          • -
          -
          - -
          -

          1 November 2013

          -

          Various updated:

          -
            -
          • Autovoting, Get off the station when your 15 hour workweek is done, thanks unions!
          • -
          • Some beach props that Chinsky finds useless.
          • -
          • Updated NanoUI
          • -
          • Dialysis while in sleepers - removes reagents from mobs, like the chemist, toss him in there!
          • -
          • Pipe Dispensers can now be ordered by Cargo
          • -
          • Fancy G-G-G-G-Ghosts!
          • -
          -
          - -
          -

          29 October 2013

          -

          Cael_Aislinn updated:

          -
            -
          • Xenoarchaeology's chemical analysis and six analysis machines are gone, replaced by a single one which can be beaten in a minigame.
          • -
          • Sneaky traitors will find new challenges to overcome at the research outpost, but may also find new opportunities (transit tubes can now be traversed).
          • -
          • Finding active alien machinery should now be made significantly easier with the Alden-Saraspova counter.
          • -
          -
          - - -
          -

          06 October 2013

          -

          Chinsky updated:

          -
            -
          • Added contact-spread viruses. Spread if infected guy touches someone with bare hands, or if someone touches bare infected guy. Biosuits/gloves help.
          • -
          • Changed way airborne viruses spread a bit. Now 20% of breaths will carry viruses to adjacent tiles. Wearing sterile mask cuts down it to 5%. Masks, bio/space suits (only when worn with matching helmet) protect, internals protect completely.
          • -
          • Raised infection chances considerably. They were so low people reported that infection does not work. Now it's 50-90% chance for unprotected folks.
          • -
          • Blood puddles and mucus now spread the fun again
          • -
          -
          - - -
          -

          06 October 2013

          -

          Chinsky updated:

          -
            -
          • Return of dreaded side effects. They now manifest well after their cause disappears, so curing them should be possible without them reappearing immediately. They also lost last stage damaging effects.
          • -
          -
          - -
          -

          September 24th, 2013

          -

          Snapshot updated:

          -
            -
          • Removed hidden vote counts.
          • -
          • Removed hiding of vote results.
          • -
          • Removed OOC muting during votes.
          • -
          • Crew transfers are no longer callable during Red and Delta alert.
          • -
          • Started work on Auto transfer framework.
          • -
          -
          - -
          -

          18 September 2013

          -

          Kilakk updated:

          -
            -
          • Fax machines! The Captain and IA agents can use the fax machine to send properly formatted messages to Central Command.
          • -
          • Gave the fax machine a fancy animated sprite. Thanks Cajoes!
          • -
          -
          - -
          -

          August 8th, 2013

          -

          Erthilo updated:

          -
            -
          • Raise Dead rune now properly heals and revives dead corpse.
          • -
          • Admin-only rejuvenate verb now heals all organs, limbs, and diseases.
          • -
          • Cyborg sprites now correctly reset with reset boards. This means cyborg appearances can now be changed without admin intervention.
          • -
          -
          - -
          -

          2013/08/4

          -

          Chinsky updated:

          -
            -
          • Health HUD indicator replaced with Pain indicator. Now health indicator shows pain level instead of actual vitals level. Some types of damage contribute more to pain, some less, usually feeling worse than they really are.
          • -
          -
          - -
          -
          -

          2013/08/01

          -

          Chinsky updated:

          -
            -
          • Old new medical features:
          • -
          • Autoinjectors! They come preloaded with 5u of inapro, can be used instantly, and are one-use. You can replace chems inside using a syringe. Box of them is added to Medicine closet and medical supplies crate.
          • -
          • Splints! Target broken liimb and click on person to apply. Can be taken off in inventory menu, like handcuffs. Splinted limbs have less negative effects.
          • -
          • Advanced medikit! Red and mean, all doctors spawn with one. Contains better stuff - advanced versions of bandaids and aloe heal 12 damage on the first use.
          • -
          • Wounds with damage above 50 won't heal by themselves even if bandaged/salved. Would have to seek advanced medical attention for those.
          • -
          -
          - -
          -

          July 30th, 2013

          -

          Erthilo updated:

          -
            -
          • EFTPOS and ATM machines should now connect to databases.
          • -
          • Gravitational Catapults can now be removed from mechs.
          • -
          • Ghost manifest rune paper naming now works correctly.
          • -
          • Fix for newscaster special characters. Still not recommended.
          • -
          -
          - -
          -

          30.07.2013

          -

          Kilakk updated:

          -
            -
          • Added colored department radio channels.
          • -
          -
          - -
          -

          28.07.2013

          -

          Segrain updated:

          -
            -
          • Camera console circuits can be adjusted for different networks.
          • -
          • Nuclear operatives and ERT members have built-in cameras in their helmets. Activate helmet to initialize it.
          • -
          -
          - -
          -

          26.07.2013

          -

          Kilakk updated:

          -
            -
          • Brig cell timers will no longer start counting down automatically.
          • -
          • Separated the actual countdown timer from the timer controls. Pressing "Set" while the timer is counting down will reset the countdown timer to the time selected.
          • -
          -
          -
          -

          2013-11-07

          -

          Chinsky updated:

          -
            -
          • Gun delays. All guns now have delays between shots. Most have less than second, lasercannons and pulse rifles have around 2 seconds delay. Automatics have zero, click-speed.
          • -
          -
          -
          -

          2013/07/06

          -

          Chinsky updated:

          -
            -
          • Humans now can be infected with more than one virus at once.
          • -
          • All analyzed viruses are put into virus DB. You can view it and edit their name and description on medical record consoles.
          • -
          • Only known viruses (ones in DB) will be detected by the machinery and HUDs.
          • -
          • Viruses cause fever, body temperature rising the more stage is.
          • -
          • Humans' body temperature does not drift towards room one unless there's big difference in them.
          • -
          • Virus incubators now can transmit viuses from dishes to blood sample.
          • -
          • New machine - centrifuge. It can isolate antibodies or viruses (spawning virus dish) from a blood sample in vials. Accepts vials only.
          • -
          • Fancy vial boxes in virology, one of them is locked by ID with MD access.
          • -
          • Engineered viruses are now ariborne too.
          • -
          -
          -
          -

          05.07.2013

          -

          Spamcat updated:

          -
            -
          • Pulse! Humans now have hearbeat rate, which can be measured by right-clicking someone - Check pulse or by health analyzer. Medical machinery also has heartbeat monitors. Certain meds and conditions can influence it.
          • -
          -
          -
          -

          03.07.2013

          -

          Segrain updated:

          -
            -
          • Security and medical cyborgs can use their HUDs to access records.
          • -
          -
          -
          -

          June 28th, 2013

          -

          Segrain updated:

          -
            -
          • AIs are now able to examine what they see.
          • -
          -
          -
          -

          June 27th, 2013

          -

          Segrain updated:

          -
            -
          • ID cards properly setup bloodtype, DNA and fingerprints again.
          • -
          -
          -
          -

          June 26th, 2013

          -

          Whitellama updated:

          -
            -
          • One-antag rounds (like wizard/ninja) no longer end automatically upon death
          • -
          • Space ninja has been implemented as a voteable gamemode
          • -
          • Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)
          • -
          • Five new space ninja directives have been added, old directives have been reworded to be less harsh
          • -
          • Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors
          • -
          • Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits
          • -
          • Space ninja suits' exploding on death has been nerfed, so as not to cause breaches
          • -
          • A few space ninja titles/names have been added and removed to be slightly more believable
          • -
          • The antagonist selector no longer chooses jobbanned players when it runs out of willing options
          • -
          -
          -
          -

          June 26th, 2013

          -

          Segrain updated:

          -
            -
          • Autopsy scanner properly displays time of wound infliction and death.
          • -
          • Autopsy scanner properly displays wounds by projectile weapons.
          • -
          -
          -
          -

          June 23rd, 2013

          -

          Segrain updated:

          -
            -
          • Airlocks of various models can be constructed again.
          • -
          -
          - -
          -

          June 23rd, 2013

          -

          faux updated:

          -
            -
          • There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t=7847 <-- Please put any commentary good or bad, here.
          • -
          • Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.
          • -
          • Starboard emergency storage isn't gone now, it's simply located in the escape wing.
          • -
          • An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.
          • -
          -
          - -
          -

          June 22nd 2013

          -

          Cael_Aislinn updated:

          -
            -
          • The xenoarchaeology depth scanner will now tell you what energy field is required to safely extract a find.
          • -
          • Excavation picks will now dig faster, and xenoarchaeology as a whole should be easier to do.
          • -
          -
          - -
          -

          21.06.2013

          -

          Jupotter updated:

          -
            -
          • Fix the robotiscist preview in the char setupe screen
          • -
          -
          - -
          -

          18.06.2013

          -

          Segrain updated:

          -
            -
          • Fixed some bugs in windoor construction.
          • -
          • Secure windoors are made with rods again.
          • -
          • Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.
          • -
          • Airlock electronics can be configured to make door open for any single access on it instead of all of them.
          • -
          • Cyborgs can preview their icons before choosing.
          • -
          -
          - -
          -

          13.06.2013

          -

          Kilakk updated:

          -
            -
          • Added the Xenobiologist job. Has access to the research hallway and to xenobiology.
          • -
          • Removed Xenobiology access from Scientists.
          • -
          • Removed the Xenobiologist alternate title from Scientists.
          • -
          • Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.
          • -
          • Changed the Research Outpost doors to use "Xenoarchaeology" access.
          • -
          -
          - -
          -

          6-13-13

          -

          Asanadas updated:

          -
            -
          • Added a whimsical suit to the head of personnel's secret clothing locker.
          • -
          -
          - -
          -

          12/06/2013

          -

          Zuhayr updated:

          -
            -
          • Added pneumatic cannon and harpoons.
          • -
          • Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.
          • -
          -
          - - -
          -

          6/11/13

          -

          Meyar updated:

          -
            -
          • Fixes a security door with a firedoor ontop of it.
          • -
          • Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE team not RESCUE team)
          • -
          • ERT are now automated, from their spawn to their shuttle. Admin intervention no longer required! (Getting to the mechs still requires admin permission generally)
          • -
          • Added flashlights to compensate for the weakened PDA lights
          • -
          • ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, no sir.
          • -
          -
          - - -
          -

          09.06.2013

          -

          Segrain updated:

          -
            -
          • Emagged supply console can order SpecOp crates again.
          • -
          -
          - -
          -

          Meyar

          -

          6/6/13 updated:

          -
            -
          • Adds missing disposal pipes in chemistry
          • -
          -
          - -
          -

          05.06.2013

          -

          Segrain updated:

          -
            -
          • Exosuits now can open firelocks by walking into them.
          • -
          -
          - -
          -

          6/5/13

          -

          Meyar updated:

          -
            -
          • Departments SHOULD have access to adjacent maintinence tunnels incase of radstorm or nafarious dealings.
          • -
          • Fixed the northern EVA maintinence door.
          • -
          • Hand full of mapbugs.
          • -
          • MULES should be able to get to security now.
          • -
          • Nerfed PDA lights to a 3x3 area, makes the flashlight actually worthwhile.
          • -
          -
          - - -
          -

          6/4/13

          -

          Meyar updated:

          -
            -
          • Disposal's mail routing fixed. Missing pipes replaced.
          • -
          • Chemistry is once again a part of the disposals delivery circuit.
          • -
          • Added missing sorting junctions to Security and HoS office.
          • -
          • Fixed a duplicate sorting junction.
          • -
          -
          - - -
          -

          5.06.2013

          -

          Chinsky updated:

          -
            -
          • Load bearing equipment - webbings and vests for engineers and sec. Attach to jumpsuit, use 'Look in storage' verb (object tab) to open.
          • -
          -
          - - - - - - - - - - - - -
          -

          1.06.2013

          -

          Chinsky updated:

          -
            -
          • Bloody footprints! Now stepping in the puddle will dirty your shoes/feet and make you leave bloody footprints for a bit.
          • -
          • Blood now dries up after some time. Puddles take ~30 minutes, small things 5 minutes.
          • -
          • Untreated wounds now heal. No more toe stubs spamming you with pain messages for the rest of the shift.
          • -
          • On the other side, everything is healed slowly. Maximum you cna squeeze out of first aid is 0.5 health per tick per organ. Lying down makes it faster too, by 1.5x factor.
          • -
          • Lids! Click beaker/bottle in hand to put them on/off. Prevent spilling
          • -
          • Added 'hailer' to security lockers. If used in hand, says "Halt! Security!". For those who can't run and type.
          • -
          - -
          - -
          -

          31.05.2013

          -

          Segrain updated:

          -
            -
          • Portable canisters now properly connect to ports beneath them on map load.
          • -
          • Fixed unfastening gas meters.
          • -
          -
          - -
          -

          30th May 2013

          -

          proliberate updated:

          -
            -
          • Station time is now displayed in the status tab for new players and AIs.
          • -
          -
          - -
          -

          30.05.2013

          -

          Segrain updated:

          -
            -
          • Meteor showers actually spawn meteors now.
          • -
          • Engineering tape fits into toolbelt and can be placed on doors.
          • -
          • Pill bottles can hold paper.
          • -
          -
          - -
          -

          May 28th, 2013

          -

          VitrescentTortoise updated:

          -
            -
          • Wizard's forcewall now works.
          • -
          -
            -
          • Xenoarchaeology picksets can now hold everything they started with.
          • -
          -
          -
          -

          28th May 2013

          -

          Erthilo updated:

          -
            -
          • Fixes everyone being able to understand alien languages. HERE IS YOUR TOWER OF BABEL
          • -
          -
          - -
          -

          26th May 2013

          -

          Chinsky updated:

          -
            -
          • Tentacles! Now clone damage will make you horribly malformed like examine text says.
          • -
          -

          VitrescentTortoise updated:

          -
            -
          • Added a third option for not getting any job preferences. It allows you to return to the lobby instead of joining.
          • -
          -
          - -
          -

          5/26/2013

          -

          Meyar updated:

          -
            -
          • The syndicate shuttle now has a cycling airlock during Nuke rounds.
          • -
          • Restored the ability for the syndicate Agent ID to change the name on the card (reforge it) more than once.
          • -
          • ERT Radio now functional again.
          • -
          • Research blast doors now actually lock down the entirety of station-side Research.
          • -
          • Added lock down buttons to the wardens office.
          • -
          • The randomized barsign has made a return.
          • -
          • Syndicate Agent ID's external airlock access restored.
          • -
          -
          - -
          -

          25th May 2013

          -

          Erthilo updated:

          -
            -
          • Fixes alien races appearing an unknown when speaking their language.
          • -
          • Fixes alien races losing their language when cloned.
          • -
          • Fixes UI getting randomly reset when trying to change it in Genetics Scanners.
          • -
          -
          - -
          -

          21 May 2013

          -

          SkyMarshal updated:

          -
            -
          • 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.
          • -
          • Portable Canisters will now automatically connect to any portable connecter beneath them on map load.
          • -
          • Bug involving mis-mapped disposal junction fixed
          • -
          • Air alarms now work for atmos techs (whoops!)
          • -
          • The Master Controller now properly stops atmos when it runtimes.
          • -
          • Backpacks can no longer be contaminated
          • -
          • ZAS no longer logs air statistics.
          • -
          • 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)
          • -
          • General code cleanup/commenting of ZAS
          • -
          • Jungle now initializes after the random Z-level loads and atmos initializes.
          • -
          -
          - -
          -

          May 18th, 2013

          -

          CIB updated:

          -
            -
          • A new event type: Wallrot. Use welder or plantbgone on infected walls.
          • -
          • 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!
          • -
          -
          - -
          -

          April 24, 2013

          -

          Jediluke69 updated:

          -
            -
          • Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter)
          • -
          • Nanopaste now heals about half of what it used to
          • -
          • Ballistic crates should now come with shotguns loaded with actual shells no more beanbags
          • -
          • Iced tea no longer makes a glass of .what?
          • -
          -
          - -
          -

          April 24, 2013

          -

          faux updated:

          -
            -
          • Mixed Wardrobe Closet now has colored shoes and plaid skirts.
          • -
          • Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A uniform jacket has also been added to the Captain's closet. HoS' hat has been re-added to their closet. I do not love the CMO and CE enough to give them anything.
          • -
          • Atheletic closet now has five different swimsuits *for the ladies* in them. If you are a guy, be prepared to be yelled at if you run around like a moron in one of these. Same goes for ladies who run around in shorts with their titties swaying in the space winds.
          • -
          • A set of dispatcher uniforms will spawn in the security closet. These are for playtesting the dispatcher role.
          • -
          • New suit spawns in the laundry room. It's for geezer's only. You're welcome, Book.
          • -
          • Nurse outfit variant, orderly uniform, and first responder jacket will now spawn in the medical wardrobe closet.
          • -
          • A white wedding dress will spawn in the chaplain's closet. There are also several dresses currently only adminspawnable. Admins: Look either under "bride" or "dress." The bride one leads to the colored wedding dresses, and there are some other kinds of dresses under dress.
          • -
          • No more luchador masks or boxing gloves or boxing ring. You guys have a swimming pool now, dip in and enjoy it.
          • -
          • he meeting hall has been replaced with an awkwardly placed security office meant for prisoner processing.
          • -
          • Added a couple more welding goggles to engineering since you guys liked those a lot.
          • -
          • Flasks spawn behind the bar. Only three. Don't fight over them. I don't know how to add them to the bar vending machine otherwise I would have done that instead. Detective, you have your own flask in your office, it's underneath the cigarettes on your desk.
          • -
          • Added two canes to the medical storage, for people who have leg injuries and can't walk good and stuff. I do not want to see doctors pretending to be House. These are for patients. Do not make me delete this addition and declare you guys not being able to have nice things.
          • -
          • Secondary entance to EVA now directly leads into the medbay hardsuit section. Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits whenever they want.
          • -
          • Secondary security hardsuit has been added to the armory. Security members please stop stealing engineer's hardsuits when you guys want to pair up for space travel.
          • -
          • Firelocks have been moved around in the main hallways to form really ghetto versions of airlocks.
          • -
          • Violin spawns in theatre storage now. I didn't put the piano there though, that was someone else.
          • -
          • Psych office in medbay has been made better looking.
          • -
          -
          - -
          -

          24th April 2013

          -

          NerdyBoy1104 updated:

          -
            -
          • New Botany additions: Rice and Plastellium. New sheet material: Plastic.
          • -
          • Plastellium is refined into plastic by first grinding the produce to get plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which can be used to make crates, forks, spoons, knives, ashtrays or plastic bags from.
          • -
          • Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + 5 universal enzyme (in beaker) makes Sake.
          • -
          -
          - -
          -

          Spamcat

          -

          04.05.2013 updated:

          -
            -
          • Blood type is now saved in character creation menu, no need to edit it manually every round.
          • -
          -
          - -
          -

          17 April 2013

          -

          SkyMarshal updated:

          -
            -
          • ZAS is now more deadly, as per decision by administrative team. May be tweaked, but currently AIRFLOW is the biggest griefer.
          • -
          • World startup optimized, many functions now delayed until a player joins the server. (Reduces server boot time significantly)
          • -
          • Zones will now equalize air more rapidly.
          • -
          • ZAS now respects active magboots when airflow occurs.
          • -
          • Airflow will no longer throw you into doors and open them.
          • -
          • Race condition in zone construction has been fixed, so zones connect properly at round start.
          • -
          • Plasma effects readded.
          • -
          • Fixed runtime involving away mission.
          • -
          -
          - -
          -

          17 April 2013

          -

          SkyMarshal updated:

          -
            -
          • ZAS is now more deadly, as per decision by administrative team. May be tweaked, but currently AIRFLOW is the biggest griefer.
          • -
          • World startup optimized, many functions now delayed until a player joins the server. (Reduces server boot time significantly)
          • -
          • Zones will now equalize air more rapidly.
          • -
          • ZAS now respects active magboots when airflow occurs.
          • -
          • Airflow will no longer throw you into doors and open them.
          • -
          • Race condition in zone construction has been fixed, so zones connect properly at round start.
          • -
          • Plasma effects readded.
          • -
          • Fixed runtime involving away mission.
          • -
          -
          - -
          -

          30.04.2013

          -

          Spamcat updated:

          -
            -
          • Pill bottle capacity increased to 14 items.
          • -
          • Fixed Lamarr (it now spawns properly)
          • -
          -
          - -
          -

          15.04.2013

          -

          Spamcat updated:

          -
            -
          • Added telescopic batons to HoS's and captain's lockers. These are quite robust and easily concealable.
          • -
          -
          - -
          -

          May 14th 2013

          -

          Cael_Aislinn updated:

          -
            -
          • Depth scanners can now be used to determine what material archaeological deposits are made of, meaning lab analysis is no longer required.
          • -
          • Some useability issues with xenoarchaeology tools have been resolved, and the transit pods cycle automatically now.
          • -
          -
          - -
          -

          11 April 2013

          -

          SkyMarshal updated:

          -
            -
          • Fire has been reworked.
          • -
          • In-game variable editor is both readded and expanded with fire controlling capability.
          • -
          -
          - -
          -

          9 April 2013

          -

          SkyMarshal updated:

          -
            -
          • Fire Issues (Firedoors, Flamethrowers, Incendiary Grenades) fixed.
          • -
          • Fixed a bad line of code that was preventing autoignition of flammable gas mixes.
          • -
          • Volatile fuel is burned up after a point.
          • -
          • Partial-tile firedoors removed. This is due to ZAS breaking when interacting with them.
          • -
          -
          - -
          -

          4 April 2013

          -

          SkyMarshal updated:

          -
            -
          • Fixed ZAS
          • -
          • Fixed Fire
          • -
          -
          - -
          -

          March 27th 2013

          -

          Asanadas updated:

          -
            -
          • The Null Rod has recovered its de-culting ability, for balance reasons. Metagaming with it is a big no-no!
          • -
          • Holy Water as a liquid is able to de-cult. Less effective, but less bloody. May be changed over the course of time for balance.
          • -
          -
          - -
          -

          26.03.2013

          -

          Spamcat updated:

          -
            -
          • Chemmaster now puts pills in pill bottles (if one is inserted).
          • -
          • Stabbing someone with a syringe now deals 3 damage instead of 7 because 7 is like, a crowbar punch.
          • -
          • Lizards can now join mid-round again.
          • -
          • Chemicals in bloodstream will transfer with blood now, so don't get drunk before your blood donation. Viruses and antibodies transfer through blood too.
          • -
          • Virology is working again.
          • -
          -
          - -
          -

          March 15th 2013

          -

          Cael_Aislinn updated:

          -
            -
          • Mapped a compact research base on the mining asteroid, with multiple labs and testing rooms. It's reachable through a new (old) shuttle dock that leaves from the research wing on the main station.
          • -
          -
          - -
          -

          14.03.2013

          -

          Spamcat updated:

          -
            -
          • Figured I should make one of these. Syringestabbing now produces a broken syringe complete with fingerprints of attacker and blood of a victim, so dispose your evidence carefully. Maximum transfer amount per stab is lowered to 10.
          • -
          -
          - -
          -

          11/03/2013

          -

          Chinsky updated:

          -
            -
          • Sec HUDs now can see short versions of sec records.on examine. Med HUDs do same for medical records, and can set medical status of patient.
          • -
          • Damage to the head can now cause brain damage.
          • -
          -
          - -
          -

          March 11th 2013

          -

          CIB updated:

          -
            -
          • Cloning now requires you to put slabs of meat into the cloning pod to replenish biomass.
          • -
          -
          - -
          -

          March 11th 2013

          -

          Cael Aislinn updated:

          -
            -
          • The xenoarchaeology update is here. This includes a major content overhaul and a bunch of new features for xenoarchaeology.
          • -
          • Digsites (strange rock deposits) are now much more nuanced and interesting, and a huge number of minor (non-artifact) finds have been added.
          • -
          • Excavation is now a complex process that involves digging into the rock to the right depth.
          • -
          • Chemical analysis is required for safe excavation of the digsites, in order to determine how best to extract the finds.
          • -
          • Anomalous artifacts have been overhauled and many longstanding bugs with existing effects have been fixed - the anomaly utiliser should now work much more often.
          • -
          • Numerous new artifact effects have been added and some new artifact types can be dug up from the asteroid.
          • -
          • New tools and equipment have been added, including normal and spaceworthy versions of the anomaly suits, excavation tools and other neat gadgets.
          • -
          • Five books have been written by subject matter experts from around the galaxy to help the crew of the Exodus come to grips with this exacting new science (over 3000 words of tutorials!).
          • -
          -
          - -
          -

          March 9th 2013

          -

          Cael Aislinn updated:

          -
            -
          • Beekeeping is now possible. Construct an apiary of out wood and embed it into a hydroponics tray, then get a queen bee and bottle of BeezEez from cargo bay. +




          • +
          + +

          29 April 2014

          +

          HarpyEagle updated:

          +
            +
          • Webbing vest storage can now be accessed by clicking on the item in inventory
          • +
          • Holsters can be accessed by clicking on them in inventory
          • +
          • Webbings and other suit attachments are now visible on the icon in inventory
          • +
          • Removing jumpsuits now requires drag and drop to prevent accidental undressing
          • +
          • Added an action icon for magboots that can be used to toggle them similar to flashlights
          • +
          • Fuel tanks now spill fuel when wrenched open
          • +
          + +

          25 April 2014

          +

          Various updated:

          +
            +
          • Overhauled saycode, you can now use languages over the radio.
          • +
          • Chamelon items beyond just the suit.
          • +
          • NanoUI Virology
          • +
          • 3D Sounds
          • +
          • AI Channel color for when they want to be all sneaky
          • +
          • New inflatable walls and airlocks for your breach sealing pleasure.
          • +
          • Carbon Copy papers, so you can subject everyone to your authority and paperwork, but mainly paperwork
          • +
          • Undershirts and rolling down jumpsuits
          • +
          • Insta-hit tasers, can be shot through glass as well.
          • +
          • Changeling balances, an emphasis put more on stealth.
          • +
          • Genetics disabled
          • +
          • Telescience removed, might be added again when we come up with a less math headache enducing version of it.
          • +
          • Bugfixes galore!
          • +
          + +

          11 April 2014

          +

          Jarcolr updated:

          +
            +
          • You can now flip coins like a D2
          • +
          • Miscellaneous cargo crates got a tiny buff, Standard Costume crate is now Costume Crate
          • +
          • Grammar patch,telekinesis/amputated arm exploit fixes,more in the future
          • +
          • Grille kicking now does less damage
          • +
          • TELESCOPIC baton no longer knocks anybody down,still got a lot of force though
          • +
          • Other small-ish changes and fixes that aren't worth mentioning
          • +
          + +

          06 April 2014

          +

          RavingManiac updated:

          +
            +
          • Tape recorders and station-bounced radios now work inside containers and closets.
          • +
          + +

          30 March 2014

          +

          RavingManiac updated:

          +
            +
          • Inflatable walls and doors added. Useful for sealing off hull breaches, but easily punctured by sharp objects and Tajarans.
          • +
          + +

          10 March 2014

          +

          Chinsky updated:

          +
            +
          • Viruses now affect certain range of species, different for each virus
          • +
          • Spaceacilline now prevents infection, and has a small chance to cure viruses at Stage 1. It does not give them antibodies though, so they can get sick again!
          • +
          • Biosuits and spacesuits now offer more protection against viruses. Full biosuit competely prevents airborne infection, when coupled with gloves they both protect quite well from contact ones
          • +
          • Sneezing now spreads viruses in front of mob. Sometimes he gets a warning beforehand though
          • +
          + +

          05 March 2014

          +

          RavingManiac updated:

          +
            +
          • Smartfridges added to the bar, chemistry and virology. No more clutter!
          • +
          • A certain musical instrument has returned to the bar.
          • +
          • There is now a ten second delay between ingesting a pill/donut/milkshake and regretting it.
          • +
          + +

          01 March 2014

          +

          Various updated:

          +
            +
          • Paint Mixing, red and blue makes purple!
          • +
          • New posters to tell you to respect those darned cat people
          • +
          • NanoUI for APC's, Canisters, Tank Transfer Valves and the heaters / coolers
          • +
          • PDA bombs are now less annoying, and won't always blow up / cause internal bleeding
          • +
          • Blob made less deadly
          • +
          • Objectiveless Antags now a configuration option, choose your own adventure!
          • +
          • Engineering redesign, now with better monitoring of the explodium supermatter!
          • +
          • Security EOD
          • +
          • New playable race, IPC's, go beep boop boop all over the station!
          • +
          • Gamemode autovoting, now players don't have to call for gamemode votes, it's automatic!
          • +
          + +

          19 February 2014

          +

          Aryn updated:

          +
            +
          • New air model. Nothing should change to a great degree, but temperature flow might be affected due to closed connections not sticking around.
          • +
          + +

          01 February 2014

          +

          Various updated:

          +
            +
          • NanoUI for PDA
          • +
          • Write in blood while a ghost in cult rounds with enough cultists
          • +
          • Cookies, absurd sandwiches, and even cookable dioanae nymphs!
          • +
          • A bunch of new guns and other weapons
          • +
          • Species specific blood
          • +
          + +

          01 January 2014

          +

          Various updated:

          +
            +
          • AntagHUD and MedicalHUD for ghosts, see who the baddies are, check for new configuration options.
          • +
          • Ghosts will now have bold text if they are in the same room as the person making conversations easier to follow.
          • +
          • New hairstyles! Now you can use something other then hotpink floor length braid.
          • +
          • DNA rework, tell us how you were cloned and became albino!
          • +
          • Dirty floors, so now you know exactly how lazy the janitors are!
          • +
          • A new UI system, feel free to color it yourself, don't set it to completely clear or you will have a bad time.
          • +
          • Cryogenic storage, for all your SSD needs.
          • +
          • New hardsuits for those syndicate tajaran
          • +
          + +

          18 December 2013

          +

          RavingManiac updated:

          +
            +
          • Mousetraps can now be "hidden" through the right-click menu. This makes them go under tables, clutter and the like. The filthy rodents will never see it coming!
          • +
          • Monkeys will no longer move randomly while being pulled.
          • +
          + +

          01 December 2013

          +

          Various Developers banged their keyboards together: updated:

          +
            +
          • New Engine, the supermatter, figure out what a cooling loop is, or don't and blow up engineering!
          • +
          • Each department will have it's own fax, make a copy of your butt and fax it to the admins!
          • +
          • Booze and soda dispensers, they are like chemmasters, only with booze and soda!
          • +
          • Bluespace and Cryostasis beakers, how do they work? Fuggin bluespace how do they work?
          • +
          • You can now shove things into vending machines, impress your friends on how things magically disappear out of your hands into the machine!
          • +
          • Robots and Androids (And gynoids too!) can now use custom job titles
          • +
          • Various bugfixes
          • +
          + +

          24 November 2013

          +

          Yinadele updated:

          +
            +
          • Supermatter engine added! Please treat your new engine gently, and report any strangeness!
          • +
          • Rebalanced events so people don't explode into appendicitis or have their organs constantly explode.
          • +
          • Vending machines have had bottled water, iced tea, and grape soda added.
          • +
          • Head reattachment surgery added! Sew heads back on proper rather than monkey madness.
          • +
          • Pain crit rebalanced - Added aim variance depending on pain levels, nerfed blackscreen severely.
          • +
          • Cyborg alt titles: Robot, and Android added! These will make you spawn as a posibrained robot. Please enjoy!
          • +
          • Fixed the sprite on the modified welding goggles, added a pair to the CE's office where they'll be used.
          • +
          • Fixed atmos computers- They are once again responsive!
          • +
          • Added in functionality proper for explosive implants- You can now set their level of detonation, and their effects are more responsively concrete depending on setting.
          • +
          • Hemostats re-added to autolathe!
          • +
          • Added two manuals on atmosia and EVA, by MagmaRam! Found in engineering and the engineering bookcase.
          • +
          • Fixed areas in medbay to have fully functional APC sectors.
          • +
          • Girders are now lasable.
          • +
          • Please wait warmly, new features planned for next merge!
          • +
          + +

          23 November 2013

          +

          Ccomp5950 updated:

          +
            +
          • Players are now no longer able to commit suicide with a lasertag gun, and will feel silly for doing so.
          • +
          • Ghosts hit with the cult book shall now actually become visible.
          • +
          • The powercells spawned with Exosuits will now properly be named to not confuse bearded roboticists.
          • +
          • Blindfolded players will now no longer require eye surgery to repair their sight, removing the blindfold will be sufficient.
          • +
          • Atmospheric Technicians will now have access to Exterior airlocks.
          • +
          + +

          01 November 2013

          +

          Various updated:

          +
            +
          • Autovoting, Get off the station when your 15 hour workweek is done, thanks unions!
          • +
          • Some beach props that Chinsky finds useless.
          • +
          • Updated NanoUI
          • +
          • Dialysis while in sleepers - removes reagents from mobs, like the chemist, toss him in there!
          • +
          • Pipe Dispensers can now be ordered by Cargo
          • +
          • Fancy G-G-G-G-Ghosts!
          • +
          + +

          29 October 2013

          +

          Cael_Aislinn updated:

          +
            +
          • Xenoarchaeology's chemical analysis and six analysis machines are gone, replaced by a single one which can be beaten in a minigame.
          • +
          • Sneaky traitors will find new challenges to overcome at the research outpost, but may also find new opportunities (transit tubes can now be traversed).
          • +
          • Finding active alien machinery should now be made significantly easier with the Alden-Saraspova counter.
          • +
          + +

          06 October 2013

          +

          Chinsky updated:

          +
            +
          • Return of dreaded side effects. They now manifest well after their cause disappears, so curing them should be possible without them reappearing immediately. They also lost last stage damaging effects.
          • +
          + +

          24 September 2013

          +

          Snapshot updated:

          +
            +
          • Removed hidden vote counts.
          • +
          • Removed hiding of vote results.
          • +
          • Removed OOC muting during votes.
          • +
          • Crew transfers are no longer callable during Red and Delta alert.
          • +
          • Started work on Auto transfer framework.
          • +
          + +

          18 September 2013

          +

          Kilakk updated:

          +
            +
          • Fax machines! The Captain and IA agents can use the fax machine to send properly formatted messages to Central Command.
          • +
          • Gave the fax machine a fancy animated sprite. Thanks Cajoes!
          • +
          + +

          08 August 2013

          +

          Erthilo updated:

          +
            +
          • Raise Dead rune now properly heals and revives dead corpse.
          • +
          • Admin-only rejuvenate verb now heals all organs, limbs, and diseases.
          • +
          • Cyborg sprites now correctly reset with reset boards. This means cyborg appearances can now be changed without admin intervention.
          • +
          + +

          04 August 2013

          +

          Chinsky updated:

          +
            +
          • Health HUD indicator replaced with Pain indicator. Now health indicator shows pain level instead of actual vitals level. Some types of damage contribute more to pain, some less, usually feeling worse than they really are.
          • +
          + +

          01 August 2013

          +

          Asanadas updated:

          +
            +
          • The Null Rod has recovered its de-culting ability, for balance reasons. Metagaming with it is a big no-no!
          • +
          • Holy Water as a liquid is able to de-cult. Less effective, but less bloody. May be changed over the course of time for balance.
          • +
          +

          CIB updated:

          +
            +
          • Chilis and cold chilis no longer kill in small amounts
          • +
          • Chloral now again needs around 5 units to start killing somebody
          • +
          +

          Cael Aislinn updated:

          +
            +
          • Security bots will now target hostile mobs, and vice versa.
          • +
          • Carp should actually emigrate now, instead of just immigrating then squatting around the outer hull.
          • +
          • Admins and moderators have been split up into separate 'who' verbs (adminwho and modwho respectively).
          • +
          +

          CaelAislinn updated:

          +
            +
          • Re-added old ion storm laws, re-added grid check event.
          • +
          • Added Rogue Drone and Vermin Infestation random events.
          • +
          • Added/fixed space vines random event.
          • +
          • Updates to the virus events.
          • +
          • Spider infestation and alien infestation events turned off by default.
          • +
          • Soghun, taj and skrell all have unique language text colours.
          • +
          • Moderators will no longer be listed in adminwho, instead use modwho.
          • +
          +

          Cael_Aislinn updated:

          + +

          Chinsky updated:

          +
            +
          • Old new medical features:
          • +
          • Autoinjectors! They come preloaded with 5u of inapro, can be used instantly, and are one-use. You can replace chems inside using a syringe. Box of them is added to Medicine closet and medical supplies crate.
          • +
          • Splints! Target broken liimb and click on person to apply. Can be taken off in inventory menu, like handcuffs. Splinted limbs have less negative effects.
          • +
          • Advanced medikit! Red and mean, all doctors spawn with one. Contains better stuff - advanced versions of bandaids and aloe heal 12 damage on the first use.
          • +
          • Wounds with damage above 50 won't heal by themselves even if bandaged/salved. Would have to seek advanced medical attention for those.
          • +
          +

          Erthilo updated:

          +
            +
          • Fixed SSD (logged-out) players not staying asleep.
          • +
          • Fixed set-pose verb and mice emotes having extra periods.
          • +
          • Fixed virus crate not appearing and breaking supply shuttle.
          • +
          • Fixed newcaster photos not being censored.
          • +
          +

          Gamerofthegame updated:

          +
            +
          • Miscellaneous mapfixes.
          • +
          +

          GauHelldragon updated:

          +
            +
          • Servicebots now have RoboTray and Printing Pen. Robotray can be used to pick up and drop food/drinks. Printing pen can alternate between writing mode and rename paper mode by clicking it.
          • +
          • Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity sensor.
          • +
          • Chefs can clang their serving trays with a rolling pin. Just like a riot shield!
          • +
          +

          Jediluke69 updated:

          +
            +
          • Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter)
          • +
          • Nanopaste now heals about half of what it used to
          • +
          • Ballistic crates should now come with shotguns loaded with actual shells no more beanbags
          • +
          • Iced tea no longer makes a glass of .what?
          • +
          +

          Jupotter updated:

          +
            +
          • Fix the robotiscist preview in the char setupe screen
          • +
          +

          Kilakk updated:

          +
            +
          • Added the Xenobiologist job. Has access to the research hallway and to xenobiology.
          • +
          • Removed Xenobiology access from Scientists.
          • +
          • Removed the Xenobiologist alternate title from Scientists.
          • +
          • Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.
          • +
          • Changed the Research Outpost doors to use "Xenoarchaeology" access.
          • +
          +

          Meyar updated:

          +
            +
          • The syndicate shuttle now has a cycling airlock during Nuke rounds.
          • +
          • Restored the ability for the syndicate Agent ID to change the name on the card (reforge it) more than once.
          • +
          • ERT Radio now functional again.
          • +
          • Research blast doors now actually lock down the entirety of station-side Research.
          • +
          • Added lock down buttons to the wardens office.
          • +
          • The randomized barsign has made a return.
          • +
          • Syndicate Agent ID's external airlock access restored.
          • +
          +

          NerdyBoy1104 updated:

          +
            +
          • New Botany additions: Rice and Plastellium. New sheet material: Plastic.
          • +
          • Plastellium is refined into plastic by first grinding the produce to get plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which can be used to make crates, forks, spoons, knives, ashtrays or plastic bags from.
          • +
          • Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + 5 universal enzyme (in beaker) makes Sake.
          • +
          +

          RavingManiac updated:

          +
            +
          • You can now stab people with syringes using the "harm" intent. This destroys the syringe and transfers a random percentage of its contents into the target. Armor has a 50% chance of blocking the syringe.
          • +
          +

          Segrain updated:

          +
            +
          • Meteor showers actually spawn meteors now.
          • +
          • Engineering tape fits into toolbelt and can be placed on doors.
          • +
          • Pill bottles can hold paper.
          • +
          +

          SkyMarshal updated:

          +
            +
          • Fixed ZAS
          • +
          • Fixed Fire
          • +
          +

          Spamcat updated:

          +
            +
          • Figured I should make one of these. Syringestabbing now produces a broken syringe complete with fingerprints of attacker and blood of a victim, so dispose your evidence carefully. Maximum transfer amount per stab is lowered to 10.
          • +
          +

          VitrescentTortoise updated:

          +
            +
          • Added a third option for not getting any job preferences. It allows you to return to the lobby instead of joining.
          • +
          +

          Whitellama updated:

          +
            +
          • One-antag rounds (like wizard/ninja) no longer end automatically upon death
          • +
          • Space ninja has been implemented as a voteable gamemode
          • +
          • Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)
          • +
          • Five new space ninja directives have been added, old directives have been reworded to be less harsh
          • +
          • Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors
          • +
          • Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits
          • +
          • Space ninja suits' exploding on death has been nerfed, so as not to cause breaches
          • +
          • A few space ninja titles/names have been added and removed to be slightly more believable
          • +
          • The antagonist selector no longer chooses jobbanned players when it runs out of willing options
          • +
          +

          Zuhayr updated:

          +
            +
          • Added pneumatic cannon and harpoons.
          • +
          • Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.
          • +
          +

          faux updated:

          +
            +
          • Mixed Wardrobe Closet now has colored shoes and plaid skirts.
          • +
          • Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A uniform jacket has also been added to the Captain's closet. HoS' hat has been re-added to their closet. I do not love the CMO and CE enough to give them anything.
          • +
          • Atheletic closet now has five different swimsuits *for the ladies* in them. If you are a guy, be prepared to be yelled at if you run around like a moron in one of these. Same goes for ladies who run around in shorts with their titties swaying in the space winds.
          • +
          • A set of dispatcher uniforms will spawn in the security closet. These are for playtesting the dispatcher role.
          • +
          • New suit spawns in the laundry room. It's for geezer's only. You're welcome, Book.
          • +
          • Nurse outfit variant, orderly uniform, and first responder jacket will now spawn in the medical wardrobe closet.
          • +
          • A white wedding dress will spawn in the chaplain's closet. There are also several dresses currently only adminspawnable. Admins: Look either under "bride" or "dress." The bride one leads to the colored wedding dresses, and there are some other kinds of dresses under dress.
          • +
          • No more luchador masks or boxing gloves or boxing ring. You guys have a swimming pool now, dip in and enjoy it.
          • +
          • he meeting hall has been replaced with an awkwardly placed security office meant for prisoner processing.
          • +
          • Added a couple more welding goggles to engineering since you guys liked those a lot.
          • +
          • Flasks spawn behind the bar. Only three. Don't fight over them. I don't know how to add them to the bar vending machine otherwise I would have done that instead. Detective, you have your own flask in your office, it's underneath the cigarettes on your desk.
          • +
          • Added two canes to the medical storage, for people who have leg injuries and can't walk good and stuff. I do not want to see doctors pretending to be House. These are for patients. Do not make me delete this addition and declare you guys not being able to have nice things.
          • +
          • Secondary entance to EVA now directly leads into the medbay hardsuit section. Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits whenever they want.
          • +
          • Secondary security hardsuit has been added to the armory. Security members please stop stealing engineer's hardsuits when you guys want to pair up for space travel.
          • +
          • Firelocks have been moved around in the main hallways to form really ghetto versions of airlocks.
          • +
          • Violin spawns in theatre storage now. I didn't put the piano there though, that was someone else.
          • +
          • Psych office in medbay has been made better looking.
          • +
          +

          proliberate updated:

          +
            +
          • Station time is now displayed in the status tab for new players and AIs.
          • +
          + +

          30 July 2013

          +

          Erthilo updated:

          +
            +
          • EFTPOS and ATM machines should now connect to databases.
          • +
          • Gravitational Catapults can now be removed from mechs.
          • +
          • Ghost manifest rune paper naming now works correctly.
          • +
          • Fix for newscaster special characters. Still not recommended.
          • +
          +

          Kilakk updated:

          +
            +
          • Added colored department radio channels.
          • +
          + +

          28 July 2013

          +

          Segrain updated:

          +
            +
          • Camera console circuits can be adjusted for different networks.
          • +
          • Nuclear operatives and ERT members have built-in cameras in their helmets. Activate helmet to initialize it.
          • +
          + +

          26 July 2013

          +

          Kilakk updated:

          +
            +
          • Brig cell timers will no longer start counting down automatically.
          • +
          • Separated the actual countdown timer from the timer controls. Pressing "Set" while the timer is counting down will reset the countdown timer to the time selected.
          • +
          + +

          11 July 2013

          +

          Chinsky updated:

          +
            +
          • Gun delays. All guns now have delays between shots. Most have less than second, lasercannons and pulse rifles have around 2 seconds delay. Automatics have zero, click-speed.
          • +
          + +

          06 July 2013

          +

          Chinsky updated:

          +
            +
          • Humans now can be infected with more than one virus at once.
          • +
          • All analyzed viruses are put into virus DB. You can view it and edit their name and description on medical record consoles.
          • +
          • Only known viruses (ones in DB) will be detected by the machinery and HUDs.
          • +
          • Viruses cause fever, body temperature rising the more stage is.
          • +
          • Humans' body temperature does not drift towards room one unless there's big difference in them.
          • +
          • Virus incubators now can transmit viuses from dishes to blood sample.
          • +
          • New machine - centrifuge. It can isolate antibodies or viruses (spawning virus dish) from a blood sample in vials. Accepts vials only.
          • +
          • Fancy vial boxes in virology, one of them is locked by ID with MD access.
          • +
          • Engineered viruses are now ariborne too.
          • +
          + +

          05 July 2013

          +

          Spamcat updated:

          +
            +
          • Pulse! Humans now have hearbeat rate, which can be measured by right-clicking someone - Check pulse or by health analyzer. Medical machinery also has heartbeat monitors. Certain meds and conditions can influence it.
          • +
          + +

          03 July 2013

          +

          Segrain updated:

          +
            +
          • Security and medical cyborgs can use their HUDs to access records.
          • +
          + +

          28 June 2013

          +

          Segrain updated:

          +
            +
          • AIs are now able to examine what they see.
          • +
          + +

          27 June 2013

          +

          Segrain updated:

          +
            +
          • ID cards properly setup bloodtype, DNA and fingerprints again.
          • +
          + +

          26 June 2013

          +

          Segrain updated:

          +
            +
          • Autopsy scanner properly displays time of wound infliction and death.
          • +
          • Autopsy scanner properly displays wounds by projectile weapons.
          • +
          +

          Whitellama updated:

          +
            +
          • One-antag rounds (like wizard/ninja) no longer end automatically upon death
          • +
          • Space ninja has been implemented as a voteable gamemode
          • +
          • Space ninja spawn landmarks have been implemented (but not yet placed on the map), still spawn at carps-pawns instead. (The code will warn you about this and ask you to report it, it's a known issue.)
          • +
          • Five new space ninja directives have been added, old directives have been reworded to be less harsh
          • +
          • Space ninjas have been given their own list as antagonists, and are no longer bundled up with traitors
          • +
          • Space ninjas with a "steal a functional AI" objective will now succeed by downloading one into their suits
          • +
          • Space ninja suits' exploding on death has been nerfed, so as not to cause breaches
          • +
          • A few space ninja titles/names have been added and removed to be slightly more believable
          • +
          • The antagonist selector no longer chooses jobbanned players when it runs out of willing options
          • +
          + +

          23 June 2013

          +

          Segrain updated:

          +
            +
          • Airlocks of various models can be constructed again.
          • +
          +

          faux updated:

          +
            +
          • There has been a complete medbay renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t;=7847 <-- Please put any commentary good or bad, here.
          • +
          • Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.
          • +
          • Starboard emergency storage isn't gone now, it's simply located in the escape wing.
          • +
          • An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.
          • +
          + +

          22 June 2013

          +

          Cael_Aislinn updated:

          +
            +
          • The xenoarchaeology depth scanner will now tell you what energy field is required to safely extract a find.
          • +
          • Excavation picks will now dig faster, and xenoarchaeology as a whole should be easier to do.
          • +
          + +

          21 June 2013

          +

          Jupotter updated:

          +
            +
          • Fix the robotiscist preview in the char setupe screen
          • +
          + +

          18 June 2013

          +

          Segrain updated:

          +
            +
          • Fixed some bugs in windoor construction.
          • +
          • Secure windoors are made with rods again.
          • +
          • Windoors drop their electronics when broken. Emagged windoors can have theirs removed by crowbar.
          • +
          • Airlock electronics can be configured to make door open for any single access on it instead of all of them.
          • +
          • Cyborgs can preview their icons before choosing.
          • +
          + +

          13 June 2013

          +

          Kilakk updated:

          +
            +
          • Added the Xenobiologist job. Has access to the research hallway and to xenobiology.
          • +
          • Removed Xenobiology access from Scientists.
          • +
          • Removed the Xenobiologist alternate title from Scientists.
          • +
          • Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer.
          • +
          • Changed the Research Outpost doors to use "Xenoarchaeology" access.
          • +
          + +

          12 June 2013

          +

          Zuhayr updated:

          +
            +
          • Added pneumatic cannon and harpoons.
          • +
          • Added embedded projectiles. Bullets and thrown weapons may stick in targets. Throwing them by hand won't make them stick, firing them from a cannon might. Implant removal surgery will get rid of shrapnel and stuck items.
          • +
          + +

          11 June 2013

          +

          Meyar updated:

          +
            +
          • Fixes a security door with a firedoor ontop of it.
          • +
          • Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE team not RESCUE team)
          • +
          • ERT are now automated, from their spawn to their shuttle. Admin intervention no longer required! (Getting to the mechs still requires admin permission generally)
          • +
          • Added flashlights to compensate for the weakened PDA lights
          • +
          • ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, no sir.
          • +
          + +

          09 June 2013

          +

          Segrain updated:

          +
            +
          • Emagged supply console can order SpecOp crates again.
          • +
          + +

          06 June 2013

          +

          Asanadas updated:

          +
            +
          • Added a whimsical suit to the head of personnel's secret clothing locker.
          • +
          +

          Meyar updated:

          +
            +
          • Disposal's mail routing fixed. Missing pipes replaced.
          • +
          • Chemistry is once again a part of the disposals delivery circuit.
          • +
          • Added missing sorting junctions to Security and HoS office.
          • +
          • Fixed a duplicate sorting junction.
          • +
          + +

          05 June 2013

          +

          Chinsky updated:

          +
            +
          • Load bearing equipment - webbings and vests for engineers and sec. Attach to jumpsuit, use 'Look in storage' verb (object tab) to open.
          • +
          +

          Segrain updated:

          +
            +
          • Exosuits now can open firelocks by walking into them.
          • +
          + +

          01 June 2013

          +

          Chinsky updated:

          +
            +
          • Bloody footprints! Now stepping in the puddle will dirty your shoes/feet and make you leave bloody footprints for a bit.
          • +
          • Blood now dries up after some time. Puddles take ~30 minutes, small things 5 minutes.
          • +
          • Untreated wounds now heal. No more toe stubs spamming you with pain messages for the rest of the shift.
          • +
          • On the other side, everything is healed slowly. Maximum you cna squeeze out of first aid is 0.5 health per tick per organ. Lying down makes it faster too, by 1.5x factor.
          • +
          • Lids! Click beaker/bottle in hand to put them on/off. Prevent spilling
          • +
          • Added 'hailer' to security lockers. If used in hand, says "Halt! Security!". For those who can't run and type.
          • +
          + +

          31 May 2013

          +

          Segrain updated:

          +
            +
          • Portable canisters now properly connect to ports beneath them on map load.
          • +
          • Fixed unfastening gas meters.
          • +
          + +

          30 May 2013

          +

          Segrain updated:

          +
            +
          • Meteor showers actually spawn meteors now.
          • +
          • Engineering tape fits into toolbelt and can be placed on doors.
          • +
          • Pill bottles can hold paper.
          • +
          +

          Spamcat updated:

          +
            +
          • Pill bottle capacity increased to 14 items.
          • +
          • Fixed Lamarr (it now spawns properly)
          • +
          +

          proliberate updated:

          +
            +
          • Station time is now displayed in the status tab for new players and AIs.
          • +
          + +

          28 May 2013

          +

          Erthilo updated:

          +
            +
          • Fixes everyone being able to understand alien languages. HERE IS YOUR TOWER OF BABEL
          • +
          +

          VitrescentTortoise updated:

          +
            +
          • Wizard's forcewall now works.
          • +
          + +

          26 May 2013

          +

          Chinsky updated:

          +
            +
          • Tentacles! Now clone damage will make you horribly malformed like examine text says.
          • +
          +

          Meyar updated:

          +
            +
          • The syndicate shuttle now has a cycling airlock during Nuke rounds.
          • +
          • Restored the ability for the syndicate Agent ID to change the name on the card (reforge it) more than once.
          • +
          • ERT Radio now functional again.
          • +
          • Research blast doors now actually lock down the entirety of station-side Research.
          • +
          • Added lock down buttons to the wardens office.
          • +
          • The randomized barsign has made a return.
          • +
          • Syndicate Agent ID's external airlock access restored.
          • +
          +

          VitrescentTortoise updated:

          +
            +
          • Added a third option for not getting any job preferences. It allows you to return to the lobby instead of joining.
          • +
          + +

          25 May 2013

          +

          Erthilo updated:

          +
            +
          • Fixes alien races appearing an unknown when speaking their language.
          • +
          • Fixes alien races losing their language when cloned.
          • +
          • Fixes UI getting randomly reset when trying to change it in Genetics Scanners.
          • +
          + +

          21 May 2013

          +

          SkyMarshal updated:

          +
            +
          • 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.
          • +
          • Portable Canisters will now automatically connect to any portable connecter beneath them on map load.
          • +
          • Bug involving mis-mapped disposal junction fixed
          • +
          • Air alarms now work for atmos techs (whoops!)
          • +
          • The Master Controller now properly stops atmos when it runtimes.
          • +
          • Backpacks can no longer be contaminated
          • +
          • ZAS no longer logs air statistics.
          • +
          • 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)
          • +
          • General code cleanup/commenting of ZAS
          • +
          • Jungle now initializes after the random Z-level loads and atmos initializes.
          • +
          + +

          15 May 2013

          +

          Spamcat updated:

          +
            +
          • Added telescopic batons to HoS's and captain's lockers. These are quite robust and easily concealable.
          • +
          + +

          14 May 2013

          +

          Cael_Aislinn updated:

          +
            +
          • Depth scanners can now be used to determine what material archaeological deposits are made of, meaning lab analysis is no longer required.
          • +
          • Some useability issues with xenoarchaeology tools have been resolved, and the transit pods cycle automatically now.
          • +
          + +

          24 April 2013

          +

          Jediluke69 updated:

          +
            +
          • Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter)
          • +
          • Nanopaste now heals about half of what it used to
          • +
          • Ballistic crates should now come with shotguns loaded with actual shells no more beanbags
          • +
          • Iced tea no longer makes a glass of .what?
          • +
          +

          NerdyBoy1104 updated:

          +
            +
          • New Botany additions: Rice and Plastellium. New sheet material: Plastic.
          • +
          • Plastellium is refined into plastic by first grinding the produce to get plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which can be used to make crates, forks, spoons, knives, ashtrays or plastic bags from.
          • +
          • Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + 5 universal enzyme (in beaker) makes Sake.
          • +
          +

          faux updated:

          +
            +
          • Mixed Wardrobe Closet now has colored shoes and plaid skirts.
          • +
          • Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A uniform jacket has also been added to the Captain's closet. HoS' hat has been re-added to their closet. I do not love the CMO and CE enough to give them anything.
          • +
          • Atheletic closet now has five different swimsuits *for the ladies* in them. If you are a guy, be prepared to be yelled at if you run around like a moron in one of these. Same goes for ladies who run around in shorts with their titties swaying in the space winds.
          • +
          • A set of dispatcher uniforms will spawn in the security closet. These are for playtesting the dispatcher role.
          • +
          • New suit spawns in the laundry room. It's for geezer's only. You're welcome, Book.
          • +
          • Nurse outfit variant, orderly uniform, and first responder jacket will now spawn in the medical wardrobe closet.
          • +
          • A white wedding dress will spawn in the chaplain's closet. There are also several dresses currently only adminspawnable. Admins: Look either under "bride" or "dress." The bride one leads to the colored wedding dresses, and there are some other kinds of dresses under dress.
          • +
          • No more luchador masks or boxing gloves or boxing ring. You guys have a swimming pool now, dip in and enjoy it.
          • +
          • he meeting hall has been replaced with an awkwardly placed security office meant for prisoner processing.
          • +
          • Added a couple more welding goggles to engineering since you guys liked those a lot.
          • +
          • Flasks spawn behind the bar. Only three. Don't fight over them. I don't know how to add them to the bar vending machine otherwise I would have done that instead. Detective, you have your own flask in your office, it's underneath the cigarettes on your desk.
          • +
          • Added two canes to the medical storage, for people who have leg injuries and can't walk good and stuff. I do not want to see doctors pretending to be House. These are for patients. Do not make me delete this addition and declare you guys not being able to have nice things.
          • +
          • Secondary entance to EVA now directly leads into the medbay hardsuit section. Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits whenever they want.
          • +
          • Secondary security hardsuit has been added to the armory. Security members please stop stealing engineer's hardsuits when you guys want to pair up for space travel.
          • +
          • Firelocks have been moved around in the main hallways to form really ghetto versions of airlocks.
          • +
          • Violin spawns in theatre storage now. I didn't put the piano there though, that was someone else.
          • +
          • Psych office in medbay has been made better looking.
          • +
          + +

          17 April 2013

          +

          SkyMarshal updated:

          +
            +
          • ZAS is now more deadly, as per decision by administrative team. May be tweaked, but currently AIRFLOW is the biggest griefer.
          • +
          • World startup optimized, many functions now delayed until a player joins the server. (Reduces server boot time significantly)
          • +
          • Zones will now equalize air more rapidly.
          • +
          • ZAS now respects active magboots when airflow occurs.
          • +
          • Airflow will no longer throw you into doors and open them.
          • +
          • Race condition in zone construction has been fixed, so zones connect properly at round start.
          • +
          • Plasma effects readded.
          • +
          • Fixed runtime involving away mission.
          • +
          + +

          11 April 2013

          +

          SkyMarshal updated:

          +
            +
          • Fire has been reworked.
          • +
          • In-game variable editor is both readded and expanded with fire controlling capability.
          • +
          + +

          09 April 2013

          +

          SkyMarshal updated:

          +
            +
          • Fire Issues (Firedoors, Flamethrowers, Incendiary Grenades) fixed.
          • +
          • Fixed a bad line of code that was preventing autoignition of flammable gas mixes.
          • +
          • Volatile fuel is burned up after a point.
          • +
          • Partial-tile firedoors removed. This is due to ZAS breaking when interacting with them.
          • +
          + +

          04 April 2013

          +

          SkyMarshal updated:

          +
            +
          • Fixed ZAS
          • +
          • Fixed Fire
          • +
          +

          Spamcat updated:

          +
            +
          • Blood type is now saved in character creation menu, no need to edit it manually every round.
          • +
          + +

          27 March 2013

          +

          Asanadas updated:

          +
            +
          • The Null Rod has recovered its de-culting ability, for balance reasons. Metagaming with it is a big no-no!
          • +
          • Holy Water as a liquid is able to de-cult. Less effective, but less bloody. May be changed over the course of time for balance.
          • +
          + +

          26 March 2013

          +

          Spamcat updated:

          +
            +
          • Chemmaster now puts pills in pill bottles (if one is inserted).
          • +
          • Stabbing someone with a syringe now deals 3 damage instead of 7 because 7 is like, a crowbar punch.
          • +
          • Lizards can now join mid-round again.
          • +
          • Chemicals in bloodstream will transfer with blood now, so don't get drunk before your blood donation. Viruses and antibodies transfer through blood too.
          • +
          • Virology is working again.
          • +
          + +

          15 March 2013

          +

          Cael_Aislinn updated:

          +
            +
          • Mapped a compact research base on the mining asteroid, with multiple labs and testing rooms. It's reachable through a new (old) shuttle dock that leaves from the research wing on the main station.
          • +
          + +

          14 March 2013

          +

          Spamcat updated:

          +
            +
          • Figured I should make one of these. Syringestabbing now produces a broken syringe complete with fingerprints of attacker and blood of a victim, so dispose your evidence carefully. Maximum transfer amount per stab is lowered to 10.
          • +
          + +

          11 March 2013

          +

          CIB updated:

          +
            +
          • Cloning now requires you to put slabs of meat into the cloning pod to replenish biomass.
          • +
          +

          Cael Aislinn updated:

          +
            +
          • The xenoarchaeology update is here. This includes a major content overhaul and a bunch of new features for xenoarchaeology.
          • +
          • Digsites (strange rock deposits) are now much more nuanced and interesting, and a huge number of minor (non-artifact) finds have been added.
          • +
          • Excavation is now a complex process that involves digging into the rock to the right depth.
          • +
          • Chemical analysis is required for safe excavation of the digsites, in order to determine how best to extract the finds.
          • +
          • Anomalous artifacts have been overhauled and many longstanding bugs with existing effects have been fixed - the anomaly utiliser should now work much more often.
          • +
          • Numerous new artifact effects have been added and some new artifact types can be dug up from the asteroid.
          • +
          • New tools and equipment have been added, including normal and spaceworthy versions of the anomaly suits, excavation tools and other neat gadgets.
          • +
          • Five books have been written by subject matter experts from around the galaxy to help the crew of the Exodus come to grips with this exacting new science (over 3000 words of tutorials!).
          • +
          +

          Chinsky updated:

          +
            +
          • Sec HUDs now can see short versions of sec records.on examine. Med HUDs do same for medical records, and can set medical status of patient.
          • +
          • Damage to the head can now cause brain damage.
          • +
          + +

          09 March 2013

          +

          Cael Aislinn updated:

          +
            +
          • Beekeeping is now possible. Construct an apiary of out wood and embed it into a hydroponics tray, then get a queen bee and bottle of BeezEez from cargo bay. Hives produce honey and honeycomb, but be wary if the bees start swarming.
          • -
          -
          + -
          -

          March 6th 2013

          -

          Cael Aislinn updated:

          -
            -
          • Type 1 thermoelectric generators and the associated binary circulators are now moveable (wrench to secure/unsecure) and orderable via Quartermaster.
          • -
          • code/maps/rust_test.dmm contains an example setup for a functional RUST reactor. Maximum output is in the range of 12 to 20MW (12 to 20 million watts).
          • -
          • Removed double announcement for gridchecks, reduced duration of gridchecks.
          • -
          -

          RavingManiac updated:

          -
            -
          • You can now stab people with syringes using the "harm" intent. This destroys the syringe and transfers a random percentage of its contents into the target. Armor has a 50% chance of blocking the syringe.
          • -
          -
          +

          06 March 2013

          +

          Cael Aislinn updated:

          +
            +
          • Type 1 thermoelectric generators and the associated binary circulators are now moveable (wrench to secure/unsecure) and orderable via Quartermaster.
          • +
          • code/maps/rust_test.dmm contains an example setup for a functional RUST reactor. Maximum output is in the range of 12 to 20MW (12 to 20 million watts).
          • +
          • Removed double announcement for gridchecks, reduced duration of gridchecks.
          • +
          +

          RavingManiac updated:

          +
            +
          • You can now stab people with syringes using the "harm" intent. This destroys the syringe and transfers a random percentage of its contents into the target. Armor has a 50% chance of blocking the syringe.
          • +
          -
          -

          March 5th 2013

          -

          Cael Aislinn updated:

          -
            -
          • Set roundstart music to randomly choose between space.ogg and traitor.ogg (see http://baystation12.net/forums/viewtopic.php?f=5&t=6972)
          • -
          • All RUST components except for TEGs (which generate the power) are now obtainable ingame, bored engineers should get hold of them and setup an experimental reactor for testing purposes.
          • -
          -

          CIB updated:

          -
            -
          • Added internal organs. They're currently all located in the chest. Use advanced scanner to detect damage. Use the same surgery as for ruptured lungs to fix them.
          • -
          -
          +

          05 March 2013

          +

          CIB updated:

          +
            +
          • Added internal organs. They're currently all located in the chest. Use advanced scanner to detect damage. Use the same surgery as for ruptured lungs to fix them.
          • +
          +

          Cael Aislinn updated:

          +
            +
          • Set roundstart music to randomly choose between space.ogg and traitor.ogg (see http://baystation12.net/forums/viewtopic.php?f=5&t;=6972)
          • +
          • All RUST components except for TEGs (which generate the power) are now obtainable ingame, bored engineers should get hold of them and setup an experimental reactor for testing purposes.
          • +
          -
          -

          February 27th 2013

          -

          Gamerofthegame updated:

          -
            -
          • Added the (base gear) ERT preset for the debug command.
          • -
          • Map fixes, Virology hole fixed. Atmospheric fixes for mining and, to a less extent, the science outpost. (No, not cycling airlocks)
          • -
          • Fiddled with the ERT set up location on Centcom. Radmins will now have a even easier time equiping a team of any real pratical size, especially coupled with the above debug command.
          • -
          -
          +

          27 February 2013

          +

          Gamerofthegame updated:

          +
            +
          • Added the (base gear) ERT preset for the debug command.
          • +
          • Map fixes, Virology hole fixed. Atmospheric fixes for mining and, to a less extent, the science outpost. (No, not cycling airlocks)
          • +
          • Fiddled with the ERT set up location on Centcom. Radmins will now have a even easier time equiping a team of any real pratical size, especially coupled with the above debug command.
          • +
          -
          -

          February 25th 2013

          -

          Cael Aislinn updated:

          -
            -
          • As well as building hull shield generators, normal shield gens can now be built (see http://baystation12.net/forums/viewtopic.php?f=1&t=6993).
          • -
          • New random events: multiple new system wide-events have been have been added to the newscaster feeds, some not quite as respectable as others.
          • -
          • New random event: some lucky winners will win the TC Daily Grand Slam Lotto, while others may be the target of malicious hackers.
          • -
          -
          +

          25 February 2013

          +

          Cael Aislinn updated:

          +
            +
          • As well as building hull shield generators, normal shield gens can now be built (see http://baystation12.net/forums/viewtopic.php?f=1&t;=6993).
          • +
          • New random events: multiple new system wide-events have been have been added to the newscaster feeds, some not quite as respectable as others.
          • +
          • New random event: some lucky winners will win the TC Daily Grand Slam Lotto, while others may be the target of malicious hackers.
          • +
          -
          -

          February 23rd 2013

          -

          Cael Aislinn updated:

          -
            -
          • Finances! Players spawn with an account, and money can be transferred between accounts, withdrawn/deposited at ATMs and charged to accounts via EFTPOS scanners.

            - All players start with 500-5000 credits, credits can no longer be merged and only credits can be deposited into ATMs - so shelter your illegitimately gotten gains in physical assets and remember that fraud is frowned upon!
          • -
          • Turrets are no longer noiseless as the grave. Listen for the sound of machinery in their proximity.
          • -
          -
          +

          23 February 2013

          +

          Cael Aislinn updated:

          +
            +
          • RUST machinery components should now be researchable (with high requirements) and orderable through QM (with high cost).
          • +
          • Shield machinery should now be researchable (with high requirements) and orderable through QM (with high cost). This one is reportedly buggy.
          • +
          • Rogue vending machines should revert back to normal at the end of the event.
          • +
          • New Unathi hair styles.
          • +
          -
          -

          February 23rd 2013

          -

          Cael Aislinn updated:

          -
            -
          • RUST machinery components should now be researchable (with high requirements) and orderable through QM (with high cost).
          • -
          • Shield machinery should now be researchable (with high requirements) and orderable through QM (with high cost). This one is reportedly buggy.
          • -
          • Rogue vending machines should revert back to normal at the end of the event.
          • -
          • New Unathi hair styles.
          • -
          -
          +

          22 February 2013

          +

          Chinsky updated:

          +
            +
          • Change to body cavity surgery. Can only put items in chest, groind and head. Max size for item - 3 (chest), 2 (groin), 1 (head). For chest surgery ribs should be bent open, (lung surgery until second scalpel step). Surgery step needs preparation step, with drill. After that you can place item inside, or seal it with cautery to do other step instead.
          • +
          -
          -

          22/02/2013

          -

          Chinsky updated:

          -
            -
          • Change to body cavity surgery. Can only put items in chest, groind and head. Max size for item - 3 (chest), 2 (groin), 1 (head). For chest surgery ribs should be bent open, (lung surgery until second scalpel step). Surgery step needs preparation step, with drill. After that you can place item inside, or seal it with cautery to do other step instead.
          • -
          -
          +

          20 February 2013

          +

          Chinsky updated:

          +
            +
          • Added new surgery: putting items inside people. After you use retractor to keep incision open, just click with any item to put it inside. But be wary, if you try to fit something too big, you might rip the veins. To remove items, use implant removal surgery.
          • +
          • Crowbar can be used as alternative to retractor.
          • +
          • Can now unload guns by clicking them in hand.
          • +
          • Fixed distance calculation in bullet missing chance computation, it was always assuming 1 or 0 tiles. Now distace REALLY matters when you shoot.
          • +
          • To add more FUN to previous thing, bullets missed to not disappear but keep going until they hit something else.
          • +
          • Compressed Matter and Explosive implants spawn properly now.
          • +
          • Tweaks to medical effects: removed itch caused by bandages. Chemical effects now have non-100 chance of appearing, the stronger medicine, the more probality it'll have side effects.
          • +
          -
          -

          February 18th 2013

          -

          Cael Aislinn updated:

          -
            -
          • All RUST components are now buildable/orderable, with very high requirements (except for the TEGs). Emitters have replaced gyrotrons, for now.
          • -
          • Fixed up shield generators and made them buildable, with circuits obtainable through RnD. Hull shield gens project along space tiles adjacent to the hull (must be adjacent to a space tile to work).
          • -
          -
          +

          18 February 2013

          +

          Cael Aislinn updated:

          +
            +
          • Security bots will now target hostile mobs, and vice versa.
          • +
          • Carp should actually emigrate now, instead of just immigrating then squatting around the outer hull.
          • +
          • Admins and moderators have been split up into separate 'who' verbs (adminwho and modwho respectively).
          • +
          -
          -

          20/02/2013

          -

          Chinsky updated:

          -
            -
          • Added new surgery: putting items inside people. After you use retractor to keep incision open, just click with any item to put it inside. But be wary, if you try to fit something too big, you might rip the veins. To remove items, use implant removal surgery.
          • -
          • Crowbar can be used as alternative to retractor.
          • -
          • Can now unload guns by clicking them in hand.
          • -
          • Fixed distance calculation in bullet missing chance computation, it was always assuming 1 or 0 tiles. Now distace REALLY matters when you shoot.
          • -
          • To add more FUN to previous thing, bullets missed to not disappear but keep going until they hit something else.
          • -
          • Compressed Matter and Explosive implants spawn properly now.
          • -
          • Tweaks to medical effects: removed itch caused by bandages. Chemical effects now have non-100 chance of appearing, the stronger medicine, the more probality it'll have side effects.
          • -
          -
          +

          14 February 2013

          +

          CIB updated:

          +
            +
          • Medical side-effects(patients are going to come back for secondary treatment)
          • +
          • NT loyalty setting(affects command reports and gives antags hints who might collaborate with them)
          • +
          • Simple animal balance fixes(They're slower now)
          • +
          +

          CaelAislinn updated:

          +
            +
          • Re-added old ion storm laws, re-added grid check event.
          • +
          • Added Rogue Drone and Vermin Infestation random events.
          • +
          • Added/fixed space vines random event.
          • +
          • Updates to the virus events.
          • +
          • Spider infestation and alien infestation events turned off by default.
          • +
          • Soghun, taj and skrell all have unique language text colours.
          • +
          • Moderators will no longer be listed in adminwho, instead use modwho.
          • +
          +

          Gamerofthegame updated:

          +
            +
          • Miscellaneous mapfixes.
          • +
          -
          -

          February 18th 2013

          -

          Cael Aislinn updated:

          -
            -
          • Security bots will now target hostile mobs, and vice versa.
          • -
          • Carp should actually emigrate now, instead of just immigrating then squatting around the outer hull.
          • -
          • Admins and moderators have been split up into separate 'who' verbs (adminwho and modwho respectively).
          • -
          -
          +

          13 February 2013

          +

          Erthilo updated:

          +
            +
          • Fixed SSD (logged-out) players not staying asleep.
          • +
          • Fixed set-pose verb and mice emotes having extra periods.
          • +
          • Fixed virus crate not appearing and breaking supply shuttle.
          • +
          • Fixed newcaster photos not being censored.
          • +
          -
          -

          February 14th 2013

          -

          CIB updated:

          -
            -
          • Medical side-effects(patients are going to come back for secondary treatment)
          • -
          • NT loyalty setting(affects command reports and gives antags hints who might collaborate with them)
          • -
          • Simple animal balance fixes(They're slower now)
          • -
          -

          CaelAislinn updated:

          -
            -
          • Re-added old ion storm laws, re-added grid check event.
          • -
          • Added Rogue Drone and Vermin Infestation random events.
          • -
          • Added/fixed space vines random event.
          • -
          • Updates to the virus events.
          • -
          • Spider infestation and alien infestation events turned off by default.
          • -
          • Soghun, taj and skrell all have unique language text colours.
          • -
          • Moderators will no longer be listed in adminwho, instead use modwho.
          • -
          +

          31 January 2013

          +

          CIB updated:

          +
            +
          • Chilis and cold chilis no longer kill in small amounts
          • +
          • Chloral now again needs around 5 units to start killing somebody
          • +
          -

          Gamerofthegame updated:

          -
            -
          • Miscellaneous mapfixes.
          • -
          -
          +

          23 January 2013

          +

          Cael_Aislinn updated:

          + -
          -

          February 13th 2013

          -

          Erthilo updated:

          -
            -
          • Fixed SSD (logged-out) players not staying asleep.
          • -
          • Fixed set-pose verb and mice emotes having extra periods.
          • -
          • Fixed virus crate not appearing and breaking supply shuttle.
          • -
          • Fixed newcaster photos not being censored.
          • -
          -
          +

          21 January 2013

          +

          Cael_Aislinn updated:

          +
            +
          • Satchels and ore boxes can now hold strange rocks.
          • +
          • Closets and crates can now be built out of 5 and 10 plasteel respectively.
          • +
          • Observers can become mice once more.
          • +
          -
          -

          January 23rd

          -

          Cael_Aislinn updated:

          - -
          +

          13 January 2013

          +

          Chinsky updated:

          +
            +
          • If you get enough (6) blood drips on one tile, it'll turn into a blood puddle. Should make bleeding out more visible.
          • +
          • Security belt now able to hold taser, baton and tape roll.
          • +
          • Added alternative security uniform to Security wardrobes.
          • +
          • Ported Urist cult runes. Down with the crayon drawings! Example: http://dl.dropbox.com/u/26846767/images/SS13/255_symbols.PNG
          • +
          • Engineering tape now require engineer OR atmos access instead of both.
          • +
          • Implants now will react to EMP, possibly in !!FUN!! ways
          • +
          +

          GauHelldragon updated:

          +
            +
          • Servicebots now have RoboTray and Printing Pen. Robotray can be used to pick up and drop food/drinks. Printing pen can alternate between writing mode and rename paper mode by clicking it.
          • +
          • Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity sensor.
          • +
          • Chefs can clang their serving trays with a rolling pin. Just like a riot shield!
          • +
          -
          - - -

          1/31/2013

          -

          CIB updated:

          -
            -
          • Chilis and cold chilis no longer kill in small amounts
          • -
          • Chloral now again needs around 5 units to start killing somebody
          • -
          -
          - -
          -

          January 21st

          -

          Cael_Aislinn updated:

          -
            -
          • Satchels and ore boxes can now hold strange rocks.
          • -
          • Closets and crates can now be built out of 5 and 10 plasteel respectively.
          • -
          • Observers can become mice once more.
          • -
          -
          - -
          -

          13/01/2013

          -

          Chinsky updated:

          -
            -
          • If you get enough (6) blood drips on one tile, it'll turn into a blood puddle. Should make bleeding out more visible.
          • -
          • Security belt now able to hold taser, baton and tape roll.
          • -
          • Added alternative security uniform to Security wardrobes.
          • -
          • Ported Urist cult runes. Down with the crayon drawings! Example: http://dl.dropbox.com/u/26846767/images/SS13/255_symbols.PNG
          • -
          • Engineering tape now require engineer OR atmos access instead of both.
          • -
          • Implants now will react to EMP, possibly in !!FUN!! ways
          • -
          -
          - -

          1/13/2013

          -

          GauHelldragon updated:

          -
            -
          • Servicebots now have RoboTray and Printing Pen. Robotray can be used to pick up and drop food/drinks. Printing pen can alternate between writing mode and rename paper mode by clicking it.
          • -
          • Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity sensor.
          • -
          • Chefs can clang their serving trays with a rolling pin. Just like a riot shield!
          • -
          -
          - -
          -

          January 7th

          -

          Cael_Aislinn updated:

          - -
          - -
          -

          7/01/2013

          -

          Chinsky updated:

          -
            -
          • Implants: Explosvie implant, exploding when victim hears the codephrase you set.
          • -
          • Implants: Compressed Matter implat, scan item (making it disappear), inject yourself and recall that item on will!
          • -
          • Implant removal surgery, with !!FUN!! results if you mess up it.
          • -
          • Coats now have pockets again.
          • -
          • Bash people on tabetops. an windows, or with stools. Grab people to bash them on tables or windows (better grab for better hit on windows). Drag stool sprite on you to pick it up, click on it in hand to make it usual stool again.
          • -
          • Surgical caps, and new sprites for bloodbags and fixovein.
          • -
          • Now some surgery steps will bloody your hands, Full-body blood coat in case youy mess up spectacualry.
          • -
          • Ported some crates (Art, Surgery, Sterile equiplemnt).
          • -
          • Changed contraband crates. Posters moved to Art Crate, cigs and lipstick ot party crate. Now contraband crate has illegal booze and illicit drugs.
          • -
          • Finally got evac party lights
          • -
          • Now disfigurment,now it WILL happen when damage is bad enough.
          • -
          • Now if you speak in depressurized area (less than 10 kPa) only people next to you can hear you. Radios still work though.
          • -
          -
          - - - -/tg/ station 13 Development Team - - - - -
          - Coders: TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak, Donkie
          - Spriters: Agouri, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor, Ricotez, Ausops, TankNut
          - Sounds: Skie, Lasty/Vinyl
          - Thanks to: CDK Station devs, GoonStation devs, the original SpaceStation developers and Invisty for the title image -
          - -Daedalus Development Team - - - - -
          - Coders: DopeGhoti, Sunfall, ThVortex
          - Artwork: Captain Hammer
          - Spriters: ((TODO.))
          - Sounds: Peter J, due, Erik Satie
          - Thanks to: All the dev teams that came before: BS12, /tg/station13, the Goons, and the original SS13 folks.
          -
          +

          07 January 2013

          +

          Cael_Aislinn updated:

          + +

          Chinsky updated:

          +
            +
          • Implants: Explosvie implant, exploding when victim hears the codephrase you set.
          • +
          • Implants: Compressed Matter implat, scan item (making it disappear), inject yourself and recall that item on will!
          • +
          • Implant removal surgery, with !!FUN!! results if you mess up it.
          • +
          • Coats now have pockets again.
          • +
          • Bash people on tabetops. an windows, or with stools. Grab people to bash them on tables or windows (better grab for better hit on windows). Drag stool sprite on you to pick it up, click on it in hand to make it usual stool again.
          • +
          • Surgical caps, and new sprites for bloodbags and fixovein.
          • +
          • Now some surgery steps will bloody your hands, Full-body blood coat in case youy mess up spectacualry.
          • +
          • Ported some crates (Art, Surgery, Sterile equiplemnt).
          • +
          • Changed contraband crates. Posters moved to Art Crate, cigs and lipstick ot party crate. Now contraband crate has illegal booze and illicit drugs.
          • +
          • Finally got evac party lights
          • +
          • Now disfigurment,now it WILL happen when damage is bad enough.
          • +
          • Now if you speak in depressurized area (less than 10 kPa) only people next to you can hear you. Radios still work though.
          • +
          +
          GoonStation 13 Development Team
          - Coders: Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion
          - Spriters: Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No
          + Coders: Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion
          + Spriters: Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No
          -

          Creative Commons License
          This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
          Rights are currently extended to SomethingAwful Goons only.

          +
          +

          Creative Commons License
          Except where otherwise noted, Goon Station 13 is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License.
          Rights are currently extended to SomethingAwful Goons only.

          Some icons by Yusuke Kamiyamane. All rights reserved. Licensed under a Creative Commons Attribution 3.0 License.

          -
          + diff --git a/html/changelog.js b/html/changelog.js index 4146d0f094..00db7fbc70 100644 --- a/html/changelog.js +++ b/html/changelog.js @@ -1,87 +1,87 @@ -/* -function dropdowns() { - var divs = document.getElementsByTagName('div'); - var headers = new Array(); - var links = new Array(); - for(var i=0;i=0) { - elem.className = elem.className.replace('visible','hidden'); - this.className = this.className.replace('open','closed'); - } - else { - elem.className = elem.className.replace('hidden','visible'); - this.className = this.className.replace('closed','open'); - } - return false; - } - })(links[i]); - } - } -} -*/ -/* -function filterchanges(type){ - var lists = document.getElementsByTagName('ul'); - for(var i in lists){ - if(lists[i].className && lists[i].className.search('changes')>=0) { - for(var j in lists[i].childNodes){ - if(lists[i].childNodes[j].nodeType == 1){ - if(!type){ - lists[i].childNodes[j].style.display = 'block'; - } - else if(lists[i].childNodes[j].className!=type) { - lists[i].childNodes[j].style.display = 'none'; - } - else { - lists[i].childNodes[j].style.display = 'block'; - } - } - } - } - } -} -*/ -function dropdowns() { - var drops = $('div.drop'); - var indrops = $('div.indrop'); - if(drops.length!=indrops.length){ - alert("Some coder fucked up with dropdowns"); - } - drops.each(function(index){ - $(this).toggleClass('closed'); - $(indrops[index]).hide(); - $(this).click(function(){ - $(this).toggleClass('closed'); - $(this).toggleClass('open'); - $(indrops[index]).toggle(); - }); - }); -} - -function filterchanges(type){ - $('ul.changes li').each(function(){ - if(!type || $(this).hasClass(type)){ - $(this).show(); - } - else { - $(this).hide(); - } - }); -} - -$(document).ready(function(){ - dropdowns(); +/* +function dropdowns() { + var divs = document.getElementsByTagName('div'); + var headers = new Array(); + var links = new Array(); + for(var i=0;i=0) { + elem.className = elem.className.replace('visible','hidden'); + this.className = this.className.replace('open','closed'); + } + else { + elem.className = elem.className.replace('hidden','visible'); + this.className = this.className.replace('closed','open'); + } + return false; + } + })(links[i]); + } + } +} +*/ +/* +function filterchanges(type){ + var lists = document.getElementsByTagName('ul'); + for(var i in lists){ + if(lists[i].className && lists[i].className.search('changes')>=0) { + for(var j in lists[i].childNodes){ + if(lists[i].childNodes[j].nodeType == 1){ + if(!type){ + lists[i].childNodes[j].style.display = 'block'; + } + else if(lists[i].childNodes[j].className!=type) { + lists[i].childNodes[j].style.display = 'none'; + } + else { + lists[i].childNodes[j].style.display = 'block'; + } + } + } + } + } +} +*/ +function dropdowns() { + var drops = $('div.drop'); + var indrops = $('div.indrop'); + if(drops.length!=indrops.length){ + alert("Some coder fucked up with dropdowns"); + } + drops.each(function(index){ + $(this).toggleClass('closed'); + $(indrops[index]).hide(); + $(this).click(function(){ + $(this).toggleClass('closed'); + $(this).toggleClass('open'); + $(indrops[index]).toggle(); + }); + }); +} + +function filterchanges(type){ + $('ul.changes li').each(function(){ + if(!type || $(this).hasClass(type)){ + $(this).show(); + } + else { + $(this).hide(); + } + }); +} + +$(document).ready(function(){ + dropdowns(); }); \ No newline at end of file diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml new file mode 100644 index 0000000000..43c4d8658b --- /dev/null +++ b/html/changelogs/.all_changelog.yml @@ -0,0 +1,1712 @@ +DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. +--- +2013-01-07: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'tgs': !!python/unicode 'Updated server to tgstation r5200 (November + 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg''s changelog.' + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Implants: Explosvie implant, exploding + when victim hears the codephrase you set.' + - !!python/unicode 'rscadd': !!python/unicode 'Implants: Compressed Matter implat, + scan item (making it disappear), inject yourself and recall that item on will!' + - !!python/unicode 'rscadd': !!python/unicode 'Implant removal surgery, with !!FUN!! + results if you mess up it.' + - !!python/unicode 'rscadd': !!python/unicode 'Coats now have pockets again.' + - !!python/unicode 'rscadd': !!python/unicode 'Bash people on tabetops. an windows, + or with stools. Grab people to bash them on tables or windows (better grab for + better hit on windows). Drag stool sprite on you to pick it up, click on it + in hand to make it usual stool again.' + - !!python/unicode 'rscadd': !!python/unicode 'Surgical caps, and new sprites for + bloodbags and fixovein.' + - !!python/unicode 'rscadd': !!python/unicode 'Now some surgery steps will bloody + your hands, Full-body blood coat in case youy mess up spectacualry.' + - !!python/unicode 'rscadd': !!python/unicode 'Ported some crates (Art, Surgery, + Sterile equiplemnt).' + - !!python/unicode 'tweak': !!python/unicode 'Changed contraband crates. Posters + moved to Art Crate, cigs and lipstick ot party crate. Now contraband crate has + illegal booze and illicit drugs.' + - !!python/unicode 'bugfix': !!python/unicode 'Finally got evac party lights' + - !!python/unicode 'bugfix': !!python/unicode 'Now disfigurment,now it WILL happen + when damage is bad enough.' + - !!python/unicode 'experiment': !!python/unicode 'Now if you speak in depressurized + area (less than 10 kPa) only people next to you can hear you. Radios still work + though.' +2013-01-13: + !!python/unicode 'Chinsky': + - !!python/unicode 'tweak': !!python/unicode 'If you get enough (6) blood drips + on one tile, it''ll turn into a blood puddle. Should make bleeding out more + visible.' + - !!python/unicode 'tweak': !!python/unicode 'Security belt now able to hold taser, + baton and tape roll.' + - !!python/unicode 'tweak': !!python/unicode 'Added alternative security uniform + to Security wardrobes.' + - !!python/unicode 'rscadd': !!python/unicode 'Ported Urist cult runes. Down with + the crayon drawings! Example: http://dl.dropbox.com/u/26846767/images/SS13/255_symbols.PNG' + - !!python/unicode 'bugfix': !!python/unicode 'Engineering tape now require engineer + OR atmos access instead of both.' + - !!python/unicode 'rscadd': !!python/unicode 'Implants now will react to EMP, possibly + in !!FUN!! ways' + !!python/unicode 'GauHelldragon': + - !!python/unicode 'rscadd': !!python/unicode 'Servicebots now have RoboTray and + Printing Pen. Robotray can be used to pick up and drop food/drinks. Printing + pen can alternate between writing mode and rename paper mode by clicking it.' + - !!python/unicode 'rscadd': !!python/unicode 'Farmbots. A new type of robot that + weeds, waters and fertilizes. Use robot arm on water tank. Then use plant analyzer, + mini-hoe, bucket and finally proximity sensor.' + - !!python/unicode 'rscadd': !!python/unicode 'Chefs can clang their serving trays + with a rolling pin. Just like a riot shield!' +2013-01-21: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'bugfix': !!python/unicode 'Satchels and ore boxes can now hold + strange rocks.' + - !!python/unicode 'rscadd': !!python/unicode 'Closets and crates can now be built + out of 5 and 10 plasteel respectively.' + - !!python/unicode 'rscadd': !!python/unicode 'Observers can become mice once more.' +2013-01-23: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'tgs': !!python/unicode 'Updated server to tgstation r5200 (November + 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg''s changelog.' +2013-01-31: + !!python/unicode 'CIB': + - !!python/unicode 'bugfix': !!python/unicode 'Chilis and cold chilis no longer + kill in small amounts' + - !!python/unicode 'bugfix': !!python/unicode 'Chloral now again needs around 5 + units to start killing somebody' +2013-02-13: + !!python/unicode 'Erthilo': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed SSD (logged-out) players not + staying asleep.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed set-pose verb and mice emotes + having extra periods.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed virus crate not appearing and + breaking supply shuttle.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed newcaster photos not being + censored.' +2013-02-14: + !!python/unicode 'CIB': + - !!python/unicode 'rscadd': !!python/unicode 'Medical side-effects(patients are + going to come back for secondary treatment)' + - !!python/unicode 'rscadd': !!python/unicode 'NT loyalty setting(affects command + reports and gives antags hints who might collaborate with them)' + - !!python/unicode 'tweak': !!python/unicode 'Simple animal balance fixes(They''re + slower now)' + !!python/unicode 'CaelAislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Re-added old ion storm laws, re-added + grid check event.' + - !!python/unicode 'rscadd': !!python/unicode 'Added Rogue Drone and Vermin Infestation + random events.' + - !!python/unicode 'rscadd': !!python/unicode 'Added/fixed space vines random event.' + - !!python/unicode 'tweak': !!python/unicode 'Updates to the virus events.' + - !!python/unicode 'tweak': !!python/unicode 'Spider infestation and alien infestation + events turned off by default.' + - !!python/unicode 'tweak': !!python/unicode 'Soghun, taj and skrell all have unique + language text colours.' + - !!python/unicode 'tweak': !!python/unicode 'Moderators will no longer be listed + in adminwho, instead use modwho.' + !!python/unicode 'Gamerofthegame': + - !!python/unicode 'rscadd': !!python/unicode 'Miscellaneous mapfixes.' +2013-02-18: + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Security bots will now target hostile + mobs, and vice versa.' + - !!python/unicode 'tweak': !!python/unicode 'Carp should actually emigrate now, + instead of just immigrating then squatting around the outer hull.' + - !!python/unicode 'tweak': !!python/unicode 'Admins and moderators have been split + up into separate ''who'' verbs (adminwho and modwho respectively).' +2013-02-20: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Added new surgery: putting items + inside people. After you use retractor to keep incision open, just click with + any item to put it inside. But be wary, if you try to fit something too big, + you might rip the veins. To remove items, use implant removal surgery.' + - !!python/unicode 'rscadd': !!python/unicode 'Crowbar can be used as alternative + to retractor.' + - !!python/unicode 'rscadd': !!python/unicode 'Can now unload guns by clicking them + in hand.' + - !!python/unicode 'tweak': !!python/unicode 'Fixed distance calculation in bullet + missing chance computation, it was always assuming 1 or 0 tiles. Now distace + REALLY matters when you shoot.' + - !!python/unicode 'rscadd': !!python/unicode 'To add more FUN to previous thing, + bullets missed to not disappear but keep going until they hit something else.' + - !!python/unicode 'bugfix': !!python/unicode 'Compressed Matter and Explosive implants + spawn properly now.' + - !!python/unicode 'tweak': !!python/unicode 'Tweaks to medical effects: removed + itch caused by bandages. Chemical effects now have non-100 chance of appearing, + the stronger medicine, the more probality it''ll have side effects.' +2013-02-22: + !!python/unicode 'Chinsky': + - !!python/unicode 'tweak': !!python/unicode 'Change to body cavity surgery. Can + only put items in chest, groind and head. Max size for item - 3 (chest), 2 (groin), + 1 (head). For chest surgery ribs should be bent open, (lung surgery until second + scalpel step). Surgery step needs preparation step, with drill. After that you + can place item inside, or seal it with cautery to do other step instead.' +2013-02-23: + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'wip': !!python/unicode 'RUST machinery components should now + be researchable (with high requirements) and orderable through QM (with high + cost).' + - !!python/unicode 'wip': !!python/unicode 'Shield machinery should now be researchable + (with high requirements) and orderable through QM (with high cost). This one + is reportedly buggy.' + - !!python/unicode 'tweak': !!python/unicode 'Rogue vending machines should revert + back to normal at the end of the event.' + - !!python/unicode 'rscadd': !!python/unicode 'New Unathi hair styles.' +2013-02-25: + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'As well as building hull shield generators, + normal shield gens can now be built (see http://baystation12.net/forums/viewtopic.php?f=1&t;=6993).' + - !!python/unicode 'rscadd': !!python/unicode 'New random events: multiple new system + wide-events have been have been added to the newscaster feeds, some not quite + as respectable as others.' + - !!python/unicode 'rscadd': !!python/unicode 'New random event: some lucky winners + will win the TC Daily Grand Slam Lotto, while others may be the target of malicious + hackers.' +2013-02-27: + !!python/unicode 'Gamerofthegame': + - !!python/unicode 'rscadd': !!python/unicode 'Added the (base gear) ERT preset + for the debug command.' + - !!python/unicode 'rscadd': !!python/unicode 'Map fixes, Virology hole fixed. Atmospheric + fixes for mining and, to a less extent, the science outpost. (No, not cycling + airlocks)' + - !!python/unicode 'rscadd': !!python/unicode 'Fiddled with the ERT set up location + on Centcom. Radmins will now have a even easier time equiping a team of any + real pratical size, especially coupled with the above debug command.' +2013-03-05: + !!python/unicode 'CIB': + - !!python/unicode 'rscadd': !!python/unicode 'Added internal organs. They''re currently + all located in the chest. Use advanced scanner to detect damage. Use the same + surgery as for ruptured lungs to fix them.' + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'soundadd': !!python/unicode 'Set roundstart music to randomly + choose between space.ogg and traitor.ogg (see http://baystation12.net/forums/viewtopic.php?f=5&t;=6972)' + - !!python/unicode 'experiment': !!python/unicode 'All RUST components except for + TEGs (which generate the power) are now obtainable ingame, bored engineers should + get hold of them and setup an experimental reactor for testing purposes.' +2013-03-06: + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Type 1 thermoelectric generators + and the associated binary circulators are now moveable (wrench to secure/unsecure) + and orderable via Quartermaster.' + - !!python/unicode 'wip': !!python/unicode 'code/maps/rust_test.dmm contains an + example setup for a functional RUST reactor. Maximum output is in the range + of 12 to 20MW (12 to 20 million watts).' + - !!python/unicode 'bugfix': !!python/unicode 'Removed double announcement for gridchecks, + reduced duration of gridchecks.' + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'You can now stab people with syringes + using the "harm" intent. This destroys the syringe and transfers a random percentage + of its contents into the target. Armor has a 50% chance of blocking the syringe.' +2013-03-09: + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'rscadd': !!python/unicode "Beekeeping is now possible. Construct\ + \ an apiary of out wood and embed it into a hydroponics tray, then get a queen\ + \ bee and bottle of BeezEez from cargo bay. \n\t\tHives produce honey and honeycomb,\ + \ but be wary if the bees start swarming." +2013-03-11: + !!python/unicode 'CIB': + - !!python/unicode 'rscadd': !!python/unicode 'Cloning now requires you to put slabs + of meat into the cloning pod to replenish biomass.' + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'wip': !!python/unicode 'The xenoarchaeology update is here. + This includes a major content overhaul and a bunch of new features for xenoarchaeology.' + - !!python/unicode 'tweak': !!python/unicode 'Digsites (strange rock deposits) are + now much more nuanced and interesting, and a huge number of minor (non-artifact) + finds have been added.' + - !!python/unicode 'rscadd': !!python/unicode 'Excavation is now a complex process + that involves digging into the rock to the right depth.' + - !!python/unicode 'rscadd': !!python/unicode 'Chemical analysis is required for + safe excavation of the digsites, in order to determine how best to extract the + finds.' + - !!python/unicode 'bugfix': !!python/unicode 'Anomalous artifacts have been overhauled + and many longstanding bugs with existing effects have been fixed - the anomaly + utiliser should now work much more often.' + - !!python/unicode 'rscadd': !!python/unicode 'Numerous new artifact effects have + been added and some new artifact types can be dug up from the asteroid.' + - !!python/unicode 'rscadd': !!python/unicode 'New tools and equipment have been + added, including normal and spaceworthy versions of the anomaly suits, excavation + tools and other neat gadgets.' + - !!python/unicode 'rscadd': !!python/unicode 'Five books have been written by subject + matter experts from around the galaxy to help the crew of the Exodus come to + grips with this exacting new science (over 3000 words of tutorials!).' + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Sec HUDs now can see short versions + of sec records.on examine. Med HUDs do same for medical records, and can set + medical status of patient.' + - !!python/unicode 'rscadd': !!python/unicode 'Damage to the head can now cause + brain damage.' +2013-03-14: + !!python/unicode 'Spamcat': + - !!python/unicode 'rscadd': !!python/unicode 'Figured I should make one of these. + Syringestabbing now produces a broken syringe complete with fingerprints of + attacker and blood of a victim, so dispose your evidence carefully. Maximum + transfer amount per stab is lowered to 10.' +2013-03-15: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Mapped a compact research base on + the mining asteroid, with multiple labs and testing rooms. It''s reachable through + a new (old) shuttle dock that leaves from the research wing on the main station.' +2013-03-26: + !!python/unicode 'Spamcat': + - !!python/unicode 'bugfix': !!python/unicode 'Chemmaster now puts pills in pill + bottles (if one is inserted).' + - !!python/unicode 'tweak': !!python/unicode 'Stabbing someone with a syringe now + deals 3 damage instead of 7 because 7 is like, a crowbar punch.' + - !!python/unicode 'bugfix': !!python/unicode 'Lizards can now join mid-round again.' + - !!python/unicode 'rscadd': !!python/unicode 'Chemicals in bloodstream will transfer + with blood now, so don''t get drunk before your blood donation. Viruses and + antibodies transfer through blood too.' + - !!python/unicode 'bugfix': !!python/unicode 'Virology is working again.' +2013-03-27: + !!python/unicode 'Asanadas': + - !!python/unicode 'tweak': !!python/unicode 'The Null Rod has recovered its de-culting + ability, for balance reasons. Metagaming with it is a big no-no!' + - !!python/unicode 'rscadd': !!python/unicode 'Holy Water as a liquid is able to + de-cult. Less effective, but less bloody. May be changed over the course of + time for balance.' +2013-04-04: + !!python/unicode 'SkyMarshal': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed ZAS' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed Fire' + !!python/unicode 'Spamcat': + - !!python/unicode 'bugfix': !!python/unicode 'Blood type is now saved in character + creation menu, no need to edit it manually every round.' +2013-04-09: + !!python/unicode 'SkyMarshal': + - !!python/unicode 'bugfix': !!python/unicode 'Fire Issues (Firedoors, Flamethrowers, + Incendiary Grenades) fixed.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed a bad line of code that was + preventing autoignition of flammable gas mixes.' + - !!python/unicode 'bugfix': !!python/unicode 'Volatile fuel is burned up after + a point.' + - !!python/unicode 'rscdel': !!python/unicode 'Partial-tile firedoors removed. This + is due to ZAS breaking when interacting with them.' +2013-04-11: + !!python/unicode 'SkyMarshal': + - !!python/unicode 'experiment': !!python/unicode 'Fire has been reworked.' + - !!python/unicode 'experiment': !!python/unicode 'In-game variable editor is both + readded and expanded with fire controlling capability.' +2013-04-17: + !!python/unicode 'SkyMarshal': + - !!python/unicode 'experiment': !!python/unicode 'ZAS is now more deadly, as per + decision by administrative team. May be tweaked, but currently AIRFLOW is the + biggest griefer.' + - !!python/unicode 'experiment': !!python/unicode 'World startup optimized, many + functions now delayed until a player joins the server. (Reduces server boot + time significantly)' + - !!python/unicode 'tweak': !!python/unicode 'Zones will now equalize air more rapidly.' + - !!python/unicode 'bugfix': !!python/unicode 'ZAS now respects active magboots + when airflow occurs.' + - !!python/unicode 'bugfix': !!python/unicode 'Airflow will no longer throw you + into doors and open them.' + - !!python/unicode 'bugfix': !!python/unicode 'Race condition in zone construction + has been fixed, so zones connect properly at round start.' + - !!python/unicode 'bugfix': !!python/unicode 'Plasma effects readded.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed runtime involving away mission.' +2013-04-24: + !!python/unicode 'Jediluke69': + - !!python/unicode 'rscadd': !!python/unicode 'Added 5 new drinks (Kira Special, + Lemonade, Brown Star, Milkshakes, Rewriter)' + - !!python/unicode 'tweak': !!python/unicode 'Nanopaste now heals about half of + what it used to' + - !!python/unicode 'tweak': !!python/unicode 'Ballistic crates should now come with + shotguns loaded with actual shells no more beanbags' + - !!python/unicode 'bugfix': !!python/unicode 'Iced tea no longer makes a glass + of .what?' + !!python/unicode 'NerdyBoy1104': + - !!python/unicode 'rscadd': !!python/unicode 'New Botany additions: Rice and Plastellium. + New sheet material: Plastic.' + - !!python/unicode 'rscadd': !!python/unicode 'Plastellium is refined into plastic + by first grinding the produce to get plasticide. 20 plasticide + 10 polytrinic + acid makes 10 sheets of plastic which can be used to make crates, forks, spoons, + knives, ashtrays or plastic bags from.' + - !!python/unicode 'rscadd': !!python/unicode 'Rice seeds grows into rice stalks + that you grind to get rice. 10 Rice + 5 Water makes boiled rice, 10 rice + 5 + milk makes rice pudding, 10 rice + 5 universal enzyme (in beaker) makes Sake.' + !!python/unicode 'faux': + - !!python/unicode 'imageadd': !!python/unicode 'Mixed Wardrobe Closet now has colored + shoes and plaid skirts.' + - !!python/unicode 'imageadd': !!python/unicode 'Dress uniforms added to the Captain, + RD, and HoP wardrobe closets. A uniform jacket has also been added to the Captain''s + closet. HoS'' hat has been re-added to their closet. I do not love the CMO and + CE enough to give them anything.' + - !!python/unicode 'imageadd': !!python/unicode 'Atheletic closet now has five different + swimsuits *for the ladies* in them. If you are a guy, be prepared to be yelled + at if you run around like a moron in one of these. Same goes for ladies who + run around in shorts with their titties swaying in the space winds.' + - !!python/unicode 'imageadd': !!python/unicode 'A set of dispatcher uniforms will + spawn in the security closet. These are for playtesting the dispatcher role.' + - !!python/unicode 'imageadd': !!python/unicode 'New suit spawns in the laundry + room. It''s for geezer''s only. You''re welcome, Book.' + - !!python/unicode 'imageadd': !!python/unicode 'Nurse outfit variant, orderly uniform, + and first responder jacket will now spawn in the medical wardrobe closet.' + - !!python/unicode 'imageadd': !!python/unicode 'A white wedding dress will spawn + in the chaplain''s closet. There are also several dresses currently only adminspawnable. + Admins: Look either under "bride" or "dress." The bride one leads to the colored + wedding dresses, and there are some other kinds of dresses under dress.' + - !!python/unicode 'tweak': !!python/unicode 'No more luchador masks or boxing gloves + or boxing ring. You guys have a swimming pool now, dip in and enjoy it.' + - !!python/unicode 'tweak': !!python/unicode 'he meeting hall has been replaced + with an awkwardly placed security office meant for prisoner processing.' + - !!python/unicode 'tweak': !!python/unicode 'Added a couple more welding goggles + to engineering since you guys liked those a lot.' + - !!python/unicode 'imageadd': !!python/unicode 'Flasks spawn behind the bar. Only + three. Don''t fight over them. I don''t know how to add them to the bar vending + machine otherwise I would have done that instead. Detective, you have your own + flask in your office, it''s underneath the cigarettes on your desk.' + - !!python/unicode 'tweak': !!python/unicode 'Added two canes to the medical storage, + for people who have leg injuries and can''t walk good and stuff. I do not want + to see doctors pretending to be House. These are for patients. Do not make me + delete this addition and declare you guys not being able to have nice things.' + - !!python/unicode 'tweak': !!python/unicode 'Secondary entance to EVA now directly + leads into the medbay hardsuit section. Sorry for any inconviences this will + cause. The CMO can now fetch the hardsuits whenever they want.' + - !!python/unicode 'tweak': !!python/unicode 'Secondary security hardsuit has been + added to the armory. Security members please stop stealing engineer''s hardsuits + when you guys want to pair up for space travel.' + - !!python/unicode 'tweak': !!python/unicode 'Firelocks have been moved around in + the main hallways to form really ghetto versions of airlocks.' + - !!python/unicode 'tweak': !!python/unicode 'Violin spawns in theatre storage now. + I didn''t put the piano there though, that was someone else.' + - !!python/unicode 'tweak': !!python/unicode 'Psych office in medbay has been made + better looking.' +2013-05-14: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'experiment': !!python/unicode 'Depth scanners can now be used + to determine what material archaeological deposits are made of, meaning lab + analysis is no longer required.' + - !!python/unicode 'tweak': !!python/unicode 'Some useability issues with xenoarchaeology + tools have been resolved, and the transit pods cycle automatically now.' +2013-05-15: + !!python/unicode 'Spamcat': + - !!python/unicode 'rscadd': !!python/unicode 'Added telescopic + batons to HoS''s and captain''s lockers. These are quite robust and easily + concealable.' +2013-05-21: + !!python/unicode 'SkyMarshal': + - !!python/unicode 'experiment': !!python/unicode '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.' + - !!python/unicode 'experiment': !!python/unicode 'Portable Canisters will now automatically + connect to any portable connecter beneath them on map load.' + - !!python/unicode 'bugfix': !!python/unicode 'Bug involving mis-mapped disposal + junction fixed' + - !!python/unicode 'bugfix': !!python/unicode 'Air alarms now work for atmos techs + (whoops!)' + - !!python/unicode 'bugfix': !!python/unicode 'The Master Controller now properly + stops atmos when it runtimes.' + - !!python/unicode 'bugfix': !!python/unicode 'Backpacks can no longer be contaminated' + - !!python/unicode 'tweak': !!python/unicode 'ZAS no longer logs air statistics.' + - !!python/unicode 'tweak': !!python/unicode '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)' + - !!python/unicode 'tweak': !!python/unicode 'General code cleanup/commenting of + ZAS' + - !!python/unicode 'tweak': !!python/unicode 'Jungle now initializes after the random + Z-level loads and atmos initializes.' +2013-05-25: + !!python/unicode 'Erthilo': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes alien races appearing an unknown + when speaking their language.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes alien races losing their language + when cloned.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes UI getting randomly reset when + trying to change it in Genetics Scanners.' +2013-05-26: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Tentacles! Now clone damage will + make you horribly malformed like examine text says.' + !!python/unicode 'Meyar': + - !!python/unicode 'rscadd': !!python/unicode 'The syndicate shuttle now has a cycling + airlock during Nuke rounds.' + - !!python/unicode 'rscadd': !!python/unicode 'Restored the ability for the syndicate + Agent ID to change the name on the card (reforge it) more than once.' + - !!python/unicode 'rscadd': !!python/unicode 'ERT Radio now functional again.' + - !!python/unicode 'rscadd': !!python/unicode 'Research blast doors now actually + lock down the entirety of station-side Research. ' + - !!python/unicode 'rscadd': !!python/unicode 'Added lock down buttons to the wardens + office. ' + - !!python/unicode 'rscadd': !!python/unicode 'The randomized barsign has made a + return. ' + - !!python/unicode 'rscadd': !!python/unicode 'Syndicate Agent ID''s external airlock + access restored.' + !!python/unicode 'VitrescentTortoise': + - !!python/unicode 'rscadd': !!python/unicode 'Added a third option for not getting + any job preferences. It allows you to return to the lobby instead of joining.' +2013-05-28: + !!python/unicode 'Erthilo': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes everyone being able to understand + alien languages. HERE IS YOUR TOWER OF BABEL' + !!python/unicode 'VitrescentTortoise': + - !!python/unicode 'bugfix': !!python/unicode 'Wizard''s forcewall now works.' +2013-05-30: + !!python/unicode 'Segrain': + - !!python/unicode 'bugfix': !!python/unicode 'Meteor showers actually spawn meteors + now.' + - !!python/unicode 'tweak': !!python/unicode 'Engineering tape fits into toolbelt + and can be placed on doors.' + - !!python/unicode 'rscadd': !!python/unicode 'Pill bottles can hold paper.' + !!python/unicode 'Spamcat': + - !!python/unicode 'tweak': !!python/unicode 'Pill bottle capacity increased to + 14 items.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed Lamarr (it now spawns properly)' + !!python/unicode 'proliberate': + - !!python/unicode 'rscadd': !!python/unicode 'Station time is now displayed in + the status tab for new players and AIs.' +2013-05-31: + !!python/unicode 'Segrain': + - !!python/unicode 'bugfix': !!python/unicode 'Portable canisters now properly connect + to ports beneath them on map load.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed unfastening gas meters.' +2013-06-01: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Bloody footprints! Now stepping in + the puddle will dirty your shoes/feet and make you leave bloody footprints for + a bit.' + - !!python/unicode 'rscadd': !!python/unicode 'Blood now dries up after some time. + Puddles take ~30 minutes, small things 5 minutes.' + - !!python/unicode 'bugfix': !!python/unicode 'Untreated wounds now heal. No more + toe stubs spamming you with pain messages for the rest of the shift.' + - !!python/unicode 'experiment': !!python/unicode 'On the other side, everything + is healed slowly. Maximum you cna squeeze out of first aid is 0.5 health per + tick per organ. Lying down makes it faster too, by 1.5x factor.' + - !!python/unicode 'rscadd': !!python/unicode 'Lids! Click beaker/bottle in hand + to put them on/off. Prevent spilling' + - !!python/unicode 'rscadd': !!python/unicode 'Added ''hailer'' to security lockers. + If used in hand, says "Halt! Security!". For those who can''t run and type.' +2013-06-05: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Load bearing equipment - webbings + and vests for engineers and sec. Attach to jumpsuit, use ''Look in storage'' + verb (object tab) to open.' + !!python/unicode 'Segrain': + - !!python/unicode 'rscadd': !!python/unicode 'Exosuits now can open firelocks by + walking into them.' +2013-06-06: + !!python/unicode 'Asanadas': + - !!python/unicode 'rscadd': !!python/unicode 'Added a whimsical suit to the head + of personnel''s secret clothing locker.' + !!python/unicode 'Meyar': + - !!python/unicode 'bugfix': !!python/unicode 'Disposal''s mail routing fixed. Missing + pipes replaced.' + - !!python/unicode 'bugfix': !!python/unicode 'Chemistry is once again a part of + the disposals delivery circuit. ' + - !!python/unicode 'bugfix': !!python/unicode 'Added missing sorting junctions to + Security and HoS office.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed a duplicate sorting junction.' +2013-06-09: + !!python/unicode 'Segrain': + - !!python/unicode 'bugfix': !!python/unicode 'Emagged supply console can order + SpecOp crates again.' +2013-06-11: + !!python/unicode 'Meyar': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes a security door with a firedoor + ontop of it.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed a typo relating to the admin + Select Equipment Verb. (It''s RESPONSE team not RESCUE team)' + - !!python/unicode 'rscadd': !!python/unicode 'ERT are now automated, from their + spawn to their shuttle. Admin intervention no longer required! (Getting to the + mechs still requires admin permission generally)' + - !!python/unicode 'rscadd': !!python/unicode 'Added flashlights to compensate for + the weakened PDA lights' + - !!python/unicode 'tweak': !!python/unicode 'ERT Uniforms updated to be in line + with Centcom uniforms. No more turtlenecks, no sir. ' +2013-06-12: + !!python/unicode 'Zuhayr': + - !!python/unicode 'rscadd': !!python/unicode 'Added pneumatic cannon and harpoons.' + - !!python/unicode 'experiment': !!python/unicode 'Added embedded projectiles. Bullets + and thrown weapons may stick in targets. Throwing them by hand won''t make them + stick, firing them from a cannon might. Implant removal surgery will get rid + of shrapnel and stuck items.' +2013-06-13: + !!python/unicode 'Kilakk': + - !!python/unicode 'rscadd': !!python/unicode 'Added the Xenobiologist job. Has + access to the research hallway and to xenobiology.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed Xenobiology access from Scientists.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed the Xenobiologist alternate + title from Scientists.' + - !!python/unicode 'rscadd': !!python/unicode 'Added "Xenoarchaeology" to the RD, + Scientists, and to the ID computer.' + - !!python/unicode 'tweak': !!python/unicode 'Changed the Research Outpost doors + to use "Xenoarchaeology" access.' +2013-06-18: + !!python/unicode 'Segrain': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed some bugs in windoor construction.' + - !!python/unicode 'tweak': !!python/unicode 'Secure windoors are made with rods + again.' + - !!python/unicode 'rscadd': !!python/unicode 'Windoors drop their electronics when + broken. Emagged windoors can have theirs removed by crowbar.' + - !!python/unicode 'rscadd': !!python/unicode 'Airlock electronics can be configured + to make door open for any single access on it instead of all of them.' + - !!python/unicode 'rscadd': !!python/unicode 'Cyborgs can preview their icons before + choosing.' +2013-06-21: + !!python/unicode 'Jupotter': + - !!python/unicode 'bugfix': !!python/unicode 'Fix the robotiscist preview in the + char setupe screen' +2013-06-22: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'tweak': !!python/unicode 'The xenoarchaeology depth scanner + will now tell you what energy field is required to safely extract a find.' + - !!python/unicode 'tweak': !!python/unicode 'Excavation picks will now dig faster, + and xenoarchaeology as a whole should be easier to do.' +2013-06-23: + !!python/unicode 'Segrain': + - !!python/unicode 'rscadd': !!python/unicode 'Airlocks of various models can be + constructed again.' + !!python/unicode 'faux': + - !!python/unicode 'experiment': !!python/unicode 'There has been a complete medbay + renovation spearheaded by Vetinarix. http://baystation12.net/forums/viewtopic.php?f=20&t;=7847 + <-- Please put any commentary good or bad, here.' + - !!python/unicode 'tweak': !!python/unicode 'Some maintenance doors within RnD + and Medbay have had their accesses changed. Maintenance doors in the joint areas + (leading to the research shuttle, virology, and xenobiology) are now zero access. + Which means anyone in those joints can enter the maintenance tunnels. This was + done to add additional evacuation locations during radiation storms. Additional + maintenance doors were added to the tunnels in these areas to prevent docs and + scientists from running about.' + - !!python/unicode 'tweak': !!python/unicode 'Starboard emergency storage isn''t + gone now, it''s simply located in the escape wing.' + - !!python/unicode 'experiment': !!python/unicode 'An engineering training room + has been added to engineering. This location was previously where surgery was + located. If you are new to engineering or need to brush up on your skills, please + use this area for testing.' +2013-06-26: + !!python/unicode 'Segrain': + - !!python/unicode 'bugfix': !!python/unicode 'Autopsy scanner properly displays + time of wound infliction and death.' + - !!python/unicode 'bugfix': !!python/unicode 'Autopsy scanner properly displays + wounds by projectile weapons.' + !!python/unicode 'Whitellama': + - !!python/unicode 'bugfix': !!python/unicode 'One-antag rounds (like wizard/ninja) + no longer end automatically upon death' + - !!python/unicode 'wip': !!python/unicode 'Space ninja has been implemented as + a voteable gamemode' + - !!python/unicode 'rscadd': !!python/unicode 'Space ninja spawn landmarks have + been implemented (but not yet placed on the map), still spawn at carps-pawns + instead. (The code will warn you about this and ask you to report it, it''s + a known issue.)' + - !!python/unicode 'rscadd': !!python/unicode 'Five new space ninja directives have + been added, old directives have been reworded to be less harsh' + - !!python/unicode 'wip': !!python/unicode 'Space ninjas have been given their own + list as antagonists, and are no longer bundled up with traitors' + - !!python/unicode 'bugfix': !!python/unicode 'Space ninjas with a "steal a functional + AI" objective will now succeed by downloading one into their suits' + - !!python/unicode 'tweak': !!python/unicode 'Space ninja suits'' exploding on death + has been nerfed, so as not to cause breaches' + - !!python/unicode 'rscadd': !!python/unicode 'A few space ninja titles/names have + been added and removed to be slightly more believable' + - !!python/unicode 'bugfix': !!python/unicode 'The antagonist selector no longer + chooses jobbanned players when it runs out of willing options' +2013-06-27: + !!python/unicode 'Segrain': + - !!python/unicode 'bugfix': !!python/unicode 'ID cards properly setup bloodtype, + DNA and fingerprints again.' +2013-06-28: + !!python/unicode 'Segrain': + - !!python/unicode 'rscadd': !!python/unicode 'AIs are now able to examine what + they see.' +2013-07-03: + !!python/unicode 'Segrain': + - !!python/unicode 'rscadd': !!python/unicode 'Security and medical cyborgs can + use their HUDs to access records.' +2013-07-05: + !!python/unicode 'Spamcat': + - !!python/unicode 'rscadd': !!python/unicode 'Pulse! Humans now have hearbeat rate, + which can be measured by right-clicking someone - Check pulse or by health analyzer. + Medical machinery also has heartbeat monitors. Certain meds and conditions can + influence it.' +2013-07-06: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Humans now can be infected with more + than one virus at once.' + - !!python/unicode 'rscadd': !!python/unicode 'All analyzed viruses are put into + virus DB. You can view it and edit their name and description on medical record + consoles.' + - !!python/unicode 'tweak': !!python/unicode 'Only known viruses (ones in DB) will + be detected by the machinery and HUDs. ' + - !!python/unicode 'rscadd': !!python/unicode 'Viruses cause fever, body temperature + rising the more stage is.' + - !!python/unicode 'bugfix': !!python/unicode 'Humans'' body temperature does not + drift towards room one unless there''s big difference in them.' + - !!python/unicode 'tweak': !!python/unicode 'Virus incubators now can transmit + viuses from dishes to blood sample.' + - !!python/unicode 'rscadd': !!python/unicode 'New machine - centrifuge. It can + isolate antibodies or viruses (spawning virus dish) from a blood sample in vials. + Accepts vials only.' + - !!python/unicode 'rscadd': !!python/unicode 'Fancy vial boxes in virology, one + of them is locked by ID with MD access.' + - !!python/unicode 'tweak': !!python/unicode 'Engineered viruses are now ariborne + too.' +2013-07-11: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Gun delays. All guns now have delays + between shots. Most have less than second, lasercannons and pulse rifles have + around 2 seconds delay. Automatics have zero, click-speed.' +2013-07-26: + !!python/unicode 'Kilakk': + - !!python/unicode 'bugfix': !!python/unicode 'Brig cell timers will no longer start + counting down automatically.' + - !!python/unicode 'tweak': !!python/unicode 'Separated the actual countdown timer + from the timer controls. Pressing "Set" while the timer is counting down will + reset the countdown timer to the time selected.' +2013-07-28: + !!python/unicode 'Segrain': + - !!python/unicode 'rscadd': !!python/unicode 'Camera console circuits can be adjusted + for different networks.' + - !!python/unicode 'rscadd': !!python/unicode 'Nuclear operatives and ERT members + have built-in cameras in their helmets. Activate helmet to initialize it.' +2013-07-30: + !!python/unicode 'Erthilo': + - !!python/unicode 'bugfix': !!python/unicode 'EFTPOS and ATM machines should now + connect to databases.' + - !!python/unicode 'bugfix': !!python/unicode 'Gravitational Catapults can now be + removed from mechs.' + - !!python/unicode 'bugfix': !!python/unicode 'Ghost manifest rune paper naming + now works correctly.' + - !!python/unicode 'bugfix': !!python/unicode 'Fix for newscaster special characters. + Still not recommended.' + !!python/unicode 'Kilakk': + - !!python/unicode 'rscadd': !!python/unicode 'Added colored department radio channels.' +2013-08-01: + !!python/unicode 'Asanadas': + - !!python/unicode 'tweak': !!python/unicode 'The Null Rod has recovered its de-culting + ability, for balance reasons. Metagaming with it is a big no-no!' + - !!python/unicode 'rscadd': !!python/unicode 'Holy Water as a liquid is able to + de-cult. Less effective, but less bloody. May be changed over the course of + time for balance.' + !!python/unicode 'CIB': + - !!python/unicode 'bugfix': !!python/unicode 'Chilis and cold chilis no longer + kill in small amounts' + - !!python/unicode 'bugfix': !!python/unicode 'Chloral now again needs around 5 + units to start killing somebody' + !!python/unicode 'Cael Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Security bots will now target hostile + mobs, and vice versa.' + - !!python/unicode 'tweak': !!python/unicode 'Carp should actually emigrate now, + instead of just immigrating then squatting around the outer hull.' + - !!python/unicode 'tweak': !!python/unicode 'Admins and moderators have been split + up into separate ''who'' verbs (adminwho and modwho respectively).' + !!python/unicode 'CaelAislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Re-added old ion storm laws, re-added + grid check event.' + - !!python/unicode 'rscadd': !!python/unicode 'Added Rogue Drone and Vermin Infestation + random events.' + - !!python/unicode 'rscadd': !!python/unicode 'Added/fixed space vines random event.' + - !!python/unicode 'tweak': !!python/unicode 'Updates to the virus events.' + - !!python/unicode 'tweak': !!python/unicode 'Spider infestation and alien infestation + events turned off by default.' + - !!python/unicode 'tweak': !!python/unicode 'Soghun, taj and skrell all have unique + language text colours.' + - !!python/unicode 'tweak': !!python/unicode 'Moderators will no longer be listed + in adminwho, instead use modwho.' + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'tgs': !!python/unicode 'Updated server to tgstation r5200 (November + 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg''s changelog.' + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Old new medical features:' + - !!python/unicode 'rscadd': !!python/unicode 'Autoinjectors! They come preloaded + with 5u of inapro, can be used instantly, and are one-use. You can replace chems + inside using a syringe. Box of them is added to Medicine closet and medical + supplies crate.' + - !!python/unicode 'rscadd': !!python/unicode 'Splints! Target broken liimb and + click on person to apply. Can be taken off in inventory menu, like handcuffs. + Splinted limbs have less negative effects.' + - !!python/unicode 'rscadd': !!python/unicode 'Advanced medikit! Red and mean, all + doctors spawn with one. Contains better stuff - advanced versions of bandaids + and aloe heal 12 damage on the first use.' + - !!python/unicode 'tweak': !!python/unicode 'Wounds with damage above 50 won''t + heal by themselves even if bandaged/salved. Would have to seek advanced medical + attention for those.' + !!python/unicode 'Erthilo': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed SSD (logged-out) players not + staying asleep.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed set-pose verb and mice emotes + having extra periods.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed virus crate not appearing and + breaking supply shuttle.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed newcaster photos not being + censored.' + !!python/unicode 'Gamerofthegame': + - !!python/unicode 'rscadd': !!python/unicode 'Miscellaneous mapfixes.' + !!python/unicode 'GauHelldragon': + - !!python/unicode 'rscadd': !!python/unicode 'Servicebots now have RoboTray and + Printing Pen. Robotray can be used to pick up and drop food/drinks. Printing + pen can alternate between writing mode and rename paper mode by clicking it.' + - !!python/unicode 'rscadd': !!python/unicode 'Farmbots. A new type of robot that + weeds, waters and fertilizes. Use robot arm on water tank. Then use plant analyzer, + mini-hoe, bucket and finally proximity sensor.' + - !!python/unicode 'rscadd': !!python/unicode 'Chefs can clang their serving trays + with a rolling pin. Just like a riot shield!' + !!python/unicode 'Jediluke69': + - !!python/unicode 'rscadd': !!python/unicode 'Added 5 new drinks (Kira Special, + Lemonade, Brown Star, Milkshakes, Rewriter)' + - !!python/unicode 'tweak': !!python/unicode 'Nanopaste now heals about half of + what it used to' + - !!python/unicode 'tweak': !!python/unicode 'Ballistic crates should now come with + shotguns loaded with actual shells no more beanbags' + - !!python/unicode 'bugfix': !!python/unicode 'Iced tea no longer makes a glass + of .what?' + !!python/unicode 'Jupotter': + - !!python/unicode 'bugfix': !!python/unicode 'Fix the robotiscist preview in the + char setupe screen' + !!python/unicode 'Kilakk': + - !!python/unicode 'rscadd': !!python/unicode 'Added the Xenobiologist job. Has + access to the research hallway and to xenobiology.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed Xenobiology access from Scientists.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed the Xenobiologist alternate + title from Scientists.' + - !!python/unicode 'rscadd': !!python/unicode 'Added "Xenoarchaeology" to the RD, + Scientists, and to the ID computer.' + - !!python/unicode 'tweak': !!python/unicode 'Changed the Research Outpost doors + to use "Xenoarchaeology" access.' + !!python/unicode 'Meyar': + - !!python/unicode 'rscadd': !!python/unicode 'The syndicate shuttle now has a cycling + airlock during Nuke rounds.' + - !!python/unicode 'rscadd': !!python/unicode 'Restored the ability for the syndicate + Agent ID to change the name on the card (reforge it) more than once.' + - !!python/unicode 'rscadd': !!python/unicode 'ERT Radio now functional again.' + - !!python/unicode 'rscadd': !!python/unicode 'Research blast doors now actually + lock down the entirety of station-side Research. ' + - !!python/unicode 'rscadd': !!python/unicode 'Added lock down buttons to the wardens + office. ' + - !!python/unicode 'rscadd': !!python/unicode 'The randomized barsign has made a + return. ' + - !!python/unicode 'rscadd': !!python/unicode 'Syndicate Agent ID''s external airlock + access restored.' + !!python/unicode 'NerdyBoy1104': + - !!python/unicode 'rscadd': !!python/unicode 'New Botany additions: Rice and Plastellium. + New sheet material: Plastic.' + - !!python/unicode 'rscadd': !!python/unicode 'Plastellium is refined into plastic + by first grinding the produce to get plasticide. 20 plasticide + 10 polytrinic + acid makes 10 sheets of plastic which can be used to make crates, forks, spoons, + knives, ashtrays or plastic bags from.' + - !!python/unicode 'rscadd': !!python/unicode 'Rice seeds grows into rice stalks + that you grind to get rice. 10 Rice + 5 Water makes boiled rice, 10 rice + 5 + milk makes rice pudding, 10 rice + 5 universal enzyme (in beaker) makes Sake.' + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'You can now stab people with syringes + using the "harm" intent. This destroys the syringe and transfers a random percentage + of its contents into the target. Armor has a 50% chance of blocking the syringe.' + !!python/unicode 'Segrain': + - !!python/unicode 'bugfix': !!python/unicode 'Meteor showers actually spawn meteors + now.' + - !!python/unicode 'tweak': !!python/unicode 'Engineering tape fits into toolbelt + and can be placed on doors.' + - !!python/unicode 'rscadd': !!python/unicode 'Pill bottles can hold paper.' + !!python/unicode 'SkyMarshal': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed ZAS' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed Fire' + !!python/unicode 'Spamcat': + - !!python/unicode 'rscadd': !!python/unicode 'Figured I should make one of these. + Syringestabbing now produces a broken syringe complete with fingerprints of + attacker and blood of a victim, so dispose your evidence carefully. Maximum + transfer amount per stab is lowered to 10.' + !!python/unicode 'VitrescentTortoise': + - !!python/unicode 'rscadd': !!python/unicode 'Added a third option for not getting + any job preferences. It allows you to return to the lobby instead of joining.' + !!python/unicode 'Whitellama': + - !!python/unicode 'bugfix': !!python/unicode 'One-antag rounds (like wizard/ninja) + no longer end automatically upon death' + - !!python/unicode 'wip': !!python/unicode 'Space ninja has been implemented as + a voteable gamemode' + - !!python/unicode 'rscadd': !!python/unicode 'Space ninja spawn landmarks have + been implemented (but not yet placed on the map), still spawn at carps-pawns + instead. (The code will warn you about this and ask you to report it, it''s + a known issue.)' + - !!python/unicode 'rscadd': !!python/unicode 'Five new space ninja directives have + been added, old directives have been reworded to be less harsh' + - !!python/unicode 'wip': !!python/unicode 'Space ninjas have been given their own + list as antagonists, and are no longer bundled up with traitors' + - !!python/unicode 'bugfix': !!python/unicode 'Space ninjas with a "steal a functional + AI" objective will now succeed by downloading one into their suits' + - !!python/unicode 'tweak': !!python/unicode 'Space ninja suits'' exploding on death + has been nerfed, so as not to cause breaches' + - !!python/unicode 'rscadd': !!python/unicode 'A few space ninja titles/names have + been added and removed to be slightly more believable' + - !!python/unicode 'bugfix': !!python/unicode 'The antagonist selector no longer + chooses jobbanned players when it runs out of willing options' + !!python/unicode 'Zuhayr': + - !!python/unicode 'rscadd': !!python/unicode 'Added pneumatic cannon and harpoons.' + - !!python/unicode 'experiment': !!python/unicode 'Added embedded projectiles. Bullets + and thrown weapons may stick in targets. Throwing them by hand won''t make them + stick, firing them from a cannon might. Implant removal surgery will get rid + of shrapnel and stuck items.' + !!python/unicode 'faux': + - !!python/unicode 'imageadd': !!python/unicode 'Mixed Wardrobe Closet now has colored + shoes and plaid skirts.' + - !!python/unicode 'imageadd': !!python/unicode 'Dress uniforms added to the Captain, + RD, and HoP wardrobe closets. A uniform jacket has also been added to the Captain''s + closet. HoS'' hat has been re-added to their closet. I do not love the CMO and + CE enough to give them anything.' + - !!python/unicode 'imageadd': !!python/unicode 'Atheletic closet now has five different + swimsuits *for the ladies* in them. If you are a guy, be prepared to be yelled + at if you run around like a moron in one of these. Same goes for ladies who + run around in shorts with their titties swaying in the space winds.' + - !!python/unicode 'imageadd': !!python/unicode 'A set of dispatcher uniforms will + spawn in the security closet. These are for playtesting the dispatcher role.' + - !!python/unicode 'imageadd': !!python/unicode 'New suit spawns in the laundry + room. It''s for geezer''s only. You''re welcome, Book.' + - !!python/unicode 'imageadd': !!python/unicode 'Nurse outfit variant, orderly uniform, + and first responder jacket will now spawn in the medical wardrobe closet.' + - !!python/unicode 'imageadd': !!python/unicode 'A white wedding dress will spawn + in the chaplain''s closet. There are also several dresses currently only adminspawnable. + Admins: Look either under "bride" or "dress." The bride one leads to the colored + wedding dresses, and there are some other kinds of dresses under dress.' + - !!python/unicode 'tweak': !!python/unicode 'No more luchador masks or boxing gloves + or boxing ring. You guys have a swimming pool now, dip in and enjoy it.' + - !!python/unicode 'tweak': !!python/unicode 'he meeting hall has been replaced + with an awkwardly placed security office meant for prisoner processing.' + - !!python/unicode 'tweak': !!python/unicode 'Added a couple more welding goggles + to engineering since you guys liked those a lot.' + - !!python/unicode 'imageadd': !!python/unicode 'Flasks spawn behind the bar. Only + three. Don''t fight over them. I don''t know how to add them to the bar vending + machine otherwise I would have done that instead. Detective, you have your own + flask in your office, it''s underneath the cigarettes on your desk.' + - !!python/unicode 'tweak': !!python/unicode 'Added two canes to the medical storage, + for people who have leg injuries and can''t walk good and stuff. I do not want + to see doctors pretending to be House. These are for patients. Do not make me + delete this addition and declare you guys not being able to have nice things.' + - !!python/unicode 'tweak': !!python/unicode 'Secondary entance to EVA now directly + leads into the medbay hardsuit section. Sorry for any inconviences this will + cause. The CMO can now fetch the hardsuits whenever they want.' + - !!python/unicode 'tweak': !!python/unicode 'Secondary security hardsuit has been + added to the armory. Security members please stop stealing engineer''s hardsuits + when you guys want to pair up for space travel.' + - !!python/unicode 'tweak': !!python/unicode 'Firelocks have been moved around in + the main hallways to form really ghetto versions of airlocks.' + - !!python/unicode 'tweak': !!python/unicode 'Violin spawns in theatre storage now. + I didn''t put the piano there though, that was someone else.' + - !!python/unicode 'tweak': !!python/unicode 'Psych office in medbay has been made + better looking.' + !!python/unicode 'proliberate': + - !!python/unicode 'rscadd': !!python/unicode 'Station time is now displayed in + the status tab for new players and AIs.' +2013-08-04: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Health HUD indicator replaced with + Pain indicator. Now health indicator shows pain level instead of actual vitals + level. Some types of damage contribute more to pain, some less, usually feeling + worse than they really are.' +2013-08-08: + !!python/unicode 'Erthilo': + - !!python/unicode 'bugfix': !!python/unicode 'Raise Dead rune now properly heals + and revives dead corpse.' + - !!python/unicode 'bugfix': !!python/unicode 'Admin-only rejuvenate verb now heals + all organs, limbs, and diseases.' + - !!python/unicode 'bugfix': !!python/unicode 'Cyborg sprites now correctly reset + with reset boards. This means cyborg appearances can now be changed without + admin intervention.' +2013-09-18: + !!python/unicode 'Kilakk': + - !!python/unicode 'rscadd': !!python/unicode 'Fax machines! The Captain and IA + agents can use the fax machine to send properly formatted messages to Central + Command.' + - !!python/unicode 'imageadd': !!python/unicode 'Gave the fax machine a fancy animated + sprite. Thanks Cajoes!' +2013-09-24: + !!python/unicode 'Snapshot': + - !!python/unicode 'rscdel': !!python/unicode 'Removed hidden vote counts.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed hiding of vote results.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed OOC muting during votes.' + - !!python/unicode 'rscadd': !!python/unicode 'Crew transfers are no longer callable + during Red and Delta alert.' + - !!python/unicode 'wip': !!python/unicode 'Started work on Auto transfer framework.' +2013-10-06: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Return of dreaded side effects. They + now manifest well after their cause disappears, so curing them should be possible + without them reappearing immediately. They also lost last stage damaging effects.' +2013-10-29: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'Xenoarchaeology''s chemical analysis + and six analysis machines are gone, replaced by a single one which can be beaten + in a minigame.' + - !!python/unicode 'rscadd': !!python/unicode 'Sneaky traitors will find new challenges + to overcome at the research outpost, but may also find new opportunities (transit + tubes can now be traversed).' + - !!python/unicode 'rscadd': !!python/unicode 'Finding active alien machinery should + now be made significantly easier with the Alden-Saraspova counter.' +2013-11-01: + !!python/unicode 'Various': + - !!python/unicode 'rscadd': !!python/unicode 'Autovoting, Get off the station when + your 15 hour workweek is done, thanks unions!' + - !!python/unicode 'rscadd': !!python/unicode 'Some beach props that Chinsky finds + useless.' + - !!python/unicode 'wip': !!python/unicode 'Updated NanoUI' + - !!python/unicode 'rscadd': !!python/unicode 'Dialysis while in sleepers - removes + reagents from mobs, like the chemist, toss him in there!' + - !!python/unicode 'tweak': !!python/unicode 'Pipe Dispensers can now be ordered + by Cargo' + - !!python/unicode 'rscadd': !!python/unicode 'Fancy G-G-G-G-Ghosts!' +2013-11-23: + !!python/unicode 'Ccomp5950': + - !!python/unicode 'bugfix': !!python/unicode 'Players are now no longer able to + commit suicide with a lasertag gun, and will feel silly for doing so.' + - !!python/unicode 'bugfix': !!python/unicode 'Ghosts hit with the cult book shall + now actually become visible.' + - !!python/unicode 'bugfix': !!python/unicode 'The powercells spawned with Exosuits + will now properly be named to not confuse bearded roboticists.' + - !!python/unicode 'bugfix': !!python/unicode 'Blindfolded players will now no longer + require eye surgery to repair their sight, removing the blindfold will be sufficient.' + - !!python/unicode 'rscadd': !!python/unicode 'Atmospheric Technicians will now + have access to Exterior airlocks.' +2013-11-24: + !!python/unicode 'Yinadele': + - !!python/unicode 'experiment': !!python/unicode 'Supermatter engine added! Please + treat your new engine gently, and report any strangeness!' + - !!python/unicode 'tweak': !!python/unicode 'Rebalanced events so people don''t + explode into appendicitis or have their organs constantly explode.' + - !!python/unicode 'rscadd': !!python/unicode 'Vending machines have had bottled + water, iced tea, and grape soda added.' + - !!python/unicode 'rscadd': !!python/unicode 'Head reattachment surgery added! + Sew heads back on proper rather than monkey madness.' + - !!python/unicode 'rscadd': !!python/unicode 'Pain crit rebalanced - Added aim + variance depending on pain levels, nerfed blackscreen severely.' + - !!python/unicode 'rscadd': !!python/unicode 'Cyborg alt titles: Robot, and Android + added! These will make you spawn as a posibrained robot. Please enjoy!' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed the sprite on the modified + welding goggles, added a pair to the CE''s office where they''ll be used.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed atmos computers- They are once + again responsive!' + - !!python/unicode 'tweak': !!python/unicode 'Added in functionality proper for + explosive implants- You can now set their level of detonation, and their effects + are more responsively concrete depending on setting.' + - !!python/unicode 'rscadd': !!python/unicode 'Hemostats re-added to autolathe!' + - !!python/unicode 'rscadd': !!python/unicode 'Added two manuals on atmosia and + EVA, by MagmaRam! Found in engineering and the engineering bookcase.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed areas in medbay to have fully + functional APC sectors.' + - !!python/unicode 'rscadd': !!python/unicode 'Girders are now lasable.' + - !!python/unicode 'experiment': !!python/unicode 'Please wait warmly, new features + planned for next merge!' +2013-12-01: + !!python/unicode 'Various Developers banged their keyboards together:': + - !!python/unicode 'rscadd': !!python/unicode 'New Engine, the supermatter, figure + out what a cooling loop is, or don''t and blow up engineering!' + - !!python/unicode 'rscadd': !!python/unicode 'Each department will have it''s own + fax, make a copy of your butt and fax it to the admins!' + - !!python/unicode 'rscadd': !!python/unicode 'Booze and soda dispensers, they are + like chemmasters, only with booze and soda!' + - !!python/unicode 'rscadd': !!python/unicode 'Bluespace and Cryostasis beakers, + how do they work? Fuggin bluespace how do they work?' + - !!python/unicode 'rscadd': !!python/unicode 'You can now shove things into vending + machines, impress your friends on how things magically disappear out of your + hands into the machine!' + - !!python/unicode 'rscadd': !!python/unicode 'Robots and Androids (And gynoids + too!) can now use custom job titles' + - !!python/unicode 'bugfix': !!python/unicode 'Various bugfixes' +2013-12-18: + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'Mousetraps can now be "hidden" through + the right-click menu. This makes them go under tables, clutter and the like. + The filthy rodents will never see it coming!' + - !!python/unicode 'tweak': !!python/unicode 'Monkeys will no longer move randomly + while being pulled.' +2014-01-01: + !!python/unicode 'Various': + - !!python/unicode 'rscadd': !!python/unicode 'AntagHUD and MedicalHUD for ghosts, + see who the baddies are, check for new configuration options.' + - !!python/unicode 'rscadd': !!python/unicode 'Ghosts will now have bold text if + they are in the same room as the person making conversations easier to follow.' + - !!python/unicode 'rscadd': !!python/unicode 'New hairstyles! Now you can use + something other then hotpink floor length braid.' + - !!python/unicode 'wip': !!python/unicode 'DNA rework, tell us how you were cloned + and became albino!' + - !!python/unicode 'rscadd': !!python/unicode 'Dirty floors, so now you know exactly + how lazy the janitors are!' + - !!python/unicode 'rscadd': !!python/unicode 'A new UI system, feel free to color + it yourself, don''t set it to completely clear or you will have a bad time.' + - !!python/unicode 'rscadd': !!python/unicode 'Cryogenic storage, for all your SSD + needs.' + - !!python/unicode 'rscadd': !!python/unicode 'New hardsuits for those syndicate + tajaran' +2014-02-01: + !!python/unicode 'Various': + - !!python/unicode 'rscadd': !!python/unicode 'NanoUI for PDA' + - !!python/unicode 'rscadd': !!python/unicode 'Write in blood while a ghost in cult + rounds with enough cultists' + - !!python/unicode 'rscadd': !!python/unicode 'Cookies, absurd sandwiches, and even + cookable dioanae nymphs!' + - !!python/unicode 'rscadd': !!python/unicode 'A bunch of new guns and other weapons' + - !!python/unicode 'rscadd': !!python/unicode 'Species specific blood' +2014-02-19: + !!python/unicode 'Aryn': + - !!python/unicode 'experiment': !!python/unicode 'New air model. Nothing should + change to a great degree, but temperature flow might be affected due to closed + connections not sticking around.' +2014-03-01: + !!python/unicode 'Various': + - !!python/unicode 'rscadd': !!python/unicode 'Paint Mixing, red and blue makes + purple!' + - !!python/unicode 'rscadd': !!python/unicode 'New posters to tell you to respect + those darned cat people' + - !!python/unicode 'rscadd': !!python/unicode 'NanoUI for APC''s, Canisters, Tank + Transfer Valves and the heaters / coolers' + - !!python/unicode 'tweak': !!python/unicode 'PDA bombs are now less annoying, and + won''t always blow up / cause internal bleeding' + - !!python/unicode 'tweak': !!python/unicode 'Blob made less deadly' + - !!python/unicode 'rscadd': !!python/unicode 'Objectiveless Antags now a configuration + option, choose your own adventure!' + - !!python/unicode 'wip': !!python/unicode 'Engineering redesign, now with better + monitoring of the explodium supermatter!' + - !!python/unicode 'rscadd': !!python/unicode 'Security EOD' + - !!python/unicode 'rscadd': !!python/unicode 'New playable race, IPC''s, go beep + boop boop all over the station!' + - !!python/unicode 'rscadd': !!python/unicode 'Gamemode autovoting, now players + don''t have to call for gamemode votes, it''s automatic!' +2014-03-05: + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'Smartfridges added to the bar, chemistry + and virology. No more clutter!' + - !!python/unicode 'rscadd': !!python/unicode 'A certain musical instrument has + returned to the bar.' + - !!python/unicode 'rscadd': !!python/unicode 'There is now a ten second delay between + ingesting a pill/donut/milkshake and regretting it.' +2014-03-10: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Viruses now affect certain range + of species, different for each virus' + - !!python/unicode 'tweak': !!python/unicode 'Spaceacilline now prevents infection, + and has a small chance to cure viruses at Stage 1. It does not give them antibodies + though, so they can get sick again!' + - !!python/unicode 'tweak': !!python/unicode 'Biosuits and spacesuits now offer + more protection against viruses. Full biosuit competely prevents airborne infection, + when coupled with gloves they both protect quite well from contact ones' + - !!python/unicode 'rscadd': !!python/unicode 'Sneezing now spreads viruses in front + of mob. Sometimes he gets a warning beforehand though' +2014-03-30: + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'Inflatable walls and doors added. + Useful for sealing off hull breaches, but easily punctured by sharp objects + and Tajarans.' +2014-04-06: + !!python/unicode 'RavingManiac': + - !!python/unicode 'tweak': !!python/unicode 'Tape recorders and station-bounced + radios now work inside containers and closets.' +2014-04-11: + !!python/unicode 'Jarcolr': + - !!python/unicode 'rscadd': !!python/unicode 'You can now flip coins like a D2' + - !!python/unicode 'tweak': !!python/unicode 'Miscellaneous cargo crates got a tiny + buff, Standard Costume crate is now Costume Crate' + - !!python/unicode 'tweak': !!python/unicode 'Grammar patch,telekinesis/amputated + arm exploit fixes,more in the future' + - !!python/unicode 'tweak': !!python/unicode 'Grille kicking now does less damage' + - !!python/unicode 'tweak': !!python/unicode 'TELESCOPIC baton no longer knocks + anybody down,still got a lot of force though' + - !!python/unicode 'tweak': !!python/unicode 'Other small-ish changes and fixes + that aren''t worth mentioning' +2014-04-25: + !!python/unicode 'Various': + - !!python/unicode 'rscadd': !!python/unicode 'Overhauled saycode, you can now use + languages over the radio.' + - !!python/unicode 'rscadd': !!python/unicode 'Chamelon items beyond just the suit.' + - !!python/unicode 'rscadd': !!python/unicode 'NanoUI Virology' + - !!python/unicode 'rscadd': !!python/unicode '3D Sounds' + - !!python/unicode 'rscadd': !!python/unicode 'AI Channel color for when they want + to be all sneaky' + - !!python/unicode 'rscadd': !!python/unicode 'New inflatable walls and airlocks + for your breach sealing pleasure.' + - !!python/unicode 'rscadd': !!python/unicode 'Carbon Copy papers, so you can subject + everyone to your authority and paperwork, but mainly paperwork' + - !!python/unicode 'rscadd': !!python/unicode 'Undershirts and rolling down jumpsuits' + - !!python/unicode 'rscadd': !!python/unicode 'Insta-hit tasers, can be shot through + glass as well.' + - !!python/unicode 'rscadd': !!python/unicode 'Changeling balances, an emphasis + put more on stealth.' + - !!python/unicode 'rscdel': !!python/unicode 'Genetics disabled' + - !!python/unicode 'rscdel': !!python/unicode 'Telescience removed, might be added + again when we come up with a less math headache enducing version of it.' + - !!python/unicode 'bugfix': !!python/unicode 'Bugfixes galore!' +2014-04-29: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'rscadd': !!python/unicode 'Webbing vest storage can now be accessed + by clicking on the item in inventory' + - !!python/unicode 'rscadd': !!python/unicode 'Holsters can be accessed by clicking + on them in inventory' + - !!python/unicode 'rscadd': !!python/unicode 'Webbings and other suit attachments + are now visible on the icon in inventory' + - !!python/unicode 'tweak': !!python/unicode 'Removing jumpsuits now requires drag + and drop to prevent accidental undressing' + - !!python/unicode 'rscadd': !!python/unicode 'Added an action icon for magboots + that can be used to toggle them similar to flashlights' + - !!python/unicode 'rscadd': !!python/unicode 'Fuel tanks now spill fuel when wrenched + open' +2014-05-03: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode "Coming out of nowhere the past few\ + \ months, the Garland Corporation has made headlines with a new prehistoric\ + \ theme park delighting travellers with species thought extinct. Now available\ + \ for research stations everywhere is the technology that made it all possible!\ + \ Features include:
          \n\t\t\t- 13 discoverable prehistoric species to clone\ + \ from fossils (including 5 brand new ones).
          \n\t\t\t- 11 discoverable prehistoric\ + \ plants to clone from fossils (including 9 brand new ones).
          \n\t\t\t- New\ + \ minigame that involves correctly ordering the genomes inside each genetic\ + \ sequence to unlock an animal/plant.
          \n\t\t\t- Some prehistoric animals\ + \ and plants may seem strangely familiar... while others may bring more than\ + \ the erstwhile scientist bargains for.
          \n




          " +2014-05-06: + !!python/unicode 'Hubble': + - !!python/unicode 'rscadd': !!python/unicode 'Clip papers together by hitting a + paper with a paper or photo' + - !!python/unicode 'imageadd': !!python/unicode 'Adds icons for copied stamps' +2014-05-16: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'rscadd': !!python/unicode 'Silicon mob types (AI, cyborgs, PAI) + can now speak certain species languages depending on type and module' + - !!python/unicode 'rscadd': !!python/unicode 'Languages can now be whispered when + using the language code with either the whisper verb or the whisper speech code' +2014-05-23: + !!python/unicode 'Hubble': + - !!python/unicode 'rscadd': !!python/unicode 'Personal lockers are now resettable' + - !!python/unicode 'rscadd': !!python/unicode 'Take off people''s accessories or + change their sensors in the drag and drop-interface' + - !!python/unicode 'rscadd': !!python/unicode 'Merge paper bundles by hitting one + with another' + - !!python/unicode 'tweak': !!python/unicode 'Line breaks in Security, Medical and + Employment Records' + - !!python/unicode 'tweak': !!python/unicode 'Record printouts will have names on + it' + - !!python/unicode 'tweak': !!python/unicode 'Set other people''s internals in belt + and suit storage slots' + - !!python/unicode 'bugfix': !!python/unicode 'No longer changing suit sensors while + cuffed' + - !!python/unicode 'bugfix': !!python/unicode 'No longer emptying other people''s + pockets when they are not full yet' +2014-05-28: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Adds few new paperBBcode tags, to + make up for HTML removal.' + - !!python/unicode 'rscadd': !!python/unicode '[logo] tag draws NT logo image (one + from wiki).' + - !!python/unicode 'rscadd': !!python/unicode '[table] [/table] tags mark borders + of tables. [grid] [/grid] are borderless tables, useful of making layouts. Inside + tables following tags are used: [row] marks beginning of new table row, [cell] + - beginning of new table cell.' +2014-05-31: + !!python/unicode 'Jarcolr': + - !!python/unicode 'rscadd': !!python/unicode '21 New cargo crates, go check them + out!' + - !!python/unicode 'rscadd': !!python/unicode 'Peanuts have now been added, food + items are now being developed.' + - !!python/unicode 'rscadd': !!python/unicode '2 new cargo groups, Miscellaneous + and Supply.' + - !!python/unicode 'rscadd': !!python/unicode 'Sugarcane seeds can now be gotten + from the seed dispenser.' + - !!python/unicode 'rscadd': !!python/unicode '5 new satchels when selecting "satchel" + for RD, scientist, botanist, virologist, geneticist (disabled) and chemist.' + - !!python/unicode 'rscadd': !!python/unicode 'Clicking on a player with a paper/book + when you have the eyes selected shows them the book/paper forcefully.' +2014-06-03: + !!python/unicode 'Hubblenaut': + - !!python/unicode 'rscadd': !!python/unicode 'Added wheelchairs' + - !!python/unicode 'tweak': !!python/unicode 'Replaced stool in Medical Examination + with wheelchair' + - !!python/unicode 'tweak': !!python/unicode 'Using a fire-extinguisher to propel + you on a chair can have consequences (drive into walls and people, do it!)' +2014-06-13: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'rscadd': !!python/unicode 'Added docking ports for shuttles' + - !!python/unicode 'rscadd': !!python/unicode 'Shuttle airlocks will automatically + open and close, preventing people from being sucked into space by because someone + on another z-level called a shuttle' + - !!python/unicode 'rscadd': !!python/unicode 'Some docking ports can also double + as airlocks' + - !!python/unicode 'rscadd': !!python/unicode 'Docking ports can be overriden to + prevent any automatic action. Shuttles will wait for players to open/close doors + manually' + - !!python/unicode 'rscadd': !!python/unicode 'Shuttles can be forced launched, + which will make them not wait for airlocks to be properly closed' +2014-06-15: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'bugfix': !!python/unicode 'Fixed wound autohealing regardless + of damage amount. The appropriate wound will now be assigned correctly based + on damage amount and type' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed several other bugs related + wounds that resulted in damage magically disappearing' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed various sharp objects not being + counted as sharp, bullets in particular' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed armour providing more protection + from bullets than it was supposed to' +2014-06-19: + !!python/unicode 'Chinsky': + - !!python/unicode 'rscadd': !!python/unicode 'Adds guest terminals on the map. + These wall terminals let anyone issue temporary IDs. Only access that issuer + has can be granted, and maximum time pass can be issued for is 20 minutes. All + operations are logged in terminals.' +2014-06-20: + !!python/unicode 'Cael_Aislinn': + - !!python/unicode 'rscadd': !!python/unicode 'New discoverable items added to xenoarchaeology, + and new features for some existing ones. Artifact harvesters can now harvest + the secondary effect of artifacts as well as the primary one.
          + +
          ' + - !!python/unicode 'tweak': !!python/unicode 'Artifact utilisers should be much + nicer/easier to use now.
          + +
        • Alden-Saraspova counters and talking items should work properly + now.
          + +
        • + +
          ' +2014-07-01: + !!python/unicode 'Various': + - !!python/unicode 'experiment': !!python/unicode 'Hardsuit breaching.' + - !!python/unicode 'experiment': !!python/unicode 'Rewritten fire.' + - !!python/unicode 'experiment': !!python/unicode 'Supermatter now glows and sucks + things into it as it approaches criticality.' + - !!python/unicode 'rscadd': !!python/unicode 'Station Vox (Vox pariahs) are now + available.' + - !!python/unicode 'rscadd': !!python/unicode 'Wheelchairs.' + - !!python/unicode 'rscadd': !!python/unicode 'Cargo Trains.' + - !!python/unicode 'rscadd': !!python/unicode 'Hardsuit cycler machinery.' + - !!python/unicode 'rscadd': !!python/unicode 'Rewritten lighting (coloured lights!)' + - !!python/unicode 'rscadd': !!python/unicode 'New Mining machinery and rewritten + smelting.' + - !!python/unicode 'rscadd': !!python/unicode 'Rewritten autolathe' + - !!python/unicode 'rscadd': !!python/unicode 'Mutiny mode.' + - !!python/unicode 'rscadd': !!python/unicode 'NanoUI airlock and docking controllers.' + - !!python/unicode 'rscadd': !!python/unicode 'Completely rewritten shuttle code.' + - !!python/unicode 'rscadd': !!python/unicode 'Derelict Z-level replacement: construction + site.' + - !!python/unicode 'rscadd': !!python/unicode 'Computer3 laptops.' + - !!python/unicode 'rscadd': !!python/unicode 'Constructable SMES units.' + - !!python/unicode 'rscadd': !!python/unicode 'Omni-directional atmos machinery.' + - !!python/unicode 'rscadd': !!python/unicode 'Climbable tables and crates.' + - !!python/unicode 'rscadd': !!python/unicode 'Xenoflora added to Science.' + - !!python/unicode 'rscadd': !!python/unicode 'Utensils can be used to eat food.' + - !!python/unicode 'rscadd': !!python/unicode 'Decks of cards are now around the + station.' + - !!python/unicode 'rscadd': !!python/unicode 'Service robots can speak languages.' + - !!python/unicode 'wip': !!python/unicode 'Xenoarch updates and fixes.' + - !!python/unicode 'tweak': !!python/unicode 'Rewritten species-specific gear icon + handling.' + - !!python/unicode 'tweak': !!python/unicode 'Cats and borers can be picked up.' + - !!python/unicode 'tweak': !!python/unicode 'Botanist renamed to Gardener.' + - !!python/unicode 'tweak': !!python/unicode 'Hydroponics merged with the Kitchen.' + - !!python/unicode 'tweak': !!python/unicode 'Latejoin spawn points (Arrivals, Cryostorage, + Gateway).' + - !!python/unicode 'rscadd': !!python/unicode 'Escape pods only launch automatically + during emergency evacuations' + - !!python/unicode 'rscadd': !!python/unicode 'Escape pods can be made to launch + during regular crew transfers using the control panel inside the pod, or by + emagging the panel outside the pod' + - !!python/unicode 'rscadd': !!python/unicode 'When swiped or emagged, the crew + transfer shuttle can be delayed in addition to being launched early' +2014-07-06: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'rscadd': !!python/unicode 'Re-enabled and rewrote the wound + infection system' + - !!python/unicode 'rscadd': !!python/unicode 'Infections can be prevented by properly + bandaging and salving wounds' + - !!python/unicode 'rscadd': !!python/unicode 'Infections are cured by spaceacillin' +2014-07-20: + !!python/unicode 'PsiOmegaDelta': + - !!python/unicode 'rscadd': !!python/unicode 'AI can now store up to five camera + locations and return to them when desired.' + - !!python/unicode 'rscadd': !!python/unicode 'AI can now alt+left click turfs in + camera view to list and interact with the objects.' + - !!python/unicode 'rscadd': !!python/unicode 'AI can now ctrl+click turret controls + to enable/disable turrets.' + - !!python/unicode 'rscadd': !!python/unicode 'AI can now alt+click turret controls + to toggle stun/lethal mode.' + - !!python/unicode 'rscadd': !!python/unicode 'AI can now select which channel to + state laws on.' +2014-07-26: + !!python/unicode 'Whitellama': + - !!python/unicode 'rscadd': !!python/unicode 'Added dynamic flavour text.' + - !!python/unicode 'bugfix': !!python/unicode 'Fixed bug with suit fibers and fingerprints.' +2014-07-31: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'tweak': !!python/unicode 'Stun batons now work like tasers and + deal agony instead of stun' + - !!python/unicode 'rscadd': !!python/unicode 'Being hit in the hands with a stun + weapon will cause whatever is being held to be dropped' + - !!python/unicode 'tweak': !!python/unicode 'Handcuffs now require an aggressive + grab to be used' +2014-08-02: + !!python/unicode 'Whitellama': + - !!python/unicode 'bugfix': !!python/unicode 'Arcane tomes can now be stored on + bookshelves.' + - !!python/unicode 'bugfix': !!python/unicode 'Dionaea players no longer crash on + death, and now become nymphs properly.' +2014-08-05: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'tweak': !!python/unicode 'Atmos Rewrite. Many atmos devices + now use power according to their load and gas physics' + - !!python/unicode 'rscadd': !!python/unicode 'Pressure regulator device. Replaces + the passive gate and can regulate input or output pressure' + - !!python/unicode 'rscadd': !!python/unicode 'Gas heaters and gas coolers are now + constructable and can be upgraded with parts from research' + - !!python/unicode 'bugfix': !!python/unicode 'Fixes recharger and cell charger + power draw. Rechargers draw 15 kW, wall chargers draw 25 kW, and heavy-duty + cell chargers draw 40 kW. Cyborg charging stations draw 75 kW.' + - !!python/unicode 'bugfix': !!python/unicode 'Laptops, and various other machines, + now draw more reasonable amounts of power' + - !!python/unicode 'bugfix': !!python/unicode 'Machines will periodically update + their powered status if moved from a powered to an unpowered area and vice versa' +2014-08-27: + !!python/unicode 'Whitellama': + - !!python/unicode 'bugfix': !!python/unicode 'Made destination taggers more intuitive + so you know when you''ve tagged something' + - !!python/unicode 'rscadd': !!python/unicode 'Ported package label and tag sprites' + - !!python/unicode 'rscadd': !!python/unicode 'Ported using a pen on a package to + give it a title, or to write a note' + - !!python/unicode 'rscadd': !!python/unicode 'Donut boxes and egg boxes can be + constructed out of cardboard' +2014-08-31: + !!python/unicode 'Whitellama': + - !!python/unicode 'bugfix': !!python/unicode 'Matches and candles can be used to + burn papers, too.' + - !!python/unicode 'bugfix': !!python/unicode 'Observers have a bit more time (20 + seconds, instead of 7.5) before the Diona join prompt disappears.' +2014-09-05: + !!python/unicode 'RavingManiac': + - !!python/unicode 'experiment': !!python/unicode 'NewPipe implemented: Supply and + scrubber pipes can be run in parallel without connecting to each other.' + - !!python/unicode 'rscadd': !!python/unicode 'Supply pipes will only connect to + supply pipes, vents and Universal Pipe Adapters(UPAs).' + - !!python/unicode 'rscadd': !!python/unicode 'Scrubber pipes will only connect + to scrubber pipes, scrubbers and UPAs.' + - !!python/unicode 'rscadd': !!python/unicode 'UPAs will connect to regular, scrubber + and supply pipes.' +2014-09-20: + !!python/unicode 'HarpyEagle': + - !!python/unicode 'bugfix': !!python/unicode 'Fixes evidence bags and boxes eating + each other. Evidence bags now store items by dragging the bag onto the item + to be stored.' +2014-09-28: + !!python/unicode 'Gamerofthegame': + - !!python/unicode 'rscadd': !!python/unicode 'Hoverpods fully supported, currently + orderable from cargo. Two slots, three cargo, space flight and a working mech + for all other intents and purposes.' + - !!python/unicode 'rscadd': !!python/unicode 'Added the Rigged laser and Passenger + Compartment equipment. The rigged laser is a weapon for working exosuits - just + a ordinary laser, but with triple the cool down and rather power inefficient. + The passenger compartment allows other people to board and hitch a ride on the + mech - such as in fire rescue or for space flight.' + !!python/unicode 'Zuhayr': + - !!python/unicode 'rscadd': !!python/unicode 'Organs can now be removed and transplanted.' + - !!python/unicode 'tweak': !!python/unicode 'Brain surgery is now the same as chest + surgery regarding the steps leading up to it.' + - !!python/unicode 'tweak': !!python/unicode 'Appendix and kidney now share the + groin and removing the first will prevent appendicitis.' + - !!python/unicode 'tweak': !!python/unicode 'Lots of backend surgery/organ stuff, + see the PR if you need to know.' +2014-10-01: + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'Zooming with the sniper rifle now + adds a view offset in the direction you are facing.' + - !!python/unicode 'rscadd': !!python/unicode 'Added binoculars - functionally similar + to sniper scope. Adminspawn-only for now.' + - !!python/unicode 'rscadd': !!python/unicode 'Bottles from chemistry now, like + beakers, use chemical overlays instead of fixed sprites.' + - !!python/unicode 'rscadd': !!python/unicode 'Being in space while not magbooted + to something will cause your sprite to bob up and down.' + !!python/unicode 'Zuhayr': + - !!python/unicode 'rscadd': !!python/unicode 'Added species organ checks to several + areas (phoron burn, welder burn, appendicitis, vox cortical stacks, flashes).' + - !!python/unicode 'rscadd': !!python/unicode 'Added VV option to add or remove + organs.' + - !!python/unicode 'rscadd': !!python/unicode 'Added simple bioprinter (adminspawn).' + - !!python/unicode 'rscadd': !!python/unicode 'Added smashing/slashing behavior + from xenos to some unarmed attacks.' + - !!python/unicode 'rscadd': !!python/unicode 'Added some new state icons for diona + nymphs.' + - !!python/unicode 'rscadd': !!python/unicode 'Added borer husk functionality (cortical + borers can turn dead humans into zombies).' + - !!python/unicode 'rscadd': !!python/unicode 'Added tackle verb.' + - !!python/unicode 'rscadd': !!python/unicode 'Added NO_SLIP.' + - !!python/unicode 'rscadd': !!python/unicode 'Added species-specific orans to Dionaea, + new Xenomorphs and vox.' + - !!python/unicode 'rscadd': !!python/unicode 'Added colour and species to blood + data.' + - !!python/unicode 'rscadd': !!python/unicode 'Added lethal consequences to missing + your heart.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed robot_talk_understand and + alien_talk_understand.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed attack_alien() and several + flavours of is_alien() procs.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed /mob/living/carbon/alien/humanoid.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed alien_hud().' + - !!python/unicode 'rscdel': !!python/unicode 'Removed IS_SLOW, NEEDS_LIGHT and + RAD_ABSORB.' + - !!python/unicode 'rscdel': !!python/unicode 'Renamed is_larva() to is_alien().' + - !!python/unicode 'tweak': !!python/unicode 'Refactored a ton of files, either + condensing or expanding them, or moving them to new directories.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored some attack vars from simple_animal + to mob/living level.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored internal organs to /mob/living/carbon + level.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored rad and light absorbtion + to organ level.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored brains to /obj/item/organ/brain.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored a lot of blood splattering + to use blood_splatter() proc.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored broadcast languages (changeling + and alien hiveminds, drone and binary chat) to actual languages.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored xenomorph abilities to + work for humans.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored xenomorphs into human species.' + - !!python/unicode 'tweak': !!python/unicode 'Rewrote larva_hud() and human_hud(). + The latter now takes data from the species datum.' + - !!python/unicode 'tweak': !!python/unicode 'Rewrote diona nymphs as descendents + of /mob/living/carbon/alien.' + - !!python/unicode 'tweak': !!python/unicode 'Rewrote xenolarva as descendents of + /mob/living/carbon/alien.' + - !!python/unicode 'tweak': !!python/unicode 'Rewrote /mob/living/carbon/alien.' + - !!python/unicode 'tweak': !!python/unicode 'Moved alcohol and toxin processing + to the liver.' + - !!python/unicode 'tweak': !!python/unicode 'Moved drone light proc to robot level, + added integrated_light_power and local_transmit vars to robots.' + - !!python/unicode 'tweak': !!python/unicode 'Moved human brainloss onto the brain + organ.' + - !!python/unicode 'tweak': !!python/unicode 'Shuffled around and collapsed several + redundant procs down to carbon level (hide, ventcrawl, Bump).' + - !!python/unicode 'tweak': !!python/unicode 'Fixed species swaps from NO_BLOOD + to those with blood killing the subject instantly.' +2014-11-01: + !!python/unicode 'PsiOmegaDelta': + - !!python/unicode 'bugfix': !!python/unicode 'Adds the last missing step to deconstruct + fire alarms. Apply wirecutters.' + - !!python/unicode 'rscadd': !!python/unicode 'There''s a "new" mining outpost nearby + the Research outpost.' + - !!python/unicode 'rscadd': !!python/unicode 'Manifest ghosts now have spookier + names.' + - !!python/unicode 'rscadd': !!python/unicode 'Adds a gas monitor computer for the + toxin mixing chamber.' + - !!python/unicode 'rscadd': !!python/unicode 'AI can now change the display of + individual AI status screens.' + - !!python/unicode 'rscadd': !!python/unicode 'More ion laws..' + - !!python/unicode 'rscadd': !!python/unicode 'All turrets have been replaced with + portable variants. Potential targets can be configured on a per turret basis.' + - !!python/unicode 'bugfix': !!python/unicode 'Improved crew monitor map positioning.' + - !!python/unicode 'rscadd': !!python/unicode 'Can now order plastic, body-, and + statis bags from cargo' + - !!python/unicode 'rscadd': !!python/unicode 'PDAs now receive newscasts.' + - !!python/unicode 'rscadd': !!python/unicode '(De)constructable emergency shutters.' + - !!python/unicode 'rscadd': !!python/unicode 'Borgs can now select to simply state + their laws or select a radio channel, same as the AI.' +2014-11-04: + !!python/unicode 'TwistedAkai': + - !!python/unicode 'rscadd': !!python/unicode 'Almost any window which has been + fully unsecured can now be dismantled with a wrench.' +2014-11-08: + !!python/unicode 'PsiOmegaDelta': + - !!python/unicode 'rscadd': !!python/unicode 'Service personnel now have their + own frequency to communicate over. Use "say :v".' + - !!python/unicode 'rscadd': !!python/unicode 'The AI can now has proper quick access + to its private channel. Use "say :o".' + - !!python/unicode 'rscadd': !!python/unicode 'Newscasters supports photo captions. + Simply pen one on the attached photo.' + - !!python/unicode 'rscadd': !!python/unicode 'Once made visible by a cultist ghosts + can toggle visiblity at will.' + - !!python/unicode 'rscadd': !!python/unicode 'Detonating cyborgs using the cyborg + monitor console now notifies the master AI, if any.' + - !!python/unicode 'rscadd': !!python/unicode 'More machinery, such as APCs, air + alarms, etc., now support attaching signalers to the wires.' + - !!python/unicode 'tweak': !!python/unicode 'Random event overhaul. Admins may + wish check the verb "Event Manager Panel".' +2014-11-22: + !!python/unicode 'Zuhayr': + - !!python/unicode 'rscadd': !!python/unicode 'Added the /obj/item/weapon/rig class + - back-mounted deployable hardsuits.' + - !!python/unicode 'rscadd': !!python/unicode 'Replaced existing hardsuits with + ''voidsuits'', functionally identical.' + - !!python/unicode 'rscdel': !!python/unicode 'Removed the mounted device and helmet/boot + procs from voidsuits.' + - !!python/unicode 'tweak': !!python/unicode 'Refactored a shit-ton of ninja code + into the new rig class.' + - !!python/unicode 'wip': !!python/unicode 'This is more than likely going to take + a lot of balancing to get into a good place.' +2015-01-09: + !!python/unicode 'Zuhayr': + - !!python/unicode 'tweak': !!python/unicode 'Voice changers no longer use ID cards. + They have Toggle and Set Voice verbs on the actual mask object now.' + - !!python/unicode 'rscadd': !!python/unicode 'Readded moonwalking. Alt-dir to face + new dir, or Face-Direction verb to face current dir.' +2015-02-04: + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'Holodeck is now bigger and better, + with toggleable gravity and a new courtroom setting' + !!python/unicode 'TwistedAkai': + - !!python/unicode 'bugfix': !!python/unicode 'Purple Combs should now be visible + and have their proper icon' +2015-02-12: + !!python/unicode 'Daranz': + - !!python/unicode 'rscadd': !!python/unicode 'Vending machines now use NanoUI and + accept cash. The vendor account can now be suspended to disable all sales in + all machines on station.' +2015-02-16: + !!python/unicode 'RavingManiac': + - !!python/unicode 'rscadd': !!python/unicode 'Say hello to the new Thermoelectric + Supermatter Engine. Read the operating manual to get started.' +2015-02-18: + !!python/unicode 'PsiOmegaDelta': + - !!python/unicode 'rscadd': !!python/unicode 'Synths now have timestamped radio + and chat messages.' + - !!python/unicode 'rscadd': !!python/unicode 'New and updated uplink items.' + - !!python/unicode 'rscadd': !!python/unicode 'Multiple AIs can now share the same + holopad.' + - !!python/unicode 'rscadd': !!python/unicode 'The AI now has built-in consoles, + accessible from the subsystem tab.' +2015-02-24: + !!python/unicode 'Zuhayr': + - !!python/unicode 'experiment': !!python/unicode 'Major changes to the kitchen + and hydroponics mechanics. Review the detailed changelog here,' +2015-04-07: + !!python/unicode 'RavingManiac': + - !!python/unicode 'tweak': !!python/unicode 'You can now pay vending machines and + EFTPOS scanners without removing your ID from your PDA or wallet. Clicking on + the vending machine with your ID/PDA/wallet/cash also brings up the menu now + instead of attacking the vending machine.' +2015-04-18: + PsiOmegaDelta: + - rscadd: Added a changelog editing system that should cause fewer conflicts and + more accurate timestamps. +2015-04-23: + Dennok: + - rscadd: Added an automatic pipelayer. + - rscadd: Added an automatic cablelayer. + PsiOmegaDelta: + - bugfix: Shower curtains no longer lose their default color upon being washed. + - bugfix: Emergency shutters can again be examined, and from the proper distance. + - bugfix: The virus event will now only infect mobs on the station, currently controlled + by player that has been active in the last 5 minutes. + - bugfix: Laptops now use the proper proc for checking camera status. + - rscadd: Makes it possible to eject PDA cartridges using a verb. + - rscadd: Makes it possible to shake tables with one's bare hands to stop climbers. + - bugfix: Added a mass driver door in disposals to prevent trash from floating out + into space before proper ejection. + - rscadd: Rig/Hardsuit module tab - Less informative than the NanoUI hardsuit interface + but allows quicker access to the various rig modules. + - rscadd: Silicons with the medical augmentation sensors enabled now also see alive/dead + status if sensors are set accordingly. + - rscadd: Emergency shutters opened by silicons are now treated as having been forced + open by a crowbar. + - rscadd: An active AI chassis can now be pushed, just as an empty chassis can be. + - rscadd: The AI can now use the crew monitor console to track crew members with + full sensors enabled. + - rscadd: The AI now has a shortcut to track people holding up messages to cameras. + - rscadd: The AI now has a shortcut to track people sending PDA messages. + - rscadd: Multiple AIs can now share the same holopad. + - rscadd: Admin ghosts can now transfer other ghosts into mobs by drag-clicking. + - rscadd: Ghosts can now toggle seeing darkness and other ghosts separately. + - rscadd: Moving while dead now auto-ghosts you. + - rscadd: 'Two new random events: Space dust and gravitation failure.' + - rscadd: Upgraded wizard spell interface and new spells. + - rscadd: More uplink items. + - rscadd: Uplink items now have rudimentary descriptions. + Yoshax: + - tweak: Adjusts fruits and other stuff to have a minmum of 10 units of juice and + stuff. +2015-04-24: + Dennok: + - bugfix: Fixes overmap ship speed calculations. + - rscadd: Adds overmap ship rotation. + - rscadd: Added a floorlayer. +2015-04-28: + Jarcolr: + - rscadd: Added 9 new bar sign designs/sprites. + Kelenius: + - rscadd: 'Good news to the roboticists! The long waited firmware update for the + bots has arrived. You can expect the following changes:' + - rscadd: Medbots have improved the disease detection algorithms. + - rscadd: Floorbot firmware has been bugtested. In particular, they will no longer + get stuck near the windows, hopelessly trying to fix the floor under the glass. + - rscadd: Floorbots have also received an internal low-power metal synthesizer. + They will use it to make their own tiles. Slowly. + - rscadd: Following the complains from humanitarian organizations regarding securitron + brutality, stength of their stunners has been toned down. They will also politely + demand that you get on the floor before arresting you. Except for the taser-mounted + guys, they will still tase you down. + - rscadd: Other minor fixes. + - rscdel: 'The lasertag bots are now forbidden to build and use following the incident + #1526672. Please don''t let it happen again.' + - rscadd: The farmbot design has been finished! Made from a watertank, robot arm, + plant analyzer, bucket, minihoe and a proximity sensor, these small (not really) + bots will be a useful companion to any gardener and/or xenobotanist. + - tweak: 'Spider learning alert: they have learned to recognize the bots and will + mercilessly attack them.' + - rscadd: An experimental CPU upgrade would theoretically allow any of the bots + to function with the same intelligence capacity as the maintenance drones. We + still have no idea what causes it to boot up. Science! + - rscadd: 'INCOMING TRANSMISSION: Greetings to agents, pirates, operatives, and + anyone who otherwise uses our equipment. Following the NT update of bot firmware, + we have updated the cryptographic sequencer''s hacking routines as well. The + medbots you emag will not poison you anymore, the clanbots won''t clean after + themselves immediately, and floorbots... wear a space suit. Oh, and it works + on the new farmbots, too.' + PsiOmegaDelta: + - rscadd: Beware. Airlocks can now crush more things than just mobs. + - rscadd: AIs now have a personal atmospherics control subsystem. + - rscadd: Some borg modules now have additional subsystems. + - tweak: Improves borg module handling. + - tweak: Secure airlocks now buzz when access is denied. + - tweak: The mental health office door now requires psychiatrist access, and the + related button now opens/closes the door instead of bolting. + - soundadd: Restores an old soundtrack 'Thunderdome.ogg'. + - rscadd: Some holodeck programs now have custom ambience tracks. + RavingManiac: + - rscadd: The phoron research lab has been renovated to include a heat-exchange + system, a gas mixer/filter and a waste gas disposal pump. + - tweak: Candles now burn for about 30 mintutes. + Yoshax: + - tweak: Adds items to the orderable antag surgical kit so its actually useful for + surgery. + - tweak: Adjusts custom loadout costs to be more standardised and balances. Purely + cosmetic items, shoes, hats, and all things that do not provide a straight advtange + (sterile mask, or pAI, protection from viruses and possible door hacking or + records access, respectively), each cost 1 point, items that provide an advantage + like those just mentioned, or provide armor or storage cost 2 points. + - rscadd: Adds practice rounds, both .45 for Sec and Detective's guns, also 9mm + top mounted for the Saber, and for the Bulldog. + - rscadd: Adds the .45 and 9mm practice rounds to the armory. + - rscadd: Adds all the practice rounds to the autolathe. + - tweak: Adds r_walls to the back of the firing range, leaves the sides normal. + - bugfix: Fixes HoS' office door to not be CMO locked. +2015-04-29: + Daranz: + - rscadd: Paper bundles can now have papers inserted at arbitrary points. This can + be done by clicking the previous/next page links with a sheet of paper in hand. + HarpyEagle: + - rscadd: 'Added new fire modes to various guns: c20r, STS-35, WT-550, Z8, L6 SAW, + and double barreled shotgun. The firing modes work the same way as the egun; + click on the weapon with it in your active hand to cycle between modes. Unloading + these weapons now requires that you click on them with an empty hand.' + PsiOmegaDelta: + - rscadd: Portable atmospheric pumps and scrubbers now use NanoUI. + - rscadd: Two new events which will cause damage to APCs or cameras when triggered. +2015-04-30: + Yoshax: + - rscadd: Adds more items to custom loadout, including a number of dressy suits + and some other things. +2015-05-02: + HarpyEagle: + - bugfix: Neck-grabbing someone now stuns them properly. + PsiOmegaDelta: + - tweak: The spider infestation event now makes an announcement much sooner. + - rscadd: Admins can now toggle OOC/LOOC separately. + - tweak: Mice are now numbered to aid admins. + Yoshax: + - rscadd: Adds an option and verb to the AI to send emergency messages to Central, + functions same as comms console option. + - tweak: Changes comms console to only have one level of ID require, meaning all + heads of staff have what was captain access, allowing them to change alert, + send emergency messages and make announcements. + - rscadd: Adds an emergency bluespace relay machine which is mapped into teletcomms, + this machine takes emergency messages and sends them to central, if one does + not exist on any Z, you cannot send any emergency messages. + - rscadd: Adds an emergency bluespace relay assembly kit orderable from cargo for + when the ones on telecomms are destroyed. Assembly is required. + - rscadd: Adds the emergency bluespace relay circuitboard to be researchable and + printable in R&D, with sufficient tech levels. +2015-05-05: + PsiOmegaDelta: + - tweak: Grilles no longer return too many rods when destroyed (using means other + than wirecutters). + RavingManiac: + - tweak: Intent menu now appears while zooming with a sniper rifle. diff --git a/html/changelogs/__CHANGELOG_README.txt b/html/changelogs/__CHANGELOG_README.txt new file mode 100644 index 0000000000..6915dc47e2 --- /dev/null +++ b/html/changelogs/__CHANGELOG_README.txt @@ -0,0 +1,19 @@ +Changelogs are included with commits as text .yml files created individually by the committer. If you want to create a changelog entry you create a .yml file in the /changelogs directory; nothing else needs to be touched unless you are a maintainer. + +####################################################### + +TO MAKE A CHANGELOG .YML ENTRRY + +1. Make a copy of the file example.yml in html/changelogs and rename it to [YOUR USERNAME]-PR-[YOUR PR NUMBER].yml or [YOUR USERNAME]-[YOUR BRANCH NAME]. Only the username is strictly required, anything else is organizational and can be ignored if you so wish. + +2. Change the author to yourself + +3. Replace the changes text with a description of the changes in your PR, keep the double quotes to avoid errors (your changelog can be written ICly or OOCly, it doesn't matter) + +4. (Optional) set the change prefix (rscadd) to a different one listed above in example.yml (this affects what icon is used for your changelog entry) + +5. When commiting make sure your .yml file is included in the commit (it will usually be unticked as an unversioned file) + +####################################################### + +If you have trouble ask for help in #codershuttle on irc.sorcery.net or read https://tgstation13.org/wiki/Guide_to_Changelogs diff --git a/html/changelogs/example.yml b/html/changelogs/example.yml new file mode 100644 index 0000000000..413c15d19e --- /dev/null +++ b/html/changelogs/example.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: N3X15 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a changelog editing system that should cause fewer conflicts and more accurate timestamps." + - rscdel: "Killed innocent kittens." diff --git a/html/create_object.html b/html/create_object.html index a1f115b783..f4e0aa8644 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -27,7 +27,7 @@
          - Type
          + Type
          Offset: A @@ -44,7 +44,7 @@


          - +
          - - - - - -
          - - - - -
          Date:
          Author:
          Add list item - - -
          - -
          - - - \ No newline at end of file diff --git a/html/paigrid.png b/html/paigrid.png deleted file mode 100644 index 55ca7bf922..0000000000 Binary files a/html/paigrid.png and /dev/null differ diff --git a/html/painew.png b/html/painew.png deleted file mode 100644 index edb15d4033..0000000000 Binary files a/html/painew.png and /dev/null differ diff --git a/html/postcardsmall.jpg b/html/postcardsmall.jpg deleted file mode 100644 index 5d666d7382..0000000000 Binary files a/html/postcardsmall.jpg and /dev/null differ diff --git a/html/somerights20.png b/html/somerights20.png deleted file mode 100644 index a66f4d1a01..0000000000 Binary files a/html/somerights20.png and /dev/null differ diff --git a/html/templates/footer.html b/html/templates/footer.html new file mode 100644 index 0000000000..c26f94bdbf --- /dev/null +++ b/html/templates/footer.html @@ -0,0 +1,13 @@ + + +GoonStation 13 Development Team +
          + Coders: Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion
          + Spriters: Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No
          +
          +
          +

          Creative Commons License
          Except where otherwise noted, Goon Station 13 is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License.
          Rights are currently extended to SomethingAwful Goons only.

          +

          Some icons by Yusuke Kamiyamane. All rights reserved. Licensed under a Creative Commons Attribution 3.0 License.

          + + + diff --git a/html/templates/header.html b/html/templates/header.html new file mode 100644 index 0000000000..bd62de1fc5 --- /dev/null +++ b/html/templates/header.html @@ -0,0 +1,58 @@ + + + + Baystation 12 Changelog + + + + + + + +
          + + + + +
          +
          Space Station 13
          + +

          + Code licensed under AGPLv3. Content licensed under CC BY-SA 3.0.

          + Visit our IRC channel: #bs12 on irc.sorcery.net +
          + +
          Baystation 12 Credit List + + + + +
          + Current Project Maintainers: -Click Here-
          + Currently Active GitHub contributor list: -Click Here-
          + Code: Abi79, Aryn, Cael_Aislinn, Ccomp5950, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, JoeyJo0, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, PsiOmegaDelta, SkyMarshal, Snapshot, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty
          + Sprites: Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, JoeyJo0, Miniature, Searif, Xenone, faux
          + Sounds: Aryn
          + Main Testers: Anyone who has submitted a bug to the issue tracker
          + Thanks to: /tg/ station, /vg/station, GoonStation devs, the original SpaceStation developers and Invisty for the title image.
          Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on irc.
          +
          Have a bug to report?
          Visit our Issue Tracker.
          +
          + + +
          \ No newline at end of file diff --git a/html/tg-notif.png b/html/tg-notif.png deleted file mode 100644 index 586ae70b9c..0000000000 Binary files a/html/tg-notif.png and /dev/null differ diff --git a/icons/effects/352x352.dmi b/icons/effects/352x352.dmi new file mode 100644 index 0000000000..de15d61dd9 Binary files /dev/null and b/icons/effects/352x352.dmi differ diff --git a/icons/effects/cameravis.dmi b/icons/effects/cameravis.dmi index 3ecc9eb80a..2b819836fc 100644 Binary files a/icons/effects/cameravis.dmi and b/icons/effects/cameravis.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 67a1c2ce29..416f2b5d6c 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 8322b7b4f5..38fbd5a2e8 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/bats.dmi b/icons/mob/bats.dmi new file mode 100644 index 0000000000..7446693507 Binary files /dev/null and b/icons/mob/bats.dmi differ diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi index 1c2b577db2..66b5fbe7f8 100644 Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 0c99056632..ed60b1fa86 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index 091ecf1269..f79c6641cb 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index e6903797d4..8038dc3d78 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index fca687513a..ed6383ba7c 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_backpacks.dmi b/icons/mob/items/lefthand_backpacks.dmi new file mode 100644 index 0000000000..28d898ef01 Binary files /dev/null and b/icons/mob/items/lefthand_backpacks.dmi differ diff --git a/icons/mob/items/lefthand_uniforms.dmi b/icons/mob/items/lefthand_uniforms.dmi new file mode 100644 index 0000000000..a7cb65c90c Binary files /dev/null and b/icons/mob/items/lefthand_uniforms.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 87b3eea46b..e7042ca3ad 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/items/righthand_backpacks.dmi b/icons/mob/items/righthand_backpacks.dmi new file mode 100644 index 0000000000..b3153b1533 Binary files /dev/null and b/icons/mob/items/righthand_backpacks.dmi differ diff --git a/icons/mob/items/righthand_uniforms.dmi b/icons/mob/items/righthand_uniforms.dmi new file mode 100644 index 0000000000..2160f1c5e4 Binary files /dev/null and b/icons/mob/items/righthand_uniforms.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 6623ca98fa..bfee242faa 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index f5fef65c74..fdd761de54 100644 Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 777f68c62e..b81f428661 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 5196ec25f8..4dae20e2e6 100644 Binary files a/icons/mob/screen1.dmi and b/icons/mob/screen1.dmi differ diff --git a/icons/mob/screen1_construct.dmi b/icons/mob/screen1_construct.dmi new file mode 100644 index 0000000000..67a37ccd73 Binary files /dev/null and b/icons/mob/screen1_construct.dmi differ diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi new file mode 100644 index 0000000000..db693428d0 Binary files /dev/null and b/icons/mob/screen_spells.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index e8f9800334..afb8b52361 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 8bcb5920ed..d03314d623 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 5a2f06d319..779d34c7d1 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index a46f12357a..45c690a673 100644 Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 4a8c1d3b46..f4c1cb1086 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index ac7af620b1..79fc6c98ab 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 1657f8b17a..6399acfc15 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a55c1b1cc2..ec29f0ce41 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 5f9553089b..5098143271 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index a5ed2192bc..b8156cad06 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/cryogenics.dmi b/icons/obj/cryogenics.dmi index b731ec3c67..9b33a5ba8b 100644 Binary files a/icons/obj/cryogenics.dmi and b/icons/obj/cryogenics.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 70cfb01027..0e1caba244 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index c141d0dad1..4297bbb992 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 21a0022aab..2b986b7de7 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/magic_terror.dmi b/icons/obj/magic_terror.dmi deleted file mode 100644 index 025e164ccd..0000000000 Binary files a/icons/obj/magic_terror.dmi and /dev/null differ diff --git a/icons/obj/narsie.dmi b/icons/obj/narsie.dmi index 940b094176..73df7c31d1 100644 Binary files a/icons/obj/narsie.dmi and b/icons/obj/narsie.dmi differ diff --git a/icons/obj/narsie_spawn_anim.dmi b/icons/obj/narsie_spawn_anim.dmi new file mode 100644 index 0000000000..4f3de372e7 Binary files /dev/null and b/icons/obj/narsie_spawn_anim.dmi differ diff --git a/icons/obj/rift.dmi b/icons/obj/rift.dmi new file mode 100644 index 0000000000..85b7510386 Binary files /dev/null and b/icons/obj/rift.dmi differ diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi index eb542d0777..02af395159 100644 Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index c172c160b6..2813c5d7f8 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/statue.dmi b/icons/obj/statue.dmi new file mode 100644 index 0000000000..a577e8da3e Binary files /dev/null and b/icons/obj/statue.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index a02adb87f0..c3fdbcdb33 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 77e1f1d7de..1dfa399993 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 1d6bad4c50..b7d095f87a 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index ab6cd5a97d..4ec3da1adc 100644 Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 3c2d77e20a..67b9a67155 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/space.dmi b/icons/turf/space.dmi index 9f15fbbe63..30d0d1428a 100644 Binary files a/icons/turf/space.dmi and b/icons/turf/space.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index db3ac690da..bc3b9e68fc 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 1f0a960d34..075405aa58 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -11,11 +11,11 @@ "aak" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/airless{icon_state = "circuit"},/area/space) "aal" = (/obj/structure/girder/displaced,/turf/simulated/floor/airless{icon_state = "circuit"},/area/space) "aam" = (/obj/structure/grille,/turf/space,/area/space) -"aan" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) +"aan" = (/obj/structure/grille/broken,/turf/space,/area/space) "aao" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/space) "aap" = (/turf/simulated/floor/airless,/area/space) -"aaq" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/space,/area/space) -"aar" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/space) +"aaq" = (/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area/space) +"aar" = (/obj/structure/grille/broken,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/space) "aas" = (/obj/item/clothing/suit/ianshirt,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/space) "aat" = (/turf/simulated/wall/r_wall,/area/space) "aau" = (/turf/space,/area/skipjack_station/northwest_solars) @@ -25,7 +25,7 @@ "aay" = (/turf/simulated/wall,/area/security/range) "aaz" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/fore) "aaA" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/space) -"aaB" = (/obj/machinery/camera{c_tag = "Armory Exterior"; dir = 4},/turf/space,/area/space) +"aaB" = (/obj/machinery/camera/network/security{c_tag = "Armory Exterior"; dir = 4},/turf/space,/area/space) "aaC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/range) "aaD" = (/obj/structure/target_stake,/turf/simulated/floor{icon_state = "delivery"},/area/security/range) "aaE" = (/turf/simulated/floor,/area/security/range) @@ -60,9 +60,9 @@ "abh" = (/turf/simulated/wall/r_wall,/area/security/tactical) "abi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/range) "abj" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor,/area/security/range) -"abk" = (/turf/space,/area/skipjack_station/northeast_solars) +"abk" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/security/range) "abl" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor,/area/security/range) -"abm" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Riot Control"; req_access = list(2)},/turf/simulated/floor,/area/security/brig) +"abm" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/machinery/camera/network/security{c_tag = "Armoury - Tactical Equipment"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/tactical) "abn" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/meson/prescription,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "abo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "abp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) @@ -74,7 +74,7 @@ "abv" = (/obj/structure/closet/wardrobe/tactical,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/tactical) "abw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/foresolar) "abx" = (/obj/effect/decal/cleanable/ash,/obj/structure/closet/emcloset,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/security_port) -"aby" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/turf/simulated/floor/plating,/area/security/brig) +"aby" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/security{c_tag = "Security - Firing Range"; dir = 8},/turf/simulated/floor,/area/security/range) "abz" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Fore"},/turf/simulated/floor/plating,/area/maintenance/foresolar) "abA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) "abB" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) @@ -82,7 +82,7 @@ "abD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/range) "abE" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/security/range) "abF" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/range) -"abG" = (/obj/machinery/camera{c_tag = "Security Medical Station"; dir = 1; network = list("SS13")},/turf/simulated/floor,/area/security/range) +"abG" = (/obj/machinery/camera/network/security{c_tag = "Security - Medical Station"; dir = 1},/turf/simulated/floor,/area/security/range) "abH" = (/obj/machinery/light,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/range) "abI" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1475; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 22},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/security/range) "abJ" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/security/range) @@ -91,20 +91,20 @@ "abM" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "abN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "abO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"abP" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/door_control{id = "prisonentry"; name = "Entry Doors"; normaldoorcontrol = 1; pixel_x = -6; pixel_y = 24; req_access = list(2)},/obj/machinery/door_control{id = "prisonexit"; name = "Exit Doors"; normaldoorcontrol = 1; pixel_x = 6; pixel_y = 24; req_access = list(2)},/obj/machinery/button/flasher{id = "permentryflash"; name = "entry flash"; pixel_x = -26; pixel_y = 6; req_access = list(2)},/turf/simulated/floor,/area/security/brig) +"abP" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/range) "abQ" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) "abR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig) "abS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig) "abT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig) "abU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison) "abV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/prison) -"abW" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 8; icon_state = "rightsecure"; req_access = list(2)},/obj/structure/table/reinforced,/turf/simulated/floor,/area/security/brig) -"abX" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"abY" = (/obj/machinery/door/airlock/engineering{name = "Security Substation"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/substation/security) -"abZ" = (/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Security Wing"; req_access = list(63)},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/brig) +"abW" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "brig_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/fore) +"abX" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "brig_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "brig_solar_airlock"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_airpump = "brig_solar_pump"; tag_chamber_sensor = "brig_solar_sensor"; tag_exterior_door = "brig_solar_outer"; tag_interior_door = "brig_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "brig_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/foresolar) +"abY" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "brig_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/foresolar) +"abZ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "brig_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/foresolar) "aca" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/foresolar) "acb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/foresolar) -"acc" = (/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Security Wing"; req_access = list(63)},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/brig) +"acc" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "brig_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/foresolar) "acd" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/security_port) "ace" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) "acf" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) @@ -117,27 +117,27 @@ "acm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main) "acn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/main) "aco" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main) -"acp" = (/obj/machinery/door/window/brigdoor{dir = 1; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) +"acp" = (/obj/machinery/door/airlock/engineering{name = "Fore Solar Access"; req_access = list(10)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/foresolar) "acq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main) "acr" = (/turf/simulated/wall,/area/security/main) "acs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "act" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"acu" = (/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; req_access = list(63)},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) +"acu" = (/turf/simulated/wall/r_wall,/area/security/armoury) "acv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/foresolar) "acw" = (/obj/machinery/power/solar_control{id = "auxsolarnorth"; name = "Fore Solar Control"; track = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/foresolar) "acx" = (/turf/simulated/floor/plating,/area/maintenance/foresolar) -"acy" = (/obj/machinery/camera{c_tag = "Fore Solar Control"; dir = 1},/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/foresolar) -"acz" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "Fore Solar Access"; dir = 8},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/security_port) +"acy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Tactical Equipment"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) +"acz" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access = list(1)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) "acA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/tactical) -"acB" = (/obj/machinery/door/airlock/glass_security{id_tag = "prisonexit"; name = "Brig Exit"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) -"acC" = (/obj/machinery/door/window/brigdoor{dir = 1; id = "Cell 3"; name = "Cell 3"; req_access = list(2)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) -"acD" = (/obj/machinery/door_control{id = "Cell 3"; name = "Cell 3 Door"; pixel_x = -1; pixel_y = -28; req_access = list(2)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/security/brig) +"acB" = (/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/foresolar) +"acC" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Access"; dir = 8},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/security_port) +"acD" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/random/projectile,/obj/random/projectile,/obj/random/projectile,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "acE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"acF" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"acF" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/structure/window/reinforced{dir = 8},/obj/random/energy,/obj/random/energy,/obj/random/energy,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "acG" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/security/main) "acH" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor,/area/security/main) "acI" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/machinery/recharger,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/main) -"acJ" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{id_tag = "detdoor"; name = "Detective"; req_access = list(4)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/detectives_office) +"acJ" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/stunshells,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "acK" = (/obj/structure/table,/obj/item/weapon/reagent_containers/syringe/inaprovaline,/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_y = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/security/main) "acL" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/security/main) "acM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/main) @@ -150,90 +150,90 @@ "acT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/brig) "acU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating/airless,/area/maintenance/foresolar) "acV" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port) -"acW" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"acW" = (/obj/structure/table/rack,/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "acX" = (/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"acY" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"acY" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) "acZ" = (/obj/structure/table,/obj/machinery/recharger,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) "ada" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/security/main) "adb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/security/main) "adc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/main) "add" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) "ade" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/bruise_pack{pixel_x = 10},/obj/item/stack/medical/ointment{pixel_y = 10},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/security/main) -"adf" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/turf/simulated/floor/plating,/area/security/brig) +"adf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) "adg" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) "adh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/snack,/turf/simulated/floor,/area/security/main) "adi" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adk" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adl" = (/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"adm" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"adm" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/security_port) "adn" = (/obj/structure/bed/roller,/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/main) -"ado" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"adp" = (/obj/structure/table,/obj/machinery/recharger,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"ado" = (/obj/machinery/computer/station_alert/security,/turf/simulated/floor,/area/security/main) +"adp" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 4; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "adq" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) -"adr" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/security_port) -"ads" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) -"adt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"adu" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"adr" = (/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) +"ads" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/security/armoury) +"adt" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) +"adu" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor{dir = 4; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/light{dir = 8},/obj/machinery/camera/network/security{c_tag = "Armoury - Secure"; dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "adv" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) "adw" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "adx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/main) "ady" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) -"adz" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/storage/box/emps{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"adz" = (/obj/structure/table,/obj/machinery/recharger,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "adA" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "adB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"adC" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) +"adC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) "adD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) "adE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port) -"adF" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) -"adG" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Interrogation Observation"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) +"adF" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/storage/box/emps{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) +"adG" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "adH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) "adI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/main) "adJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"adK" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) +"adK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) "adL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "adM" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/main) "adN" = (/obj/structure/table,/obj/item/weapon/folder/red,/turf/simulated/floor,/area/security/main) -"adO" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) +"adO" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "adP" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_x = 30; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "adQ" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adR" = (/obj/structure/closet/toolcloset,/obj/item/clothing/head/hardhat/dblue,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"adS" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"adS" = (/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) "adU" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor,/area/security/main) "adV" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) -"adW" = (/obj/machinery/flasher/portable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) -"adX" = (/obj/machinery/light,/obj/machinery/flasher/portable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) -"adY" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access = list(3)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"adW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) +"adX" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access = list(32)},/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"adY" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor{dir = 4; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "adZ" = (/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "aea" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/main) "aeb" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/main) -"aec" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) +"aec" = (/obj/machinery/button/remote/blast_door{id = "Armoury"; name = "Armoury Access"; pixel_x = -1; pixel_y = -28; req_access = list(3)},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) "aed" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "aee" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'INTERNALS REQUIRED'."; name = "INTERNALS REQUIRED"; pixel_x = 32; pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"aef" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main) +"aef" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/main) "aeg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port) -"aeh" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main) +"aeh" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/suit/armor/laserproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/laserproof{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "aei" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/obj/structure/table,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aej" = (/obj/structure/window/reinforced,/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aek" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced,/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/storage/box,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "ael" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aem" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/main) "aen" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"aeo" = (/obj/item/weapon/hand_labeler,/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 4; name = "Warden's Desk"; req_access = list(3)},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"aeo" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/item/clothing/suit/armor/bulletproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/bulletproof{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "aep" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) -"aeq" = (/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/flashlight/lamp/green{dir = 2; pixel_x = 10; pixel_y = 12},/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -4; pixel_y = 7; req_access = list(2)},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) +"aeq" = (/obj/machinery/light,/obj/machinery/flasher/portable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "aer" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/main) "aes" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/security/main) "aet" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/security/main) -"aeu" = (/obj/machinery/camera{c_tag = "Security Office South"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1475; listening = 1; name = "Station Intercom (Security)"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"aev" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"aeu" = (/obj/machinery/flasher/portable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) +"aev" = (/obj/machinery/light,/obj/machinery/flasher/portable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) "aew" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) -"aex" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port) +"aex" = (/obj/structure/grille/broken,/obj/item/weapon/shard,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port) "aey" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/maintenance/security_port) -"aez" = (/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/turf/simulated/floor,/area/security/brig) +"aez" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) "aeA" = (/obj/machinery/deployable/barrier,/turf/simulated/floor{icon_state = "delivery"},/area/security/warden) -"aeB" = (/obj/machinery/camera{c_tag = "Armoury"},/obj/machinery/deployable/barrier,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/simulated/floor{icon_state = "delivery"},/area/security/warden) +"aeB" = (/obj/machinery/button/remote/blast_door{id = "Armoury"; name = "Emergency Access"; pixel_x = -28; pixel_y = 4; req_access = list(3)},/turf/simulated/floor,/area/security/main) "aeC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/warden) "aeD" = (/obj/structure/closet/l3closet/security,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) "aeE" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/bombclosetsecurity,/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) @@ -247,30 +247,30 @@ "aeM" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/main) "aeN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/main) "aeO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"aeP" = (/obj/item/device/eftpos{eftpos_name = "Brig EFTPOS scanner"},/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access = list(3)},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"aeP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/highsecurity{name = "Secure Armoury Section"; req_access = list(3)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/warden) "aeQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"aeR" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"aeR" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/main) "aeS" = (/turf/simulated/wall/r_wall,/area/maintenance/security_starboard) -"aeT" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/space,/area/space) +"aeT" = (/obj/structure/grille/broken,/obj/structure/lattice,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/space,/area/space) "aeU" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/security_port) "aeV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port) "aeW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/barricade/wooden,/turf/simulated/floor/plating,/area/maintenance/security_port) "aeX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/warden) "aeY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/warden) "aeZ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/security/warden) -"afa" = (/obj/machinery/camera{c_tag = "Security Equipment North"; dir = 4; network = list("SS13")},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/security/main) +"afa" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1475; listening = 1; name = "Station Intercom (Security)"; pixel_x = 30; pixel_y = 0},/obj/machinery/camera/network/security{c_tag = "Security - Briefing"; dir = 8},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "afb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "red"},/area/security/main) "afc" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Security"; sortType = "Security"},/turf/simulated/floor{icon_state = "red"},/area/security/main) "afd" = (/turf/simulated/floor{icon_state = "red"},/area/security/main) -"afe" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) +"afe" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aff" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/main) "afg" = (/obj/machinery/photocopier,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "afh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/main) "afi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/main) "afj" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/security/main) "afk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"afl" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/belt/utility,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"afm" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/obj/machinery/camera/xray{c_tag = "Security Escape Pod"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"afl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 32; pixel_y = 0},/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"afm" = (/obj/structure/closet/crate/secure{name = "FOR DISPOSAL"; req_access = list(58)},/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/balaclava,/obj/effect/decal/cleanable/cobweb2,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/ld50_syringe/choral,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_port) "afn" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape_pod3/station) "afo" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod3/station) "afp" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod3/station) @@ -282,7 +282,7 @@ "afv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/security/warden) "afw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/warden) "afx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/warden) -"afy" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement 1"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) +"afy" = (/obj/machinery/deployable/barrier,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/obj/machinery/camera/network/security{c_tag = "Armoury"},/turf/simulated/floor{icon_state = "delivery"},/area/security/warden) "afz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/main) "afA" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/security/main) "afB" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/security/main) @@ -291,12 +291,12 @@ "afE" = (/obj/machinery/vending/cola,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "afF" = (/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "afG" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/main) -"afH" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) -"afI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/dormitory) +"afH" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/main) +"afI" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afK" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_3_berth"; pixel_x = 25; pixel_y = 25; tag_door = "escape_pod_3_berth_hatch"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"afL" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/space) -"afM" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dorm_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/dormitory) +"afL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/camera/network/security{c_tag = "Security - Equipment North"; dir = 4},/turf/simulated/floor,/area/security/main) +"afM" = (/obj/structure/table,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/storage/box/donut,/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "afN" = (/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main) "afO" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main) "afP" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/station) @@ -314,9 +314,9 @@ "agb" = (/turf/simulated/floor/plating,/area/maintenance/security_port) "agc" = (/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/plating,/area/maintenance/security_port) "agd" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) -"age" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) +"age" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/candle{pixel_x = -5; pixel_y = 5},/obj/item/weapon/paper{desc = "A few notes scratched out by the last CMO before they departed the station."; info = "Today would have been our fifth anniversary.\[br]I wish I could undo what happened.\[br]\[br]\[center]I miss you so much.\[/center]"; name = "a brief letter"; pixel_x = 5},/obj/item/weapon/pen{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "agf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/warden) -"agg" = (/obj/machinery/door_control{id = "Cell 1"; name = "Cell 1 Door"; pixel_x = 30; pixel_y = 1; req_access = list(2)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) +"agg" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Armoury"; req_access = list(2)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/warden) "agh" = (/obj/structure/bed/chair{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) "agi" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1475; listening = 0; name = "Station Intercom (Security)"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor,/area/security/main) "agj" = (/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/main) @@ -326,14 +326,14 @@ "agn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "ago" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/crew_quarters/heads/hos) "agp" = (/turf/simulated/wall,/area/crew_quarters/heads/hos) -"agq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) -"agr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/goldenplaque,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) -"ags" = (/obj/machinery/door/airlock{id_tag = "visitdoor"; name = "Visitation Area"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/lobby) -"agt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) -"agu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) +"agq" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access = list(1)},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "delivery"},/area/security/main) +"agr" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Security"},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/security/main) +"ags" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"agt" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) +"agu" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_3"; pixel_x = 0; pixel_y = -25; tag_door = "escape_pod_3_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) "agv" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hos) "agw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"agx" = (/obj/machinery/door/airlock{name = "Visitation Area"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) +"agx" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) "agy" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod3/station) "agz" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod3/station) "agA" = (/obj/structure/table/rack,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/security_port) @@ -343,10 +343,10 @@ "agE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "agF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/warden) "agG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/warden) -"agH" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/fore) +"agH" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) "agI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/warden) "agJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/warden) -"agK" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/fore) +"agK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) "agL" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/main) "agM" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) "agN" = (/obj/structure/disposalpipe/sortjunction{dir = 1; name = "HoS Office"; sortType = "HoS Office"},/turf/simulated/wall,/area/crew_quarters/heads/hos) @@ -370,48 +370,48 @@ "ahf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/security/brig) "ahg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/warden) "ahh" = (/obj/machinery/photocopier,/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ahi" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Security Warden Office"; dir = 2; network = list("SS13")},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"ahi" = (/obj/structure/grille,/obj/structure/sign/goldenplaque,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "ahj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahk" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahl" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/item/weapon/stamp/denied{pixel_x = 5},/obj/item/weapon/stamp,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahm" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/weapon/paper{info = "\[center]\[Large]\[b]NSS Exodus\[/b]\[/large]\[br] \[small]Armoury Inventory\[/small]\[/center] \[hr] \[hr] \[br] \[b]Weaponry\[/b]\[br] \[field] Energy Gun(s)\[br] \[field] Laser Gun(s)\[br] \[field] Ion Rifle(s)\[br] \[field] Combat Shotgun(s) \[hr] \[b]Armour\[/b]\[br] \[field] Bulletproof Vest(s)\[br] \[field] Abalative Vest(s)\[br] \[field] Biohazard Suit(s)\[br] \[field] Bomb Suit(s) \[hr] \[b]Auxiliary Equipment\[/b]\[br] \[field] Gasmask(s)\[br] \[field] box(es) of Flashbangs\[br] \[field] box(es) of Handcuffs\[br] \[field] box(es) of R.O.B.U.S.T. Cartridges \[hr] \[b]Riot Equipment\[/b]\[br] \[field] Stun Baton(s)\[br] \[field] Riot Suit(s)\[br] \[field] Riot Shield(s) \[hr] \[b]Tactical Equipment\[/b]\[br] \[field] Tactical Armour(s)\[br] \[field] Tactical Helmet(s)\[br] \[field] Tactical Jumpsuit(s)\[br] \[field] Green Balaclava(s)\[br] \[field] Tactical HUD(s)\[br] \[field] Combat Belt(s)\[br] \[field] Black Glove(s)\[br] \[field] Jackboot(s) \[hr] \[b]Implants\[/b]\[br] \[field] Tracking Implant Box(es)\[br] \[field] Chemical Implant Box(es) \[hr] \[b]Defense Systems\[/b]\[br] \[field] Deployable Barrier(s)\[br] \[field] Portable Flasher(s) \[hr] \[b]Other\[/b]\[br] \[field] Holobadge Box(es) \[hr] \[b]\[center]Warden's's Signature:\[/b] \[field]\[/center] \[hr]"; name = "Armory Inventory"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahn" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/main) "aho" = (/obj/structure/flora/pottedplant{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"ahp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) +"ahp" = (/obj/structure/grille,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "ahq" = (/obj/structure/table/woodentable,/obj/item/device/megaphone,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ahr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ahs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) -"aht" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dorm_inner"; locked = 1; name = "Dormitory Internal Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) +"aht" = (/obj/structure/grille,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "ahu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) "ahv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ahw" = (/obj/structure/table/woodentable,/obj/machinery/keycard_auth{pixel_x = 30},/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ahx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "ahy" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"ahz" = (/obj/structure/table,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/security/prison) +"ahz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/command{id_tag = "HoSdoor"; name = "Head of Security"; req_access = list(58)},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ahA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port) "ahB" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port) "ahC" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor,/area/security/brig) "ahD" = (/obj/structure/table,/obj/item/stack/medical/ointment,/obj/item/weapon/folder/red,/obj/item/stack/medical/bruise_pack{pixel_x = 10; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/brig) "ahE" = (/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/structure/grille,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/brig) "ahF" = (/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahG" = (/obj/machinery/camera{c_tag = "Interrogation"; network = list("SS13","Interrogation")},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1449; listening = 0; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) +"ahG" = (/obj/structure/grille,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "ahH" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "ahI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahJ" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dorm_airlock"; name = "Dormitory Airlock Console"; pixel_x = 25; pixel_y = 0; req_one_access = list(1,5,11,18,24); tag_airpump = "dorm_pump"; tag_chamber_sensor = "dorm_sensor"; tag_exterior_door = "dorm_outer"; tag_interior_door = "dorm_inner"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/dormitory) +"ahJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/decal/cleanable/blood/oil,/obj/item/trash/tastybread,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "ahK" = (/turf/simulated/floor,/area/security/brig) "ahL" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) "ahM" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor,/area/security/brig) "ahN" = (/obj/structure/closet/wardrobe/red,/obj/structure/window/reinforced,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/armband,/obj/item/clothing/accessory/armband,/obj/item/clothing/accessory/armband,/turf/simulated/floor,/area/security/main) "ahO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) -"ahP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock{name = "Internal Affairs"; req_access = list(38)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/lawoffice) +"ahP" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/turf/simulated/floor/plating,/area/security/brig) "ahQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/bed/chair,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) -"ahR" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access = list(4)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/detectives_office) +"ahR" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahS" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) "ahT" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/vending/coffee,/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"ahU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) +"ahU" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/security{c_tag = "Security - Warden's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ahV" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask{pixel_x = -4; pixel_y = 8},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ahW" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ahX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) +"ahX" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "ahY" = (/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/weapon/stamp/hos,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) "ahZ" = (/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/skills{pixel_y = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) "aia" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) @@ -420,15 +420,15 @@ "aid" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/security_port) "aie" = (/obj/structure/closet,/obj/item/clothing/head/ushanka,/turf/simulated/floor/plating,/area/maintenance/security_port) "aif" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/security_port) -"aig" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor/plating,/area/maintenance/security_port) -"aih" = (/obj/machinery/camera{c_tag = "Interrogation Observation"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/security/brig) +"aig" = (/turf/space,/area/skipjack_station/northeast_solars) +"aih" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1449; listening = 0; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/camera/network/security{c_tag = "Security - Interrogation"},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "aii" = (/obj/structure/bed/chair,/turf/simulated/floor,/area/security/brig) "aij" = (/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/structure/grille,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/brig) "aik" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "ail" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/item/device/taperecorder,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "aim" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{layer = 4; name = "Observation Screen"; network = list("Interrogation"); pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) "ain" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"aio" = (/obj/machinery/camera{c_tag = "Security Processing"; dir = 4; network = list("SS13")},/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/turf/simulated/floor,/area/security/brig) +"aio" = (/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/turf/simulated/floor,/area/security/brig) "aip" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "aiq" = (/obj/structure/table,/turf/simulated/floor,/area/security/brig) "air" = (/obj/machinery/computer/secure_data,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) @@ -437,7 +437,7 @@ "aiu" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "aiw" = (/obj/machinery/vending/security,/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"aix" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/green,/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) +"aix" = (/obj/item/device/eftpos{eftpos_name = "Brig EFTPOS scanner"},/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access = list(3)},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiy" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "aiz" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor,/area/security/brig) "aiA" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/red,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) @@ -451,7 +451,7 @@ "aiI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "aiJ" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "aiK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"aiL" = (/obj/machinery/camera{c_tag = "Evidence Storage"; dir = 8; network = list("SS13")},/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 2; pixel_y = 4},/obj/item/weapon/pen,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) +"aiL" = (/obj/item/weapon/hand_labeler,/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 4; name = "Warden's Desk"; req_access = list(3)},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiM" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1475; listening = 0; name = "Station Intercom (Security)"; pixel_x = -30; pixel_y = 0},/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/brig) "aiN" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) "aiO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) @@ -462,45 +462,45 @@ "aiT" = (/obj/machinery/computer/prisoner,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiU" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "aiV" = (/obj/structure/closet/secure_closet/warden,/obj/item/device/megaphone,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1475; listening = 1; name = "Station Intercom (Security)"; pixel_x = 30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aiW" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Security Equipment South"; dir = 4; network = list("SS13")},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) +"aiW" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "aiX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aiY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aiZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"aja" = (/obj/machinery/camera{c_tag = "Brig East"; dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/computer/guestpass{pixel_y = -29},/turf/simulated/floor,/area/security/brig) +"aja" = (/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/flashlight/lamp/green{dir = 2; pixel_x = 10; pixel_y = 12},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) "ajb" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "ajc" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall,/area/crew_quarters/heads/hos) -"ajd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "HoS Office South"; dir = 1},/obj/structure/flora/pottedplant,/obj/machinery/newscaster/security_unit{pixel_x = -30},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"aje" = (/obj/structure/bed/chair/comfy/black{dir = 1},/obj/effect/landmark/start{name = "Head of Security"},/obj/machinery/door_control{id = "HoSdoor"; name = "Office Door"; normaldoorcontrol = 1; pixel_x = -36; pixel_y = 29},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ajd" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_port) +"aje" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera/network/security{c_tag = "Security - Interrogation Observation"; dir = 4},/turf/simulated/floor,/area/security/brig) "ajf" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ajg" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ajh" = (/obj/structure/filingcabinet,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "aji" = (/obj/structure/closet/secure_closet/hos,/obj/item/device/radio/intercom{pixel_x = 27},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ajj" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement 2"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) -"ajk" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/plating,/area/maintenance/security_port) +"ajj" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/machinery/camera/network/security{c_tag = "Security - Processing"; dir = 4},/turf/simulated/floor,/area/security/brig) +"ajk" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/belt/utility,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/camera/xray/security{c_tag = "Security Escape Pod"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "ajl" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port) -"ajm" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/eastright{base_state = "left"; dir = 4; icon_state = "left"; name = "Internal Affairs Desk"; req_access = list(38)},/turf/simulated/floor,/area/lawoffice) -"ajn" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dorm_outer"; locked = 1; name = "Dormitory External Access"; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"ajo" = (/obj/machinery/door_control{id = "Cell 2"; name = "Cell 2 Door"; pixel_x = 30; pixel_y = 1; req_access = list(2)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) +"ajm" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/structure/cable/green,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) +"ajn" = (/obj/structure/bed/chair/comfy/black{dir = 1},/obj/effect/landmark/start{name = "Head of Security"},/obj/machinery/button/remote/airlock{id = "HoSdoor"; name = "Office Door"; pixel_x = -36; pixel_y = 29},/obj/machinery/button/windowtint{pixel_x = -26; pixel_y = 30},/obj/machinery/button/remote/blast_door{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -36; pixel_y = 39; req_access = list(2)},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ajo" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 2; pixel_y = 4},/obj/item/weapon/pen,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/security{c_tag = "Security - Evidence Storage"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) "ajp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) "ajq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) -"ajr" = (/obj/machinery/door/window/westleft{dir = 1; name = "Forensics Area"; req_access = list(4)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/security/detectives_office) +"ajr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/brig) "ajs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) -"ajt" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "dorm_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless,/area/maintenance/dormitory) +"ajt" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/security{c_tag = "Security - Equipment South"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main) "aju" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) "ajv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) "ajw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) -"ajx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Dormitory\\Security Maintenance"; req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/dormitory) +"ajx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/flora/pottedplant,/obj/machinery/newscaster/security_unit{pixel_x = -30},/obj/machinery/camera/network/security{c_tag = "Security - HoS' Office"; dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "ajy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) "ajz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/brig) -"ajA" = (/obj/machinery/door/airlock/glass_security{id_tag = "prisonentry"; name = "Brig Entry"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) -"ajB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "EVA\\Security Maintenance"},/turf/simulated/floor/plating,/area/maintenance/security_port) +"ajA" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/security_port) +"ajB" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Interrogation Observation"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "ajC" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/heads/hos) "ajD" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "ajE" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "ajF" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/security_port) "ajG" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/security_port) "ajH" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/security_port) -"ajI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/engineering{name = "Security Substation"; req_one_access = list(11,24)},/turf/simulated/floor/plating,/area/maintenance/substation/security) +"ajI" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "ajJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig) "ajK" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "ajL" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) @@ -528,7 +528,7 @@ "akh" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "aki" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "akj" = (/obj/structure/noticeboard{pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"akk" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"akk" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "akl" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "akm" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/computer/security/wooden_tv,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "akn" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/flora/pottedplant{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) @@ -544,12 +544,12 @@ "akx" = (/obj/machinery/door_timer/cell_3{pixel_y = -32},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) "aky" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/security/brig) "akz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) -"akA" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/brigdoor{dir = 8; req_access = list(2)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/reinforced,/turf/simulated/floor,/area/security/brig) +"akA" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) "akB" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) "akC" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) "akD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/security/brig) "akE" = (/obj/structure/table,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/holobadge,/obj/item/clothing/accessory/holobadge,/obj/item/clothing/accessory/holobadge/cord,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"akF" = (/obj/machinery/camera{c_tag = "Brig Center"; dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/security/brig) +"akF" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) "akG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/brig) "akH" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/security/brig) "akI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/security/brig) @@ -561,21 +561,21 @@ "akO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "akP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) "akQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/security/brig) -"akR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/button/flasher{id = "permflash"; name = "Brig flashes"; pixel_x = -6; pixel_y = -24; req_access = list(2); tag = "permflash"},/obj/machinery/door_control{id = "brigobs"; name = "observation shutters"; pixel_x = 6; pixel_y = -24},/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -26; pixel_y = -4; req_access = list(2)},/turf/simulated/floor,/area/security/brig) +"akR" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access = list(3)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) "akS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "akT" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/security/detectives_office) "akU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/carpet,/area/security/detectives_office) "akV" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -29},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"akW" = (/obj/structure/table/woodentable,/obj/machinery/door_control{id = "detdoor"; name = "Office Door"; normaldoorcontrol = 1},/obj/item/weapon/handcuffs,/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office) +"akW" = (/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/weapon/handcuffs,/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office) "akX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/button/flasher{id = "permflash"; name = "Brig flashes"; pixel_x = 0; pixel_y = -27; tag = "permflash"},/turf/simulated/floor,/area/security/brig) "akY" = (/obj/structure/closet/secure_closet/detective,/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "akZ" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"ala" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access = list(32)},/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"ala" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main) "alb" = (/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/carpet,/area/security/detectives_office) "alc" = (/obj/machinery/atmospherics/pipe/tank/nitrous_oxide{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/security/brig) "ald" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/security/brig) -"ale" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/meter,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/security/brig) -"alf" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/computer/area_atmos/area,/turf/simulated/floor/plating,/area/security/brig) +"ale" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main) +"alf" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/turf/simulated/floor/plating,/area/security/brig) "alg" = (/obj/machinery/light{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) "alh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) "ali" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) @@ -583,17 +583,17 @@ "alk" = (/turf/simulated/floor/plating/airless,/area/solar/auxport) "all" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "alm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) -"aln" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor{dir = 4; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Armoury - Secure"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"aln" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera/network/security{c_tag = "Security - Forensic Office Fore"; dir = 2},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "alo" = (/obj/machinery/door/blast/regular{id = "Cell 1"; name = "Cell Door"},/turf/simulated/floor,/area/security/prison) "alp" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig) -"alq" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor{dir = 4; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) -"alr" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/main) +"alq" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"alr" = (/obj/machinery/button/remote/blast_door{id = "Cell 3"; name = "Cell 3 Door"; pixel_x = -1; pixel_y = -28; req_access = list(2)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/security/brig) "als" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig) "alt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/security/brig) "alu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/security/brig) -"alv" = (/obj/machinery/door_control{id = "Armoury"; name = "Armoury Access"; pixel_x = -1; pixel_y = -28; req_access = list(3)},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"alv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera/network/security{c_tag = "Security - Brig Center"; dir = 1},/turf/simulated/floor,/area/security/brig) "alw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/brig) -"alx" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/random/projectile,/obj/random/projectile,/obj/random/projectile,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"alx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/computer/guestpass{pixel_y = -29},/obj/machinery/camera/network/security{c_tag = "Security - Brig East"; dir = 1},/turf/simulated/floor,/area/security/brig) "aly" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "alz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "alA" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/auxport) @@ -609,10 +609,10 @@ "alK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) "alL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "visit_blast"; name = "Privacy Shutters"; opacity = 0},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/lobby) "alM" = (/turf/simulated/floor/plating,/area/security/brig) -"alN" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/brig) +"alN" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{id_tag = "detdoor"; name = "Detective"; req_access = list(4)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/detectives_office) "alO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/security_starboard) -"alP" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/structure/window/reinforced{dir = 8},/obj/random/energy,/obj/random/energy,/obj/random/energy,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) -"alQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) +"alP" = (/obj/machinery/computer/area_atmos/area,/turf/simulated/floor/plating,/area/security/brig) +"alQ" = (/obj/machinery/meter,/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/plating,/area/security/brig) "alR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig) "alS" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/brig) "alT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/prison) @@ -621,7 +621,7 @@ "alW" = (/turf/simulated/wall,/area/security/prison) "alX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor,/area/security/prison) "alY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) -"alZ" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/stunshells,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"alZ" = (/obj/machinery/door/window/brigdoor{dir = 1; id = "Cell 3"; name = "Cell 3"; req_access = list(2)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "ama" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/security_starboard) "amb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig) "amc" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool,/turf/simulated/floor/carpet,/area/security/detectives_office) @@ -636,44 +636,44 @@ "aml" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "amm" = (/obj/structure/closet/lawcloset,/obj/item/clothing/glasses/sunglasses/big,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "amn" = (/obj/item/weapon/storage/secure/safe{pixel_x = -23},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"amo" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/machinery/door_control{id = "detdoor"; name = "Office Door"; normaldoorcontrol = 1},/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/carpet,/area/security/detectives_office) +"amo" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/carpet,/area/security/detectives_office) "amp" = (/obj/structure/table/woodentable,/obj/item/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flash,/obj/item/weapon/handcuffs,/turf/simulated/floor/carpet,/area/security/detectives_office) "amq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office) "amr" = (/obj/item/weapon/storage/secure/safe{pixel_x = 35; pixel_y = 5},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"ams" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/security/brig) -"amt" = (/obj/structure/table/rack,/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) -"amu" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 4; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"ams" = (/obj/machinery/door/airlock/glass_security{id_tag = "prisonexit"; name = "Brig Exit"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) +"amt" = (/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; req_access = list(63)},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) +"amu" = (/obj/machinery/door/window/brigdoor{dir = 1; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig) "amv" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/power/sensor{name = "Powernet Sensor - Security Subgrid"; name_tag = "Security Subgrid"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/maintenance/substation/security) "amw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/security) -"amx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/range) -"amy" = (/obj/machinery/door/airlock/engineering{name = "Fore Solar Access"; req_access = list(10)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/foresolar) +"amx" = (/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Security Wing"; req_access = list(63)},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/brig) +"amy" = (/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Security Wing"; req_access = list(63)},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/brig) "amz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/hallway/primary/fore) -"amA" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/camera{c_tag = "Brig Toxin Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/security/brig) +"amA" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "amB" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/security/brig) "amC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/security/brig) -"amD" = (/obj/effect/decal/cleanable/generic,/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area/security/brig) -"amE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) -"amF" = (/obj/machinery/camera{c_tag = "Prison Wing Processing"; dir = 1},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor,/area/security/brig) +"amD" = (/obj/machinery/door/airlock/engineering{name = "Security Substation"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/substation/security) +"amE" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/turf/simulated/floor/plating,/area/security/brig) +"amF" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/security/brig) "amG" = (/obj/structure/flora/pottedplant{tag = "icon-plant-10"; icon_state = "plant-10"},/turf/simulated/floor,/area/security/brig) -"amH" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "brig_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "brig_solar_airlock"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_airpump = "brig_solar_pump"; tag_chamber_sensor = "brig_solar_sensor"; tag_exterior_door = "brig_solar_outer"; tag_interior_door = "brig_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "brig_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/foresolar) +"amH" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/plating,/area/security/brig) "amI" = (/turf/simulated/floor{icon_state = "red"},/area/security/prison) -"amJ" = (/obj/structure/closet/secure_closet/brig{id = "Cell 3"; name = "Cell 3 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 3"; dir = 8; network = list("SS13","Prison")},/turf/simulated/floor{icon_state = "red"},/area/security/prison) +"amJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor,/area/security/brig) "amK" = (/obj/machinery/flasher{id = "permentryflash"; name = "Floor mounted flash"; pixel_x = 0},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/prison) "amL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) -"amM" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "brig_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/foresolar) -"amN" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; normaldoorcontrol = 1; pixel_x = 28; pixel_y = -15},/turf/simulated/floor,/area/security/brig) -"amO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; name = "Brig Monitor"; network = list("Prison"); pixel_x = 3; pixel_y = -33},/turf/simulated/floor,/area/security/brig) -"amP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "Prison Wing Observation"; dir = 1; network = list("SS13")},/turf/simulated/floor,/area/security/brig) +"amM" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Riot Control"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/security/brig) +"amN" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; pixel_x = 28; pixel_y = -15},/turf/simulated/floor,/area/security/brig) +"amO" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 8; icon_state = "rightsecure"; req_access = list(2)},/obj/structure/table/reinforced,/turf/simulated/floor,/area/security/brig) +"amP" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/button/remote/airlock{id = "prisonentry"; name = "Entry Doors"; pixel_x = -6; pixel_y = 24; req_access = list(2)},/obj/machinery/button/remote/blast_door{id = "prisonexit"; name = "Exit Doors"; pixel_x = 6; pixel_y = 24; req_access = list(2)},/obj/machinery/button/flasher{id = "permentryflash"; name = "entry flash"; pixel_x = -26; pixel_y = 6; req_access = list(2)},/turf/simulated/floor,/area/security/brig) "amQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; name = "Brig Monitor"; network = list("Prison"); pixel_x = -3; pixel_y = -33},/turf/simulated/floor,/area/security/brig) "amR" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = -28; pixel_y = 0},/obj/structure/bed,/turf/simulated/floor{icon_state = "red"},/area/security/prison) "amS" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/southright{dir = 4},/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/security/lobby) "amT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/lobby) -"amU" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "brig_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/foresolar) +"amU" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/camera/network/security{c_tag = "Security - Brig Toxin Control"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/security/brig) "amV" = (/obj/structure/table/reinforced,/obj/item/weapon/folder{pixel_x = -4},/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/internalaffairs,/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"amW" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "brig_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/foresolar) +"amW" = (/obj/effect/decal/cleanable/generic,/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plating,/area/security/brig) "amX" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "amY" = (/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"amZ" = (/obj/machinery/computer/security/wooden_tv,/obj/machinery/camera{c_tag = "Forensic Office"; dir = 4; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"amZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) "ana" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) "anb" = (/obj/item/device/radio/intercom{pixel_x = 29; pixel_y = -1},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "anc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/security_starboard) @@ -684,12 +684,12 @@ "anh" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "ani" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) "anj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"ank" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Tactical Equipment"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) -"anl" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/wall,/area/security/brig) -"anm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/wall,/area/security/brig) -"ann" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) -"ano" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door_timer/cell_6{id = "Cell 2"; name = "Cell 2"; pixel_x = 32},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig) -"anp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) +"ank" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/camera/network/security{c_tag = "Security - Prison Processing"; dir = 1},/turf/simulated/floor,/area/security/brig) +"anl" = (/obj/structure/closet/secure_closet/brig{id = "Cell 3"; name = "Cell 3 Locker"},/obj/machinery/camera/network/prison{c_tag = "Security - Brig Cell 3"; dir = 8},/turf/simulated/floor{icon_state = "red"},/area/security/prison) +"anm" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/brigdoor{dir = 8; req_access = list(2)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/reinforced,/turf/simulated/floor,/area/security/brig) +"ann" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; name = "Brig Monitor"; network = list("Prison"); pixel_x = 3; pixel_y = -33},/obj/machinery/computer/station_alert/security,/turf/simulated/floor,/area/security/brig) +"ano" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/button/flasher{id = "permflash"; name = "Brig flashes"; pixel_x = -6; pixel_y = -24; req_access = list(2); tag = "permflash"},/obj/machinery/button/remote/blast_door{id = "brigobs"; name = "observation shutters"; pixel_x = 6; pixel_y = -24},/obj/machinery/button/remote/blast_door{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -26; pixel_y = -4; req_access = list(2)},/turf/simulated/floor,/area/security/brig) +"anp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/security{c_tag = "Security - Prison Observation"; dir = 1},/turf/simulated/floor,/area/security/brig) "anq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) "anr" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/wall,/area/security/prison) "ans" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) @@ -715,7 +715,7 @@ "anM" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera_film,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "anN" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "anO" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/security_starboard) -"anP" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access = list(1)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) +"anP" = (/obj/machinery/computer/security/wooden_tv,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) "anQ" = (/turf/simulated/wall,/area/maintenance/substation/security) "anR" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Security Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/security) "anS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/security) @@ -730,12 +730,12 @@ "aob" = (/obj/structure/table,/obj/item/weapon/pen,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/security/brig) "aoc" = (/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Security"},/turf/simulated/floor/plating,/area/maintenance/substation/security) "aod" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) -"aoe" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "brig_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"aof" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/security/range) +"aoe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "EVA\\Security Maintenance"},/turf/simulated/floor/plating,/area/maintenance/security_port) +"aof" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) "aog" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/prison) -"aoh" = (/obj/machinery/camera{c_tag = "Brig Cell 2"; dir = 2; network = list("SS13","Prison")},/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) +"aoh" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/security/brig) "aoi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) -"aoj" = (/obj/machinery/camera{c_tag = "Armoury - Tactical Equipment "; dir = 2; network = list("SS13")},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor{dir = 2; name = "Weapons locker"; req_access = list(3)},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/tactical) +"aoj" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/door_timer/cell_6{id = "Cell 2"; name = "Cell 2"; pixel_x = 32},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig) "aok" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) "aol" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/security/prison) "aom" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southleft,/turf/simulated/floor,/area/security/prison) @@ -744,8 +744,8 @@ "aop" = (/obj/item/device/radio/intercom{desc = "Talk... listen through this."; name = "Station Intercom (Brig Radio)"; pixel_x = 0; pixel_y = 26; wires = 7},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "aoq" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/security/prison) "aor" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"aos" = (/obj/machinery/camera{c_tag = "Firing Range"; dir = 8; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/range) -"aot" = (/obj/machinery/camera{c_tag = "Security Lobby"; dir = 4; pixel_x = 0; pixel_y = -22},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table,/obj/item/weapon/book/manual/security_space_law{pixel_y = 6},/turf/simulated/floor,/area/security/lobby) +"aos" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) +"aot" = (/obj/machinery/door/blast/regular{dir = 1; id = "Cell 3"; name = "Cell Door"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/security/prison) "aou" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/lobby) "aov" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/lobby) "aow" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/lobby) @@ -754,11 +754,11 @@ "aoz" = (/obj/structure/window/basic{dir = 1},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aoA" = (/obj/structure/window/basic{dir = 1},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aoB" = (/obj/structure/window/basic{dir = 1},/obj/machinery/photocopier,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aoC" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) +"aoC" = (/obj/machinery/door/airlock/glass_security{id_tag = "prisonentry"; name = "Brig Entry"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) "aoD" = (/obj/structure/window/basic{dir = 1},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aoE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/basic{dir = 1},/obj/structure/filingcabinet/security{desc = "A large cabinet with hard copy security records."; name = "Security Records"},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aoF" = (/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/obj/structure/window/basic{dir = 1},/obj/structure/filingcabinet/medical{desc = "A large cabinet with hard copy medical records."; name = "Medical Records"},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aoG" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/turf/simulated/floor/plating,/area/security/brig) +"aoG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/engineering{name = "Security Substation"; req_one_access = list(11,24)},/turf/simulated/floor/plating,/area/maintenance/substation/security) "aoH" = (/turf/simulated/wall,/area/maintenance/dormitory) "aoI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aoJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) @@ -767,7 +767,7 @@ "aoM" = (/obj/machinery/door/blast/regular{id = "Cell 2"; name = "Cell Door"},/turf/simulated/floor,/area/security/prison) "aoN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) "aoO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) -"aoP" = (/obj/machinery/door/blast/regular{dir = 1; id = "Cell 3"; name = "Cell Door"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/security/prison) +"aoP" = (/obj/item/weapon/stool,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/security{c_tag = "Security - Solitary Confinement North"},/turf/simulated/floor/plating,/area/security/brig) "aoQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) "aoR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prison) "aoS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "brigobs"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) @@ -777,11 +777,11 @@ "aoW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/lawoffice) "aoX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "aoY" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"aoZ" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/security/warden) +"aoZ" = (/obj/machinery/button/remote/blast_door{id = "Cell 2"; name = "Cell 2 Door"; pixel_x = 30; pixel_y = 1; req_access = list(2)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) "apa" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/evahallway) "apb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/evahallway) "apc" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/security/brig) -"apd" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access = list(1)},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "delivery"},/area/security/main) +"apd" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera/network/prison{c_tag = "Security - Brig Cell 2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) "ape" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "apf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/security/brig) "apg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/fore) @@ -793,7 +793,7 @@ "apm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) "apn" = (/obj/machinery/flasher{id = "permflash"; name = "Floor mounted flash"; pixel_x = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/prison) "apo" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/security/prison) -"app" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/security{name = "Armoury"; req_access = list(2)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/warden) +"app" = (/obj/machinery/computer/arcade,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/camera/network/prison{c_tag = "Security - Common Brig Northwest"},/turf/simulated/floor,/area/security/prison) "apq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/substation/security) "apr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/lobby) "aps" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/fore) @@ -807,11 +807,11 @@ "apA" = (/obj/machinery/requests_console{pixel_x = 30},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "apB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/dormitory) "apC" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/maintenance/dormitory) -"apD" = (/obj/item/weapon/stool,/obj/effect/decal/cleanable/dirt,/obj/machinery/camera{c_tag = "Solitary Confinement North"; dir = 2; network = list("SS13","Prison")},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/security/brig) +"apD" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table,/obj/item/weapon/book/manual/security_space_law{pixel_y = 6},/obj/machinery/camera/network/security{c_tag = "Security - Lobby"; dir = 4},/turf/simulated/floor,/area/security/lobby) "apE" = (/obj/machinery/light{dir = 8},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/lobby) "apF" = (/turf/simulated/floor/wood,/area/maintenance/dormitory) "apG" = (/obj/structure/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/maintenance/dormitory) -"apH" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) +"apH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "apI" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/auxstarboard) "apJ" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/auxport) "apK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -836,7 +836,7 @@ "aqd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/lobby) "aqe" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/lobby) "aqf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/lobby) -"aqg" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_3"; pixel_x = 0; pixel_y = -25; tag_door = "escape_pod_3_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) +"aqg" = (/obj/machinery/door/window/westleft{dir = 1; name = "Forensics Area"; req_access = list(4)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/security/detectives_office) "aqh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "aqi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "aqj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) @@ -846,7 +846,7 @@ "aqn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aqo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aqp" = (/obj/structure/bed/chair,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor,/area/security/prison) -"aqq" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Security"},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/security/main) +"aqq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Dormitory\\Security Maintenance"; req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/dormitory) "aqr" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aqs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aqt" = (/obj/structure/table/gamblingtable,/turf/simulated/floor/wood,/area/maintenance/dormitory) @@ -858,20 +858,20 @@ "aqz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aqA" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aqB" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aqC" = (/obj/machinery/camera{c_tag = "Brig West"; dir = 4; network = list("SS13")},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) +"aqC" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "dorm_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless,/area/maintenance/dormitory) "aqD" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/librarycomp{pixel_y = 0},/obj/structure/table,/turf/simulated/floor,/area/security/prison) "aqE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/security/prison) "aqF" = (/obj/structure/table,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor,/area/security/prison) "aqG" = (/obj/structure/table,/obj/item/weapon/dice,/turf/simulated/floor,/area/security/prison) "aqH" = (/obj/structure/table,/obj/item/ashtray/plastic,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "aqI" = (/obj/structure/reagent_dispensers/water_cooler,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/security/prison) -"aqJ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"aqJ" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement 2"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) "aqK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/security/prison) "aqL" = (/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/security/prison) "aqM" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/fore) "aqN" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/lobby) "aqO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/lobby) -"aqP" = (/obj/machinery/door_control{id = "visitdoor"; name = "Visitation Access"; normaldoorcontrol = 1; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/lobby) +"aqP" = (/obj/machinery/button/remote/airlock{id = "visitdoor"; name = "Visitation Access"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/lobby) "aqQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/security/lobby) "aqR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/junction/yjunction,/turf/simulated/floor,/area/security/lobby) "aqS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/lobby) @@ -879,10 +879,10 @@ "aqU" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "aqV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "aqW" = (/obj/structure/disposalpipe/segment,/obj/structure/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aqX" = (/obj/machinery/camera{c_tag = "Detective South"; dir = 1},/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) +"aqX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) "aqY" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -30},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "aqZ" = (/obj/structure/closet{name = "Evidence Closet"},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"ara" = (/obj/machinery/light,/obj/structure/table,/obj/item/device/mass_spectrometer,/obj/item/device/reagent_scanner,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) +"ara" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/eastright{base_state = "left"; dir = 4; icon_state = "left"; name = "Internal Affairs Desk"; req_access = list(38)},/turf/simulated/floor,/area/lawoffice) "arb" = (/obj/structure/table,/obj/machinery/newscaster{pixel_y = -32},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "arc" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/folder/blue,/obj/item/weapon/pen/blue{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "ard" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) @@ -891,49 +891,49 @@ "arg" = (/obj/structure/table,/obj/item/weapon/dice/d20,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/maintenance/dormitory) "arh" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dorm_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/dormitory) "ari" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"arj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_command{id_tag = "HoSdoor"; name = "Head of Security"; req_access = list(58)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) +"arj" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dorm_outer"; locked = 1; name = "Dormitory External Access"; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) "ark" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/evahallway) "arl" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "arm" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) -"arn" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) -"aro" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 1"; dir = 2; network = list("SS13","Prison")},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) +"arn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock{name = "Internal Affairs"; req_access = list(38)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/lawoffice) +"aro" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access = list(4)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/detectives_office) "arp" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) "arq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/security/prison) "arr" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor,/area/security/prison) "ars" = (/obj/structure/table,/obj/item/weapon/deck,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "art" = (/obj/structure/table,/obj/item/weapon/newspaper,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) "aru" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/security/prison) -"arv" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) -"arw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/prison) +"arv" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/network/security{c_tag = "Security - Brig West"; dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/brig) +"arw" = (/obj/structure/table,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/security/prison) "arx" = (/turf/simulated/wall/r_wall,/area/security/lobby) -"ary" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"arz" = (/obj/structure/closet/crate/secure{name = "FOR DISPOSAL"; req_access = list(58)},/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/balaclava,/obj/effect/decal/cleanable/cobweb2,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/ld50_syringe/choral,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_port) +"ary" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) +"arz" = (/obj/machinery/light,/obj/structure/table,/obj/item/device/mass_spectrometer,/obj/item/device/reagent_scanner,/obj/machinery/camera/network/security{c_tag = "Security - Forensic Office Aft"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) "arA" = (/turf/simulated/wall/r_wall,/area/hallway/primary/fore) "arB" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"arC" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/main) +"arC" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "dorm_airlock"; name = "Dormitory Airlock Console"; pixel_x = 25; pixel_y = 0; req_one_access = list(1,5,11,18,24); tag_airpump = "dorm_pump"; tag_chamber_sensor = "dorm_sensor"; tag_exterior_door = "dorm_outer"; tag_interior_door = "dorm_inner"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/dormitory) "arD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/solar/fore) "arE" = (/turf/simulated/wall,/area/hallway/primary/fore) -"arF" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/door_control{id = "lawyer_blast"; name = "Privacy Shutters"; pixel_y = -25},/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/storage/secure/briefcase,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) +"arF" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/button/remote/blast_door{id = "lawyer_blast"; name = "Privacy Shutters"; pixel_y = -25},/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/item/device/camera{pixel_x = 3; pixel_y = -4},/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/storage/secure/briefcase,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "arG" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"arH" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/structure/cable/green,/obj/machinery/camera{c_tag = "Internal Affairs Office"; dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) +"arH" = (/obj/item/weapon/stool,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/security{c_tag = "Security - Solitary Confinement South"},/turf/simulated/floor/plating,/area/security/brig) "arI" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/security/detectives_office) "arJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/dormitory) "arK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "arL" = (/turf/simulated/floor/wood{icon_state = "wood-broken4"},/area/maintenance/dormitory) "arM" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/lobby) "arN" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/maintenance/dormitory) -"arO" = (/obj/structure/table,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/storage/box/donut,/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main) -"arP" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/suit/armor/laserproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/laserproof{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"arO" = (/obj/machinery/button/remote/blast_door{id = "Cell 1"; name = "Cell 1 Door"; pixel_x = 30; pixel_y = 1; req_access = list(2)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/brig) +"arP" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera/network/prison{c_tag = "Security - Brig Cell 1"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) "arQ" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) "arR" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/brig) -"arS" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor{dir = 1; name = "Weapons locker"; req_access = list(3)},/obj/item/clothing/suit/armor/bulletproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/bulletproof{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/warden) +"arS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "visit_blast"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison) "arT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) "arU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) "arV" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/status_display{density = 0; layer = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "arW" = (/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) "arX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "arY" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/prison) -"arZ" = (/obj/item/weapon/stool,/obj/effect/decal/cleanable/dirt,/obj/machinery/camera{c_tag = "Solitary Confinement South"; dir = 2; network = list("SS13","Prison")},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/security/brig) +"arZ" = (/obj/machinery/door/airlock{name = "Visitation Area"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "asa" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/wood,/area/maintenance/dormitory) "asb" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) "asc" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor,/area/security/prison) @@ -947,7 +947,7 @@ "ask" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "asl" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/dormitory) "asm" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"asn" = (/obj/machinery/door_control{id = "Armoury"; name = "Emergency Access"; pixel_x = -28; pixel_y = 4; req_access = list(3)},/turf/simulated/floor,/area/security/main) +"asn" = (/obj/machinery/door/airlock{id_tag = "visitdoor"; name = "Visitation Area"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/lobby) "aso" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/dormitory) "asp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/dormitory) "asq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) @@ -961,7 +961,7 @@ "asy" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/security/prison) "asz" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/decal/cleanable/cobweb2,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/dormitory) "asA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"asB" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(63)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/main) +"asB" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/fore) "asC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) "asD" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1475; listening = 0; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = -30},/obj/item/device/radio/headset,/obj/item/device/radio/headset,/obj/item/device/radio/headset,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 10},/area/security/brig) "asE" = (/obj/item/device/radio/intercom{pixel_x = 30},/obj/machinery/door_timer/cell_1{pixel_x = 32; pixel_y = -32},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/brig) @@ -974,19 +974,19 @@ "asL" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "asM" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) "asN" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/central_one) -"asO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/highsecurity{name = "Secure Armoury Section"; req_access = list(3)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/warden) +"asO" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Security Lobby"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/fore) "asP" = (/obj/structure/bed,/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison) "asQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) -"asR" = (/obj/machinery/bot/secbot/beepsky{name = "Officer Beepsky"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/fore) +"asR" = (/obj/structure/disposalpipe/segment,/mob/living/bot/secbot/beepsky,/turf/simulated/floor,/area/hallway/primary/fore) "asS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "asT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/dormitory) "asU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "asV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) -"asW" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass{name = "Hydroponics Pasture"; req_access = list(28)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"asX" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/port) -"asY" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/primary/port) +"asW" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/structure/cable/green,/obj/machinery/camera/network/security{c_tag = "Security - IA Office"; dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) +"asX" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "dorm_inner"; locked = 1; name = "Dormitory Internal Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) +"asY" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/space) "asZ" = (/turf/simulated/wall/r_wall,/area/maintenance/dormitory) -"ata" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor/plating,/area/maintenance/dormitory) +"ata" = (/obj/structure/bed/chair{dir = 8},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/evahallway) "atb" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/dormitory) "atc" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/maintenance/dormitory) "atd" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/maintenance/dormitory) @@ -994,7 +994,7 @@ "atf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/dormitory) "atg" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "ath" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/security/prison) -"ati" = (/obj/machinery/button/flasher{id = "IAflash"; pixel_y = -30},/obj/machinery/door_control{id = "visit_blast"; name = "Privacy Shutters"; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/prison) +"ati" = (/obj/machinery/button/flasher{id = "IAflash"; pixel_y = -30},/obj/machinery/button/remote/blast_door{id = "visit_blast"; name = "Privacy Shutters"; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/prison) "atj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "atk" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod1/station) "atl" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/station) @@ -1020,22 +1020,22 @@ "atF" = (/turf/simulated/wall/r_wall,/area/crew_quarters/sleep/cryo) "atG" = (/obj/structure/cryofeed/right,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atH" = (/obj/machinery/cryopod/right,/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Crew Quarters"; pixel_y = 30},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"atI" = (/obj/machinery/camera{c_tag = "Cryogenic Storage"},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"atJ" = (/obj/machinery/computer/cryopod{density = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"atI" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement 1"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) +"atJ" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) "atK" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atL" = (/obj/machinery/cryopod,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atM" = (/obj/structure/cryofeed,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atN" = (/turf/simulated/wall/r_wall,/area/crew_quarters/fitness) "atO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "atP" = (/turf/simulated/wall,/area/crew_quarters/fitness) -"atQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera{c_tag = "Holodeck North"; dir = 2; network = list("SS13"); pixel_y = -6},/turf/simulated/floor/plating,/area/crew_quarters/fitness) +"atQ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "atR" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) "atS" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/fore) "atT" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station) "atU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "atV" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod2/station) "atW" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/arrivals) -"atX" = (/obj/machinery/door/airlock{name = "Kitchen cold room"; req_access = list(28)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) +"atX" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/dormitory) "atY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/arrivals) "atZ" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/wall,/area/maintenance/evahallway) "aua" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -1046,20 +1046,20 @@ "auf" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) "aug" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) "auh" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) -"aui" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"aui" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "dorm_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/dormitory) "auj" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor,/area/security/prison) "auk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/security/prison) "aul" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor,/area/security/prison) "aum" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = -6},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "aun" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/computer/cryopod{density = 0; layer = 3.3; pixel_y = 32},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 24},/turf/simulated/floor,/area/security/prison) -"auo" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/hydroponics/garden) +"auo" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aup" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/random/tech_supply,/obj/item/clothing/head/flatcap,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "auq" = (/obj/machinery/atm{pixel_x = -25},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "aur" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/fore) "aus" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "aut" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/security/prison) -"auu" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 8; icon_state = "right"; name = "Library Desk Door"; req_access = list(37)},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library) -"auv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/camera{c_tag = "Bedroom"; dir = 6; network = list("SS13","Prison")},/turf/simulated/floor,/area/security/prison) +"auu" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/brigdoor{name = "Visitation Window"; req_access = list(63)},/turf/simulated/floor,/area/security/prison) +"auv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/dormitory) "auw" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) "aux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "neutral"; dir = 9},/area/crew_quarters/sleep) "auy" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{icon_state = "neutral"; dir = 5},/area/crew_quarters/sleep) @@ -1082,16 +1082,16 @@ "auP" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/crew_quarters/fitness) "auQ" = (/turf/simulated/wall,/area/maintenance/arrivals) "auR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"auS" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"auS" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/dormitory) "auT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/arrivals) "auU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/arrivals) "auV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/arrivals) "auW" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/wall,/area/maintenance/evahallway) "auX" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/security/prison) -"auY" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) +"auY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "auZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) "ava" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 30},/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) -"avb" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/machinery/camera{c_tag = "Common Brig Southwest"; dir = 4; network = list("SS13")},/obj/item/weapon/pen,/turf/simulated/floor,/area/security/prison) +"avb" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/dormitory) "avc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "avd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/security/prison) "ave" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/prison) @@ -1118,10 +1118,10 @@ "avz" = (/obj/item/weapon/stool,/turf/simulated/floor,/area/security/prison) "avA" = (/obj/structure/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "avB" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod1/station) -"avC" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"avC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Holodeck North"; pixel_y = -6},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "avD" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape_pod1/station) "avE" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod2/station) -"avF" = (/obj/machinery/door/morgue{dir = 2; name = "Private Study"; req_access = list(37)},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) +"avF" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) "avG" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape_pod2/station) "avH" = (/turf/simulated/floor/plating,/area/maintenance/arrivals) "avI" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/arrivals) @@ -1133,14 +1133,14 @@ "avO" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/arrivals) "avP" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central_one) "avQ" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) -"avR" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/maintenance/locker) +"avR" = (/obj/machinery/computer/cryopod{density = 0; pixel_y = 32},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Cryo Storage"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) "avS" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eva_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/evahallway) -"avT" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "nuke_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "nuke_shuttle_dock_pump"; tag_chamber_sensor = "nuke_shuttle_dock_sensor"; tag_exterior_door = "nuke_shuttle_dock_outer"; tag_interior_door = "nuke_shuttle_dock_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry/port) -"avU" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"avT" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_1"; pixel_x = -25; pixel_y = 0; tag_door = "escape_pod_1_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"avU" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_2"; pixel_x = -25; pixel_y = 0; tag_door = "escape_pod_2_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) "avV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "avW" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/evahallway) "avX" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"avY" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) +"avY" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "arrivals_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "arrivals_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "arrivals_pump"; tag_exterior_door = "arrivals_outer"; frequency = 1379; id_tag = "arrivals_airlock"; tag_interior_door = "arrivals_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "arrivals_sensor"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals) "avZ" = (/obj/machinery/light/small,/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) "awa" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 30},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) "awb" = (/obj/structure/table,/obj/machinery/light{dir = 8},/obj/machinery/microwave,/turf/simulated/floor,/area/security/prison) @@ -1150,20 +1150,20 @@ "awf" = (/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/crew_quarters/fitness) "awg" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor,/area/security/prison) "awh" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/clothing/head/soft/orange,/obj/item/clothing/shoes/sandal,/turf/simulated/floor,/area/security/prison) -"awi" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "nuke_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 25; req_one_access = list(13)},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) +"awi" = (/obj/machinery/door/airlock{name = "Brig Restroom"},/turf/simulated/floor,/area/security/prison) "awj" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"awk" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access = list(12)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) +"awk" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/camera/network/prison{c_tag = "Security - Brig Bedroom"; dir = 6},/turf/simulated/floor,/area/security/prison) "awl" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,/obj/item/clothing/suit/apron/overalls,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "awm" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) -"awn" = (/obj/machinery/door/airlock{name = "Port Emergency Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/primary/port) -"awo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock{name = "Crematorium"; req_access = list(27)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"awn" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Bedroom Fore"},/turf/simulated/floor/carpet{tag = "icon-carpet2-0"; icon_state = "carpet2-0"},/area/crew_quarters/sleep/bedrooms) +"awo" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/arrivals) "awp" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor,/area/security/prison) "awq" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/port) "awr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) "aws" = (/obj/machinery/door/airlock/glass{name = "Cryogenic Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/crew_quarters/sleep/cryo) "awt" = (/obj/machinery/door/airlock/glass{name = "Cryogenic Storage"},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/crew_quarters/sleep/cryo) "awu" = (/obj/machinery/door/airlock/glass{name = "Cryogenic Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/crew_quarters/sleep/cryo) -"awv" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Fitness Room West"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/fitness) +"awv" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower/security,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) "aww" = (/turf/simulated/floor{dir = 6; icon_state = "whitehall"},/area/crew_quarters/fitness) "awx" = (/obj/machinery/light,/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor,/area/security/prison) "awy" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor,/area/security/prison) @@ -1180,12 +1180,12 @@ "awJ" = (/obj/structure/closet,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/arrivals) "awK" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/substation/security) "awL" = (/obj/item/weapon/stool{pixel_y = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/sleep) -"awM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/barman_recipes,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"awM" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/camera/network/prison{c_tag = "Security - Common Brig Southwest"; dir = 4},/turf/simulated/floor,/area/security/prison) "awN" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/plating,/area/maintenance/arrivals) "awO" = (/obj/structure/table/reinforced,/obj/machinery/door/blast/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "awP" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless,/area/maintenance/evahallway) "awQ" = (/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/evahallway) -"awR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eva_pump"},/obj/machinery/camera{c_tag = "EVA Airlock"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/evahallway) +"awR" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) "awS" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood/oil,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/evahallway) "awT" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/evahallway) "awU" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) @@ -1197,7 +1197,7 @@ "axa" = (/obj/machinery/door/airlock{id_tag = "Dormitory 1"; name = "Dorm"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "axb" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) "axc" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) -"axd" = (/obj/machinery/camera{c_tag = "Dormitories"},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) +"axd" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) "axe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) "axf" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) "axg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) @@ -1214,19 +1214,19 @@ "axr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/fitness) "axs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "axt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/crew_quarters/fitness) -"axu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera{c_tag = "Fitness Room East"; dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness) +"axu" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/arrivals) "axv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/fitness) -"axw" = (/obj/machinery/door/window/eastright{name = "Hydroponics Delivery"; icon_state = "right"; dir = 2; req_access = list(35)},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) +"axw" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/maintenance/evahallway) "axx" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/hallway/secondary/entry/fore) -"axy" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) +"axy" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_outer"; locked = 1; name = "EVA External Access"; req_access = list(13)},/turf/simulated/floor/airless{icon_state = "circuit"},/area/maintenance/evahallway) "axz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc/high{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry/port) -"axA" = (/obj/machinery/camera{c_tag = "Arrivals East"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry/port) +"axA" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/evahallway) "axB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"axC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(1,11,18,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_one) +"axC" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eva_airlock"; name = "EVA Airlock Console"; pixel_y = 25; req_one_access = list(1,5,11,18,24); tag_airpump = "eva_pump"; tag_chamber_sensor = "eva_sensor"; tag_exterior_door = "eva_outer"; tag_interior_door = "eva_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/evahallway) "axD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/evahallway) "axE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/evahallway) "axF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"axG" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/evahallway) +"axG" = (/obj/structure/grille/broken,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/evahallway) "axH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) "axI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) "axJ" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/table/rack,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/suit/storage/hazardvest,/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -1234,7 +1234,7 @@ "axL" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/evahallway) "axM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) "axN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"axO" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(1,11,18,24)},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_one) +"axO" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/evahallway) "axP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "axQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor,/area/hallway/primary/fore) "axR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) @@ -1262,7 +1262,7 @@ "ayn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "ayo" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/fore) "ayp" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_1_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_1_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/fore) -"ayq" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light{dir = 1},/obj/machinery/camera/xray{c_tag = "Arrivals Escape Pods"},/turf/simulated/floor,/area/hallway/secondary/entry/fore) +"ayq" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower/security,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) "ayr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_2_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_2_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/fore) "ays" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry/fore) "ayt" = (/obj/machinery/light{dir = 1},/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry/fore) @@ -1271,7 +1271,7 @@ "ayw" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "arrival"; dir = 5},/area/hallway/secondary/entry/fore) "ayx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/checkpoint2) "ayy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"ayz" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/port) +"ayz" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) "ayA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "ayB" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/evahallway) "ayC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -1285,12 +1285,12 @@ "ayK" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/evahallway) "ayL" = (/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) "ayM" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) -"ayN" = (/obj/structure/closet/coffin,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "chapel"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/door/window/eastleft{dir = 8; name = "Coffin Storage"; req_access = list(22)},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"ayO" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) +"ayN" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Fitness Room West"; dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/fitness) +"ayO" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) "ayP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) "ayQ" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) "ayR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) -"ayS" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Dormitory Bedroom Fore"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/carpet{tag = "icon-carpet2-0"; icon_state = "carpet2-0"},/area/crew_quarters/sleep/bedrooms) +"ayS" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "ayT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/sleep) "ayU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) "ayV" = (/obj/structure/closet/lasertag/blue,/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) @@ -1304,7 +1304,7 @@ "azd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/fitness) "aze" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/fitness) "azf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/crew_quarters/fitness) -"azg" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access = list(35)},/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hydroponics) +"azg" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eva_pump"},/obj/machinery/camera/network/security{c_tag = "Security Airlock Access"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/evahallway) "azh" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/undies_wardrobe,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) "azi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/crew_quarters/fitness) "azj" = (/obj/structure/grille,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness) @@ -1313,7 +1313,7 @@ "azm" = (/obj/item/weapon/stool{pixel_y = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "azn" = (/obj/structure/bed,/obj/item/weapon/bedsheet/mime,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "azo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) -"azp" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Kitchen Delivery"; req_access = list(28)},/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/kitchen) +"azp" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitories Central"},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) "azq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "azr" = (/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) "azs" = (/turf/simulated/floor,/area/hallway/secondary/entry/fore) @@ -1325,11 +1325,11 @@ "azy" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) "azz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) "azA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry/fore) -"azB" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_one_access = list(12,25,28)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/bar) +"azB" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "azC" = (/obj/structure/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 22; pixel_y = 10},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "azD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "azE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"azF" = (/obj/machinery/door/airlock{name = "Bar Backroom"; req_access = list(25)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/crew_quarters/bar) +"azF" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "azG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "azH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "azI" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -1344,14 +1344,14 @@ "azR" = (/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/evahallway) "azS" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "azT" = (/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"azU" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/hallway/primary/central_two) +"azU" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "azV" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva) "azW" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "azX" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "azY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "azZ" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aAa" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aAb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/engineering{name = "Civilian West Substation"; req_one_access = list(11,24)},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) +"aAb" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aAc" = (/obj/structure/table/rack,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/security,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/security,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aAd" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "aAe" = (/turf/simulated/floor/carpet{tag = "icon-carpet2-0"; icon_state = "carpet2-0"},/area/crew_quarters/sleep/bedrooms) @@ -1367,11 +1367,11 @@ "aAo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = -2; pixel_y = -28},/turf/simulated/floor{dir = 10; icon_state = "neutral"},/area/crew_quarters/fitness) "aAp" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/crew_quarters/fitness) "aAq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/fitness) -"aAr" = (/obj/machinery/camera{c_tag = "Fore Starboard Solars"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Fore Starboard"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aAr" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aAs" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Fore Port"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aAt" = (/obj/structure/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "aAu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) -"aAv" = (/obj/machinery/door/window{dir = 4; name = "Bar"; req_access = list(25)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aAv" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/fore) "aAw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aAx" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aAy" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/fore) @@ -1383,7 +1383,7 @@ "aAE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aAF" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport) "aAG" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Port Solar Control"; track = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"aAH" = (/obj/effect/landmark/start{name = "Bartender"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/carbon/human/monkey/punpun,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aAH" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_chapel_pump"; tag_exterior_door = "solar_chapel_outer"; frequency = 1379; id_tag = "solar_chapel_airlock"; tag_interior_door = "solar_chapel_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_chapel_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aAI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aAJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aAK" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -1402,9 +1402,9 @@ "aAX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aAY" = (/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) "aAZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness) -"aBa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera{c_tag = "Holodeck South"; dir = 1; pixel_y = 6},/turf/simulated/floor/plating,/area/crew_quarters/fitness) +"aBa" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light{dir = 1},/obj/machinery/camera/xray/security{c_tag = "Arrivals Escape Pods"},/turf/simulated/floor,/area/hallway/secondary/entry/fore) "aBb" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock{id_tag = "Dormitory 2"; name = "Dorm"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep) -"aBc" = (/obj/machinery/camera{c_tag = "Dormitory Bedroom Aft"; dir = 1},/turf/simulated/floor/carpet{tag = "icon-carpet1-0"; icon_state = "carpet1-0"},/area/crew_quarters/sleep/bedrooms) +"aBc" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "solar_tool_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_tool_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_tool_pump"; tag_exterior_door = "solar_tool_outer"; frequency = 1379; id_tag = "solar_tool_airlock"; tag_interior_door = "solar_tool_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_tool_sensor"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aBd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/sleep) "aBe" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/flora/pottedplant{tag = "icon-plant-22"; icon_state = "plant-22"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) "aBf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/crew_quarters/fitness) @@ -1412,7 +1412,7 @@ "aBh" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) "aBi" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{icon_state = "neutral"; dir = 6},/area/crew_quarters/sleep) "aBj" = (/turf/simulated/wall,/area/crew_quarters/toilet) -"aBk" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth (Chaplain)"; req_access = list(22)},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) +"aBk" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "E.V.A. Maintenance"; req_one_access = list(1,5,11,18,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aBl" = (/obj/machinery/light,/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/turf/simulated/floor{dir = 10; icon_state = "neutral"},/area/crew_quarters/fitness) "aBm" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) "aBn" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/athletic_mixed,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) @@ -1424,7 +1424,7 @@ "aBt" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/library) "aBu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aBv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) -"aBw" = (/obj/machinery/door/airlock/glass{name = "Chapel Office"; req_access = list(22)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"aBw" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Fore"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "aBx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aBy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aBz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/fore) @@ -1432,7 +1432,7 @@ "aBB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aBC" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/fore) "aBD" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aBE" = (/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) +"aBE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Fitness Room East"; dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness) "aBF" = (/obj/machinery/vending/coffee,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry/fore) "aBG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aBH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) @@ -1442,9 +1442,9 @@ "aBL" = (/turf/simulated/wall,/area/hallway/secondary/entry/port) "aBM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/checkpoint2) "aBN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/checkpoint2) -"aBO" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/arrivals) +"aBO" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aBP" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"aBQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Fore Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/library) +"aBQ" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry/fore) "aBR" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aBS" = (/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aBT" = (/obj/item/weapon/extinguisher,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -1458,11 +1458,11 @@ "aCb" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aCc" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/gateway) "aCd" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aCe" = (/obj/machinery/requests_console{department = "EVA"; pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/machinery/camera{c_tag = "EVA North"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aCe" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aCf" = (/turf/simulated/floor,/area/ai_monitored/storage/eva) "aCg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aCh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aCi" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/obj/machinery/camera{c_tag = "EVA East"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aCi" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Hardsuits"; req_access = list(5)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aCj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aCk" = (/obj/machinery/suit_cycler/security,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aCl" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) @@ -1473,7 +1473,7 @@ "aCq" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aCr" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aCs" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aCt" = (/obj/machinery/door/airlock/glass{name = "Hydroponics Pasture"; req_access = list(35)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hydroponics) +"aCt" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Security Hardsuits"; req_access = list(1)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aCu" = (/turf/simulated/wall,/area/maintenance/substation/civilian_east) "aCv" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard) "aCw" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Starboard Solar Control"; track = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/auxsolarstarboard) @@ -1483,15 +1483,15 @@ "aCA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aCB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aCC" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aCD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/reinforced,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aCD" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarstarboard) "aCE" = (/turf/simulated/wall,/area/security/checkpoint2) "aCF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/arrivals) "aCG" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals) -"aCH" = (/obj/machinery/camera{c_tag = "Fore Port Solar Control"; dir = 1},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) +"aCH" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aCI" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"aCJ" = (/obj/machinery/camera{c_tag = "Fore Port Solar Access"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aCJ" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aCK" = (/turf/simulated/wall,/area/storage/primary) -"aCL" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aCL" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals North"; dir = 1},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) "aCM" = (/turf/simulated/wall/r_wall,/area/storage/primary) "aCN" = (/obj/structure/closet/secure_closet/freezer/money,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aCO" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 6},/area/security/nuke_storage) @@ -1508,10 +1508,10 @@ "aCZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aDa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aDb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"aDc" = (/obj/structure/table,/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor,/area/security/vacantoffice) +"aDc" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/arrivals) "aDd" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) "aDe" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/substation/civilian_east) -"aDf" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 25; req_one_access = list(13)},/turf/space,/area/space) +"aDf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals) "aDg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) "aDh" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aDi" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) @@ -1519,18 +1519,18 @@ "aDk" = (/obj/structure/urinal{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aDl" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aDm" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aDn" = (/obj/machinery/camera{c_tag = "Bar Storage"},/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/packageWrap,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aDn" = (/obj/machinery/requests_console{department = "EVA"; pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/machinery/camera/network/security{c_tag = "EVA Northwest"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) "aDo" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/gun/projectile/shotgun/doublebarrel,/obj/item/weapon/paper{info = "This permit signifies that the Bartender is permitted to posess this firearm in the bar, and ONLY the bar. Failure to adhere to this permit will result in confiscation of the weapon and possibly arrest."; name = "Shotgun permit"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aDp" = (/turf/simulated/wall,/area/crew_quarters/bar) "aDq" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/bar) -"aDr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals) +"aDr" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary) "aDs" = (/turf/simulated/wall,/area/maintenance/bar) -"aDt" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary) -"aDu" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/weapon/storage/belt/champion,/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage) -"aDv" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Civilian East"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) +"aDt" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/weapon/storage/belt/champion,/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage) +"aDu" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Civilian East"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) +"aDv" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Civilian East Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) "aDw" = (/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) -"aDx" = (/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = list(19)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/bridge/meeting_room) -"aDy" = (/obj/machinery/door/airlock/command{id_tag = "captaindoor"; name = "Captain's Office"; req_access = list(20)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"aDx" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aDy" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "aDz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep) "aDA" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aDB" = (/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) @@ -1548,7 +1548,7 @@ "aDN" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/arrival/station) "aDO" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/arrival/station) "aDP" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aDQ" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Warehouse Maintenance"; req_access = list(31)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/quartermaster/storage) +"aDQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Fore Starboard"},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Starboard"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aDR" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light{dir = 1},/obj/item/device/flashlight/flare,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/checkpoint2) "aDS" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint2) "aDT" = (/obj/machinery/computer/security,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint2) @@ -1556,13 +1556,13 @@ "aDV" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint2) "aDW" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/checkpoint2) "aDX" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/arrivals) -"aDY" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "kitchen"; layer = 3.3; name = "Kitchen Shutters"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/hallway/primary/starboard) +"aDY" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Port"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aDZ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport) "aEa" = (/obj/machinery/vending/assist,/turf/simulated/floor,/area/storage/primary) "aEb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/primary) "aEc" = (/obj/structure/table,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) "aEd" = (/obj/structure/table,/obj/machinery/alarm{pixel_y = 23},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) -"aEe" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Primary Tool Storage"},/obj/machinery/requests_console{department = "Tool Storage"; departmentType = 0; pixel_y = 30},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) +"aEe" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/primary) "aEf" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) "aEg" = (/obj/structure/table,/obj/machinery/light_switch{pixel_y = 28},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) "aEh" = (/obj/structure/table,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) @@ -1579,14 +1579,14 @@ "aEs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aEt" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/gateway) "aEu" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aEv" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "exterior access button"; pixel_x = 5; pixel_y = -25; req_one_access = list(13)},/turf/space,/area/space) +"aEv" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aEw" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) "aEx" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aEy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aEz" = (/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aEA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aEB" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/clothing/shoes/magboots,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aEC" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"aEC" = (/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Bedroom Aft"; dir = 1},/turf/simulated/floor/carpet{tag = "icon-carpet1-0"; icon_state = "carpet1-0"},/area/crew_quarters/sleep/bedrooms) "aED" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central_one) "aEE" = (/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/hallway/primary/central_one) "aEF" = (/obj/structure/table/woodentable,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/tape_roll,/turf/simulated/floor/wood,/area/library) @@ -1596,16 +1596,16 @@ "aEJ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aEK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aEL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aEM" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/security/vacantoffice) +"aEM" = (/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/packageWrap,/obj/machinery/camera/network/civilian_east{c_tag = "Bar Backroom"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aEN" = (/obj/machinery/light/small,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aEO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aEP" = (/obj/item/weapon/storage/secure/safe{pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aEQ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aER" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aES" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donut,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"aES" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Holodeck South"; dir = 1; pixel_y = 6},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "aET" = (/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j1s"; sortType = "Bar"; name = "Bar"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/bar) "aEU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) -"aEV" = (/obj/machinery/camera{c_tag = "Dormitory South"; c_tag_order = 999; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) +"aEV" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Starboard Solar Access"; req_access = list(10)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aEW" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/library) "aEX" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aEY" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) @@ -1617,7 +1617,7 @@ "aFe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/library) "aFf" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/library) "aFg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/library) -"aFh" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/library) +"aFh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/exodus{c_tag = "Arrivals East"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry/port) "aFi" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/library) "aFj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/maintenance/library) "aFk" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/arrival/station) @@ -1640,11 +1640,11 @@ "aFB" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aFC" = (/turf/simulated/wall,/area/maintenance/substation/civilian_west) "aFD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"aFE" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aFE" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access = list(10)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aFF" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/entry/port) -"aFG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_south_airlock"; master_tag = "escape_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_south_mech"; tag_airpump = "escape_dock_south_pump"; tag_chamber_sensor = "escape_dock_south_sensor"; tag_exterior_door = "escape_dock_south_outer"; tag_interior_door = "escape_dock_south_inner"; tag_shuttle_mech_sensor = "shuttle_dock_south_mech"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_south_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aFG" = (/obj/structure/table,/obj/machinery/requests_console{department = "Tool Storage"; departmentType = 0; pixel_y = 30},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/camera/network/civilian_west{c_tag = "Tool Storage - Primary"},/turf/simulated/floor,/area/storage/primary) "aFH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) -"aFI" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aFI" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hardsuits"; req_one_access = list(11,24)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aFJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/storage/primary) "aFK" = (/obj/effect/landmark/start{name = "Assistant"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/storage/primary) "aFL" = (/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary) @@ -1654,38 +1654,38 @@ "aFP" = (/obj/item/weapon/stool,/turf/simulated/floor,/area/gateway) "aFQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"},/area/security/nuke_storage) "aFR" = (/obj/item/weapon/coin/silver{pixel_x = 7; pixel_y = 12},/obj/item/weapon/coin/silver{pixel_x = 12; pixel_y = 7},/obj/item/weapon/coin/silver{pixel_x = 4; pixel_y = 8},/obj/item/weapon/coin/silver{pixel_x = -6; pixel_y = 5},/obj/item/weapon/coin/silver{pixel_x = 5; pixel_y = -8},/obj/structure/closet/crate{name = "Silver Crate"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/security/nuke_storage) -"aFS" = (/obj/machinery/camera{c_tag = "Gateway"; dir = 4; network = list("SS13")},/obj/machinery/vending/coffee,/turf/simulated/floor,/area/gateway) +"aFS" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aFT" = (/turf/simulated/floor,/area/gateway) "aFU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/gateway) "aFV" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/closet/wardrobe/xenos,/turf/simulated/floor,/area/gateway) "aFW" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aFX" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) "aFY" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aFZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_one_access = list(13)},/turf/simulated/floor,/area/hallway/secondary/exit) +"aFZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access = list(25)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/bar) "aGa" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aGb" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) "aGc" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) "aGd" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) "aGe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/turf/simulated/wall,/area/hallway/secondary/entry/port) -"aGf" = (/obj/machinery/camera{c_tag = "Arrivals West"},/turf/simulated/floor,/area/hallway/secondary/entry/port) +"aGf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Starboard Access"; dir = 1},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/library) "aGg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aGh" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry/port) "aGi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aGj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep) -"aGk" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "nuke_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 32; req_one_access = list(13)},/turf/space,/area/space) +"aGk" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/library) "aGl" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aGm" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aGn" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/crew_quarters/toilet) "aGo" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aGp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aGq" = (/obj/structure/closet/gmcloset{icon_closed = "black"; icon_state = "black"; name = "formal wardrobe"},/obj/item/device/eftpos{eftpos_name = "Bar EFTPOS scanner"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aGr" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/starboard) +"aGq" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/checkpoint2) +"aGr" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aGs" = (/turf/simulated/floor/plating,/area/maintenance/bar) "aGt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/bar) "aGu" = (/obj/item/weapon/cigbutt,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aGv" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) "aGw" = (/obj/effect/decal/cleanable/dirt,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/bar) -"aGx" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Bridge East"; dir = 2},/obj/item/weapon/storage/box/donut,/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge) +"aGx" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Port Access"},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aGy" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard) "aGz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) "aGA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/library) @@ -1695,7 +1695,7 @@ "aGE" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/library) "aGF" = (/turf/simulated/wall,/area/chapel/office) "aGG" = (/turf/simulated/wall,/area/chapel/main) -"aGH" = (/obj/machinery/light/small,/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_north_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_north_mech"; tag_airpump = "escape_dock_north_pump"; tag_chamber_sensor = "escape_dock_north_sensor"; tag_exterior_door = "escape_dock_north_outer"; tag_interior_door = "escape_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_north_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aGH" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/primary) "aGI" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station) "aGJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/library) "aGK" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/arrival/station) @@ -1703,13 +1703,13 @@ "aGM" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/arrival/station) "aGN" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/arrival/station) "aGO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aGP" = (/obj/machinery/camera{c_tag = "Security Checkpoint"; dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 10},/area/security/checkpoint2) +"aGP" = (/obj/machinery/vending/coffee,/obj/machinery/camera/network/civilian_west{c_tag = "Gateway Arrival Area"; dir = 4},/turf/simulated/floor,/area/gateway) "aGQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) "aGR" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2) "aGS" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2) "aGT" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2) "aGU" = (/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint2) -"aGV" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_north_mech"; pixel_y = -19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aGV" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(1,5,11,18,24)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aGW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) "aGX" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aGY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/secondary/entry/port) @@ -1748,8 +1748,8 @@ "aHF" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aHG" = (/obj/machinery/light/small{dir = 8},/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aHH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aHI" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/exit) -"aHJ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_north_mech"; pixel_y = -19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aHI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitories South"; dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) +"aHJ" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep) "aHK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/bar) "aHL" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/bar) "aHM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/bar) @@ -1764,22 +1764,22 @@ "aHV" = (/obj/structure/closet,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/bar) "aHW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/bar) "aHX" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = "Hydroponics"; name = "Hydroponics"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/bar) -"aHY" = (/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) +"aHY" = (/obj/structure/closet/gmcloset{icon_closed = "black"; icon_state = "black"; name = "formal wardrobe"},/obj/item/device/eftpos{eftpos_name = "Bar EFTPOS scanner"},/obj/machinery/light/small{dir = 4},/obj/item/glass_jar,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aHZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/bar) "aIa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/bar) "aIb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library) -"aIc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/locker) +"aIc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/bar) "aId" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/simulated/floor/wood,/area/library) "aIe" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/packageWrap,/turf/simulated/floor/wood,/area/library) "aIf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/wood,/area/library) "aIg" = (/turf/simulated/wall,/area/library) -"aIh" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) +"aIh" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/bar) "aIi" = (/obj/structure/closet/wardrobe/chaplain_black,/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aIj" = (/obj/machinery/light/small{dir = 1},/obj/machinery/requests_console{department = "Chapel"; departmentType = 2; pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aIk" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Chapel Office"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aIl" = (/obj/machinery/door_control{id = "chapel"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) +"aIk" = (/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance"; req_one_access = list(12,22)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/chapel/main) +"aIl" = (/obj/machinery/button/remote/blast_door{id = "chapel"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aIm" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/rag,/obj/structure/noticeboard{pixel_x = -30; pixel_y = 0},/obj/machinery/door/blast/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aIn" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"aIn" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/camera/network/security{c_tag = "Security - Arrival Checkpoint"; dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 10},/area/security/checkpoint2) "aIo" = (/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aIp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aIq" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) @@ -1791,16 +1791,16 @@ "aIw" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station) "aIx" = (/obj/effect/landmark{name = "Observer-Start"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aIy" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) -"aIz" = (/obj/machinery/camera{c_tag = "Arrivals Lounge"; dir = 2},/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) +"aIz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Civilian West Substation"; req_one_access = list(11,24)},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) "aIA" = (/turf/simulated/wall,/area/hallway/secondary/entry/starboard) "aIB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aIC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/starboard) -"aID" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"aID" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) "aIE" = (/obj/structure/sign/double/map/left,/turf/simulated/wall,/area/hallway/secondary/entry/starboard) "aIF" = (/obj/structure/sign/double/map/right,/turf/simulated/wall,/area/hallway/secondary/entry/starboard) "aIG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aIH" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aII" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"aII" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) "aIJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aIK" = (/obj/structure/table,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) "aIL" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/storage/primary) @@ -1817,7 +1817,7 @@ "aIW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aIX" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aIY" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aIZ" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "centcom_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "centcom_shuttle_dock_pump"; tag_chamber_sensor = "centcom_shuttle_dock_sensor"; tag_exterior_door = "centcom_shuttle_dock_outer"; tag_interior_door = "centcom_shuttle_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "centcom_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "centcom_shuttle_dock_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"aIZ" = (/obj/item/device/radio/intercom{pixel_x = 25},/obj/structure/window/reinforced,/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aJa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aJb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aJc" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) @@ -1827,7 +1827,7 @@ "aJg" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/central_one) "aJh" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) "aJi" = (/turf/simulated/wall/r_wall,/area/hallway/primary/central_two) -"aJj" = (/obj/structure/bed/chair/office/dark,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera{c_tag = "Library North"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/library) +"aJj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/bar) "aJk" = (/obj/structure/bed/chair/office/dark,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library) "aJl" = (/turf/simulated/wall,/area/hallway/primary/central_two) "aJm" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) @@ -1836,42 +1836,42 @@ "aJp" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aJq" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aJr" = (/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = -28; pixel_y = 4},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aJs" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/door_control{id = "kitchen"; name = "Kitchen Shutters Control"; pixel_x = -1; pixel_y = -24; req_access = list(28)},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"aJs" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/bar) "aJt" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/crew_quarters/bar) "aJu" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/substation/command) "aJv" = (/obj/effect/landmark{name = "blobstart"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/bar) -"aJw" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"aJw" = (/obj/machinery/door/airlock/maintenance{name = "Library Maintenance"; req_one_access = list(12,37)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/library) "aJx" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Kitchen"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/bar) "aJy" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/bar) "aJz" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/bar) "aJA" = (/obj/effect/landmark/start{name = "Chaplain"},/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aJB" = (/obj/machinery/button/driver{id = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 25},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) +"aJB" = (/obj/machinery/button/remote/driver{id = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 25},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aJC" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aJD" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "aJE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "aJF" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "aJG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Civilian West"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) -"aJH" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access = list(19)},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) +"aJH" = (/obj/machinery/door/airlock/maintenance{name = "Crematorium Maintenance"; req_access = list(27)},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/chapel/office) "aJI" = (/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/library) "aJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/library) "aJK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/hallway/primary/central_two) -"aJL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/library) +"aJL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aJM" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/library) "aJN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library) "aJO" = (/obj/structure/crematorium,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aJP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aJQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aJR" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/wood,/area/library) +"aJR" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/library) "aJS" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/storage/fancy/crayons,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aJT" = (/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aJU" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aJV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aJW" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) +"aJW" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/wood,/area/library) "aJX" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station) "aJY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) "aJZ" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Civilian West"; name_tag = "Civilian West Subgrid"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) "aKa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/power/breakerbox/activated{RCon_tag = "Civilian West Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) -"aKb" = (/obj/structure/disposalpipe/segment,/obj/machinery/button/crematorium{pixel_x = 25},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"aKb" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) "aKc" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2) "aKd" = (/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aKe" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/storage/emergency2) @@ -1879,9 +1879,9 @@ "aKg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/locker) "aKh" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/locker) "aKi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/locker) -"aKj" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access = list(19)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) +"aKj" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel Office"},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aKk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/locker) -"aKl" = (/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = -1; pixel_y = -24; req_access = list(19)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"aKl" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access = list(22)},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aKm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/primary) "aKn" = (/turf/simulated/floor,/area/storage/primary) "aKo" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/storage/primary) @@ -1903,38 +1903,38 @@ "aKE" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aKF" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) "aKG" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"aKH" = (/obj/machinery/camera{c_tag = "EVA South"; dir = 1},/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/ai_monitored/storage/eva) +"aKH" = (/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access = list(22)},/obj/machinery/mass_driver{dir = 4; id = "chapelgun"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/airlock_sensor{pixel_y = 25},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/chapel/main) "aKI" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aKJ" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "aKK" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aKL" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/rig/unathi,/obj/item/clothing/mask/breath,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aKM" = (/obj/machinery/door/airlock/glass_command{id_tag = "sbridgedoor"; name = "Bridge"; req_access = list(19)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/bridge) +"aKM" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = list(1)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aKN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/central_one) "aKO" = (/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aKP" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Central Hallway North"; dir = 2},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/security{dir = 1; icon_state = "direction_sec"; pixel_y = 40; tag = "icon-direction_sec (NORTH)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one) -"aKQ" = (/obj/machinery/door/airlock/glass_command{id_tag = "sbridgedoor"; name = "Bridge"; req_access = list(19)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) +"aKP" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Security Checkpoint"; req_access = list(63)},/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/entry/starboard) +"aKQ" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A. Cycler Access"; req_one_access = list(1,5,11,18,24)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aKR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aKS" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_two) -"aKT" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"aKU" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "exterior access button"; pixel_x = 5; pixel_y = 25; req_one_access = list(13)},/turf/space,/area/space) -"aKV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"aKT" = (/obj/structure/disposalpipe/segment,/obj/machinery/button/crematorium{pixel_x = 25},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"aKU" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) +"aKV" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aKW" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aKX" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"aKY" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "arrivals_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/arrivals) +"aKX" = (/obj/machinery/door/window/southleft{name = "Bar Delivery"; icon_state = "left"; dir = 8; req_access = list(25); base_state = "left"},/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/bar) +"aKY" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitchen Cold Room Maintenance"; req_access = list(28)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/bar) "aKZ" = (/turf/simulated/wall,/area/crew_quarters/kitchen) "aLa" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aLb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aLc" = (/obj/structure/closet/chefcloset,/obj/machinery/light/small{dir = 1},/obj/item/device/eftpos{eftpos_name = "Kitchen EFTPOS scanner"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aLd" = (/obj/machinery/camera{c_tag = "Kitchen Cold Room"},/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aLe" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) +"aLc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Bar\\Library Maintenance"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library) +"aLd" = (/obj/structure/bed/chair/office/dark,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera/network/civilian_east{c_tag = "Library North"},/turf/simulated/floor/wood,/area/library) +"aLe" = (/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/exodus{c_tag = "Arrivals Lounge"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aLf" = (/turf/simulated/wall,/area/hydroponics) "aLg" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/hydroponics) "aLh" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/hydroponics) -"aLi" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"aLi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/engineering{name = "Civilian West Substation"; req_one_access = list(11,24)},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) "aLj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/wood,/area/library) -"aLk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_outer"; locked = 1; name = "EVA External Access"; req_access = list(13)},/turf/simulated/floor/airless{icon_state = "circuit"},/area/maintenance/evahallway) +"aLk" = (/obj/structure/dispenser/oxygen,/obj/machinery/camera/network/security{c_tag = "EVA South"; dir = 1},/turf/simulated/floor,/area/ai_monitored/storage/eva) "aLl" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) -"aLm" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access = list(1,11,18,24)},/turf/simulated/floor/plating/airless,/area/maintenance/evahallway) +"aLm" = (/obj/machinery/light{dir = 1},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/security{dir = 1; icon_state = "direction_sec"; pixel_y = 40; tag = "icon-direction_sec (NORTH)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - North"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one) "aLn" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/hallway/primary/central_two) "aLo" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/wood,/area/library) "aLp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) @@ -1972,11 +1972,11 @@ "aLV" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/hallway/primary/port) "aLW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/hallway/primary/port) "aLX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/primary/port) -"aLY" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access = list(1,11,18,24)},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/evahallway) +"aLY" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/hallway/primary/central_two) "aLZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/port) "aMa" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Gateway Access"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port) "aMb" = (/turf/simulated/wall,/area/hallway/primary/central_one) -"aMc" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eva_airlock"; name = "EVA Airlock Console"; pixel_y = 25; req_one_access = list(1,5,11,18,24); tag_airpump = "eva_pump"; tag_chamber_sensor = "eva_sensor"; tag_exterior_door = "eva_outer"; tag_interior_door = "eva_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/evahallway) +"aMc" = (/obj/machinery/door/airlock{name = "Bar Backroom"; req_access = list(25)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/crew_quarters/bar) "aMd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aMe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/sign/securearea,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aMf" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) @@ -1995,8 +1995,8 @@ "aMs" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/light{dir = 1},/obj/machinery/smartfridge/drinks,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aMt" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aMu" = (/obj/structure/reagent_dispensers/beerkeg,/obj/machinery/requests_console{announcementConsole = 0; department = "Bar"; departmentType = 2; name = "Bar RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aMv" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Bar North"; dir = 2},/obj/machinery/vending/boozeomat,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aMw" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eva_inner"; locked = 1; name = "EVA Internal Access"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/evahallway) +"aMv" = (/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_one_access = list(12,25,28)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/bar) +"aMw" = (/obj/structure/closet/chefcloset,/obj/machinery/light/small{dir = 1},/obj/item/device/eftpos{eftpos_name = "Kitchen EFTPOS scanner"},/obj/item/glass_jar,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aMx" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) "aMy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aMz" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) @@ -2004,8 +2004,8 @@ "aMB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aMC" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aMD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aME" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) -"aMF" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera{c_tag = "Hydroponics Pasture"},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"aME" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Kitchen Delivery"; req_access = list(28)},/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/kitchen) +"aMF" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera/network/civilian_east{c_tag = "Kitchen Cold Room"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aMG" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aMH" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aMI" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) @@ -2021,14 +2021,14 @@ "aMS" = (/obj/structure/table/woodentable,/obj/structure/disposalpipe/segment,/obj/item/weapon/deck,/turf/simulated/floor/wood,/area/library) "aMT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 1},/area/hallway/primary/central_two) "aMU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/wood,/area/library) -"aMV" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Chapel Crematorium"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) +"aMV" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access = list(35)},/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hydroponics) "aMW" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aMX" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aMX" = (/obj/structure/closet/coffin,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "chapel"; name = "Privacy Shutters"; opacity = 0},/obj/machinery/door/window/eastleft{dir = 8; name = "Coffin Storage"; req_access = list(22)},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aMY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aMZ" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) "aNb" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aNc" = (/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Chapel North"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) +"aNc" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/port) "aNd" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aNe" = (/obj/structure/table,/obj/machinery/light/small,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) "aNf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/chapel/main) @@ -2052,13 +2052,13 @@ "aNx" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/port) "aNy" = (/obj/machinery/light{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/port) "aNz" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) -"aNA" = (/obj/machinery/camera{c_tag = "Port Hallway 2"; dir = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) +"aNA" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aNB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) "aNC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) "aND" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/primary/port) "aNE" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) "aNF" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/hallway/primary/port) -"aNG" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/turf/simulated/floor,/area/hallway/primary/port) +"aNG" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aNH" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port) "aNI" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port) "aNJ" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_one) @@ -2067,7 +2067,7 @@ "aNM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_one) "aNN" = (/obj/machinery/light{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_one) "aNO" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_one) -"aNP" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera{c_tag = "Central Hallway North-West"; dir = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_one) +"aNP" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(1,11,18,24)},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_one) "aNQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one) "aNR" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one) "aNS" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one) @@ -2075,7 +2075,7 @@ "aNU" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central_one) "aNV" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "L1"},/area/hallway/primary/central_one) "aNW" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "L3"},/area/hallway/primary/central_one) -"aNX" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "nuke_shuttle_dock_pump"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aNX" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(1,11,18,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_one) "aNY" = (/turf/simulated/floor{icon_state = "L7"},/area/hallway/primary/central_one) "aNZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "L9"},/area/hallway/primary/central_one) "aOa" = (/turf/simulated/floor{icon_state = "L11"},/area/hallway/primary/central_one) @@ -2086,17 +2086,17 @@ "aOf" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library) "aOg" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/obj/random/single{icon = 'icons/obj/drinks.dmi'; icon_state = "cola"; name = "randomly spawned cola"; spawn_nothing_percentage = 50; spawn_object = /obj/item/weapon/reagent_containers/food/drinks/cans/cola},/turf/simulated/floor/carpet,/area/hallway/secondary/entry/starboard) "aOh" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 1},/area/hallway/primary/central_two) -"aOi" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Central Hallway North-East"; dir = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_two) +"aOi" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/vending/boozeomat,/obj/machinery/camera/network/civilian_east{c_tag = "Bar North"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aOj" = (/obj/machinery/light{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_two) "aOk" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_two) "aOl" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_two) "aOm" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_two) "aOn" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/primary/central_two) -"aOo" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/door_control{id = "bar"; name = "Bar Shutters"; pixel_y = 25; throw_range = 15},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aOp" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) -"aOq" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_chapel_pump"; tag_exterior_door = "solar_chapel_outer"; frequency = 1379; id_tag = "solar_chapel_airlock"; tag_interior_door = "solar_chapel_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_chapel_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aOo" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/button/remote/blast_door{id = "bar"; name = "Bar Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aOp" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/barman_recipes,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aOq" = (/obj/machinery/door/window/eastright{name = "Hydroponics Delivery"; icon_state = "right"; dir = 2; req_access = list(35)},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) "aOr" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aOs" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) +"aOs" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) "aOt" = (/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aOu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/flame/lighter/zippo,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aOv" = (/obj/structure/table/woodentable,/obj/random/single{icon = 'icons/obj/playing_cards.dmi'; icon_state = "deck"; name = "randomly spawned deck of cards"; spawn_nothing_percentage = 50; spawn_object = /obj/item/weapon/deck},/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) @@ -2106,17 +2106,17 @@ "aOz" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aOA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aOB" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aOC" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics) +"aOC" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel Crematorium"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aOD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) "aOE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) "aOF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) "aOG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/hydroponics) -"aOH" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) +"aOH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock{name = "Crematorium"; req_access = list(27)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aOI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics) "aOJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) "aOK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) "aOL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics) -"aOM" = (/obj/machinery/camera/autoname{dir = 8},/obj/item/device/radio/intercom{pixel_x = 25},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/hydroponics) +"aOM" = (/obj/machinery/light{dir = 8},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel North"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aON" = (/turf/simulated/floor/wood,/area/library) "aOO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/library) "aOP" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) @@ -2184,8 +2184,8 @@ "aPZ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/primary/central_two) "aQa" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aQb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aQc" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) -"aQd" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/fore) +"aQc" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - Central"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) +"aQd" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Northwest"},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_one) "aQe" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aQf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aQg" = (/obj/machinery/light/small{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/woodentable,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar) @@ -2205,19 +2205,19 @@ "aQu" = (/obj/machinery/bookbinder{pixel_y = 0},/turf/simulated/floor/wood,/area/library) "aQv" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library) "aQw" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/library) -"aQx" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"aQy" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aQx" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Northeast"},/turf/simulated/floor,/area/hallway/primary/central_two) +"aQy" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aQz" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aQA" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "E.V.A. Maintenance"; req_one_access = list(1,5,11,18,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) +"aQA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/reinforced,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aQB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aQC" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aQD" = (/obj/machinery/vending/snack,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aQE" = (/obj/item/device/radio/beacon,/obj/machinery/camera{c_tag = "Arrivals South"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aQE" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/camera/network/civilian_east{c_tag = "Hydroponics Pasture West"; dir = 4},/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics) "aQF" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/port) "aQG" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry/port) "aQH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aQI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aQJ" = (/obj/machinery/camera{c_tag = "Arrivals Center"; dir = 4; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aQJ" = (/obj/machinery/door/airlock/glass{name = "Hydroponics Pasture"; req_access = list(35)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hydroponics) "aQK" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1480; name = "Confessional Intercom"; pixel_x = 25},/obj/structure/bed/chair{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aQL" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/hallway/secondary/entry/starboard) "aQM" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/entry/starboard) @@ -2227,7 +2227,7 @@ "aQQ" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor,/area/hallway/primary/port) "aQR" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/port) "aQS" = (/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/port) -"aQT" = (/obj/machinery/camera{c_tag = "Port Hallway 3"; dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/port) +"aQT" = (/obj/item/device/radio/intercom{pixel_x = 25},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/civilian_east{c_tag = "Hydroponics Pasture East"; dir = 8},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/hydroponics) "aQU" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) "aQV" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) "aQW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port) @@ -2235,7 +2235,7 @@ "aQY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/port) "aQZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port) "aRa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/port) -"aRb" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port) +"aRb" = (/obj/effect/landmark/start{name = "Bartender"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/carbon/human/monkey/punpun,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aRc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/port) "aRd" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/port) "aRe" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) @@ -2251,13 +2251,13 @@ "aRo" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) "aRp" = (/turf/simulated/floor,/area/hallway/primary/central_two) "aRq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_two) -"aRr" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "solar_tool_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_tool_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_tool_pump"; tag_exterior_door = "solar_tool_outer"; frequency = 1379; id_tag = "solar_tool_airlock"; tag_interior_door = "solar_tool_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_tool_sensor"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) +"aRr" = (/obj/machinery/door/window{dir = 4; name = "Bar"; req_access = list(25)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aRs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/blast/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aRt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 8; id = "office_shutter"; layer = 3.1; name = "Office Shutters"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "aRu" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aRv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aRw" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"aRx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/dormitory) +"aRx" = (/obj/machinery/door/airlock/glass{name = "Chapel Office"; req_access = list(22)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "aRy" = (/obj/structure/table,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) "aRz" = (/obj/machinery/biogenerator,/turf/simulated/floor,/area/hydroponics) "aRA" = (/obj/machinery/seed_extractor,/turf/simulated/floor,/area/hydroponics) @@ -2300,27 +2300,27 @@ "aSl" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) "aSm" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/entry/starboard) "aSn" = (/obj/structure/cable/green,/obj/machinery/power/apc/high{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aSo" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) +"aSo" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth (Chaplain)"; req_access = list(22)},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aSp" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor,/area/hallway/primary/port) "aSq" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) "aSr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/port) "aSs" = (/obj/machinery/door/airlock/glass{name = "Art Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/port) -"aSt" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"aSu" = (/obj/structure/table,/turf/simulated/floor,/area/hallway/primary/port) +"aSt" = (/obj/item/device/radio/beacon,/obj/machinery/camera/network/exodus{c_tag = "Arrivals South"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aSu" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southeast"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) "aSv" = (/obj/structure/table,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port) "aSw" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port) "aSx" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port) -"aSy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor,/area/hallway/primary/port) +"aSy" = (/obj/structure/sign/directions/security{dir = 4; icon_state = "direction_sec"; pixel_y = 4; tag = "icon-direction_sec (EAST)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = -4; tag = "icon-direction_med (EAST)"},/turf/simulated/wall,/area/hallway/primary/port) "aSz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_one) "aSA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aSB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aSC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aSD" = (/obj/structure/bed/chair{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/bridge) -"aSE" = (/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/sensor{name = "Powernet Sensor - AI Subgrid"; name_tag = "AI Subgrid"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"aSE" = (/obj/machinery/door/airlock/freezer{name = "Kitchen cold room"; req_access = list(28)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aSF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 8; id = "office_shutter"; layer = 3.1; name = "Office Shutters"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "aSG" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "kitchen"; layer = 3.3; name = "Kitchen Shutters"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/hallway/primary/starboard) -"aSH" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/brigdoor{name = "Visitation Window"; req_access = list(63)},/turf/simulated/floor,/area/security/prison) -"aSI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/central_one) +"aSH" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - West"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port) +"aSI" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) "aSJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aSK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aSL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) @@ -2332,12 +2332,12 @@ "aSR" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSS" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) "aST" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aSU" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/structure/flora/pottedplant{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aSU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "aSV" = (/obj/structure/table/reinforced,/obj/machinery/light/small{dir = 1},/obj/item/clothing/head/cakehat,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aSW" = (/obj/machinery/disposal,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aSX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "aSY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aSZ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aSZ" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southwest"},/turf/simulated/floor,/area/hallway/secondary/entry/port) "aTa" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/crew_quarters/kitchen) "aTb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "aTc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) @@ -2379,7 +2379,7 @@ "aTM" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry/starboard) "aTN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "neutralcorner"; dir = 1},/area/hallway/secondary/entry/starboard) "aTO" = (/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aTP" = (/obj/machinery/door/airlock{name = "Brig Restroom"},/turf/simulated/floor,/area/security/prison) +"aTP" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/port) "aTQ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/locker) "aTR" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) "aTS" = (/turf/simulated/wall,/area/crew_quarters/locker) @@ -2399,9 +2399,9 @@ "aUg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/storage/art) "aUh" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/storage/art) "aUi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) -"aUj" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_1"; pixel_x = -25; pixel_y = 0; tag_door = "escape_pod_1_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"aUj" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/primary/port) "aUk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/port) -"aUl" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_2"; pixel_x = -25; pixel_y = 0; tag_door = "escape_pod_2_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) +"aUl" = (/obj/structure/table,/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - East"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port) "aUm" = (/turf/simulated/wall,/area/storage/tools) "aUn" = (/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/hallway/primary/central_one) "aUo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one) @@ -2430,7 +2430,7 @@ "aUL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "aUM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aUN" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aUO" = (/obj/machinery/vending/dinnerware,/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Kitchen"; dir = 2},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) +"aUO" = (/obj/structure/flora/pottedplant{tag = "icon-plant-22"; icon_state = "plant-22"},/obj/machinery/camera/network/civilian_east{c_tag = "Bar East"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aUP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aUQ" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aUR" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) @@ -2446,20 +2446,20 @@ "aVb" = (/obj/structure/flora/ausbushes/brflowers,/obj/structure/sink/kitchen{pixel_y = 28},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/grass,/area/hydroponics/garden) "aVc" = (/obj/structure/bookcase{name = "bookcase (Fiction)"},/turf/simulated/floor/wood,/area/library) "aVd" = (/obj/structure/bookcase{name = "bookcase (Non-Fiction)"},/turf/simulated/floor/wood,/area/library) -"aVe" = (/obj/machinery/camera{c_tag = "Library South"; dir = 8; network = list("SS13")},/turf/simulated/floor/wood,/area/library) -"aVf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "arrivals_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "arrivals_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "arrivals_pump"; tag_exterior_door = "arrivals_outer"; frequency = 1379; id_tag = "arrivals_airlock"; tag_interior_door = "arrivals_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "arrivals_sensor"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals) +"aVe" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass{name = "Hydroponics Pasture"; req_access = list(28)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"aVf" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aVg" = (/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aVh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) "aVi" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/chapel/main) "aVj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) -"aVk" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera{c_tag = "Chapel South"; dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) +"aVk" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "nuke_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_access = list(0); req_one_access = list(13); tag_airpump = "nuke_shuttle_dock_pump"; tag_chamber_sensor = "nuke_shuttle_dock_sensor"; tag_exterior_door = "nuke_shuttle_dock_outer"; tag_interior_door = "nuke_shuttle_dock_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry/port) "aVl" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 1; icon_state = "escape"},/area/hallway/secondary/exit) "aVm" = (/turf/simulated/floor{dir = 1; icon_state = "escape"},/area/hallway/secondary/exit) "aVn" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{dir = 1; icon_state = "escape"},/area/hallway/secondary/exit) "aVo" = (/turf/simulated/floor,/area/hallway/secondary/exit) "aVp" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit) "aVq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/exit) -"aVr" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "nuke_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "nuke_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aVr" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "nuke_shuttle_dock_pump"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/port) "aVs" = (/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry/port) "aVt" = (/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry/port) "aVu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/entry/port) @@ -2467,7 +2467,7 @@ "aVw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aVx" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aVy" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aVz" = (/obj/machinery/camera{c_tag = "Arrivals Hallway"; dir = 8; network = list("SS13")},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) +"aVz" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "nuke_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 25; req_one_access = list(13)},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) "aVA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) "aVB" = (/obj/structure/closet/wardrobe/mixed,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/crew_quarters/locker) "aVC" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/crew_quarters/locker) @@ -2476,10 +2476,10 @@ "aVF" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/storage/art) "aVG" = (/turf/simulated/wall,/area/storage/emergency2) "aVH" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/closet/hydrant{pixel_x = -32},/turf/simulated/floor/plating,/area/storage/emergency2) -"aVI" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "arrivals_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aVI" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aVJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/research_port) "aVK" = (/turf/simulated/floor/plating,/area/storage/emergency2) -"aVL" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/storage/tools) +"aVL" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/maintenance/locker) "aVM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/storage/tools) "aVN" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/storage/tools) "aVO" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor,/area/storage/tools) @@ -2508,7 +2508,7 @@ "aWl" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/library) "aWm" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aWn" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aWo" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access = list(10)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) +"aWo" = (/obj/machinery/door/airlock{name = "Port Emergency Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/primary/port) "aWp" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aWq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aWr" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) @@ -2516,7 +2516,7 @@ "aWt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aWu" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aWv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aWw" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hardsuits"; req_one_access = list(11,24)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aWw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access = list(12)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) "aWx" = (/obj/item/device/radio/intercom{pixel_x = 28},/obj/machinery/libraryscanner,/turf/simulated/floor/wood,/area/library) "aWy" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) "aWz" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/bed/chair/office/dark,/turf/simulated/floor/wood,/area/library) @@ -2525,12 +2525,12 @@ "aWC" = (/obj/structure/flora/bush,/turf/simulated/floor/grass,/area/hydroponics/garden) "aWD" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics/garden) "aWE" = (/obj/structure/flora/ausbushes/sparsegrass,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) -"aWF" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"aWF" = (/obj/machinery/vending/dinnerware,/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera/network/civilian_east{c_tag = "Kitchen"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "aWG" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/library) "aWH" = (/obj/structure/table/woodentable,/obj/machinery/librarycomp{pixel_y = 0},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/wood,/area/library) "aWI" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aWJ" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"aWK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/central_one) +"aWK" = (/obj/machinery/camera/network/civilian_east{c_tag = "Library Central"; dir = 8},/turf/simulated/floor/wood,/area/library) "aWL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aWM" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/bridge) "aWN" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/bridge) @@ -2557,9 +2557,9 @@ "aXi" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor,/area/crew_quarters/locker) "aXj" = (/obj/structure/table,/turf/simulated/floor,/area/crew_quarters/locker) "aXk" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker) -"aXl" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Locker Room East"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker) +"aXl" = (/obj/machinery/door/morgue{dir = 2; name = "Private Study"; req_access = list(37)},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) "aXm" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/floor,/area/storage/art) -"aXn" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/camera{c_tag = "Art Storage"; dir = 1},/obj/machinery/light/small,/turf/simulated/floor,/area/storage/art) +"aXn" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel South"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aXo" = (/obj/structure/table,/obj/item/device/camera_film,/obj/item/device/camera,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/storage/art) "aXp" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/storage/emergency2) "aXq" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/maintenance/research_port) @@ -2571,21 +2571,21 @@ "aXw" = (/obj/structure/table,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/cell_charger,/turf/simulated/floor,/area/storage/tools) "aXx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aXy" = (/turf/simulated/wall,/area/bridge) -"aXz" = (/obj/machinery/camera{c_tag = "Bridge West"; dir = 2},/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) +"aXz" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "nuke_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "nuke_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry/port) "aXA" = (/obj/machinery/computer/shuttle_control/research,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) "aXB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/computer/crew,/turf/simulated/floor{icon_state = "whitehall"; dir = 5},/area/bridge) -"aXC" = (/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/bridge) +"aXC" = (/obj/machinery/light/small{dir = 1},/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/obj/machinery/porta_turret,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "aXD" = (/turf/simulated/floor,/area/bridge) "aXE" = (/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/bridge) "aXF" = (/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/bridge) -"aXG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/bridge) +"aXG" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "aXH" = (/turf/simulated/floor{dir = 4; icon_state = "escapecorner"},/area/bridge) -"aXI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access = list(25)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/bar) +"aXI" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aXJ" = (/obj/machinery/computer/med_data,/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge) "aXK" = (/turf/simulated/wall,/area/maintenance/substation/medical) "aXL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aXM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two) -"aXN" = (/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/obj/machinery/atm{pixel_x = -25},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aXN" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/exodus{c_tag = "Arrivals Hallway"; dir = 8},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) "aXO" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aXP" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aXQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/item/weapon/deck{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -2595,7 +2595,7 @@ "aXU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "aXV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aXW" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aXX" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aXX" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera/network/civilian_west{c_tag = "Tool Storage - Auxiliary"},/turf/simulated/floor,/area/storage/tools) "aXY" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aXZ" = (/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aYa" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) @@ -2614,17 +2614,17 @@ "aYn" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/bridge) "aYo" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/bridge) "aYp" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aYq" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access = list(1)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/checkpoint2) +"aYq" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aYr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 1; id = "office_shutter"; layer = 3.1; name = "Office Shutters"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/starboard) "aYs" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "aYt" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/wood,/area/library) "aYu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/exit) "aYv" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor,/area/hallway/secondary/exit) -"aYw" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/primary) -"aYx" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep) -"aYy" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Civilian East Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) +"aYw" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/hydroponics/garden) +"aYx" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 8; icon_state = "right"; name = "Library Desk Door"; req_access = list(37)},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library) +"aYy" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4},/obj/machinery/camera/network/civilian_west{c_tag = "Locker Room East"; dir = 8},/turf/simulated/floor,/area/crew_quarters/locker) "aYz" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/plating,/area/hallway/secondary/exit) -"aYA" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(1,5,11,18,24)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aYA" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/light/small,/obj/machinery/camera/network/civilian_west{c_tag = "Art Supply Storage"; dir = 1},/turf/simulated/floor,/area/storage/art) "aYB" = (/turf/space,/area/shuttle/transport1/station) "aYC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "aYD" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/aft) @@ -2636,7 +2636,7 @@ "aYJ" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/vacantoffice) "aYK" = (/obj/structure/table,/obj/structure/window/basic{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/vacantoffice) "aYL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/security/vacantoffice) -"aYM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door_control{id = "office_shutter"; name = "Office Shutters"; pixel_x = -8; pixel_y = 22; throw_range = 15},/obj/machinery/light_switch{pixel_x = -8; pixel_y = 32},/turf/simulated/floor,/area/security/vacantoffice) +"aYM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/button/remote/blast_door{id = "office_shutter"; name = "Office Shutters"; pixel_x = -8; pixel_y = 22},/obj/machinery/light_switch{pixel_x = -8; pixel_y = 32},/turf/simulated/floor,/area/security/vacantoffice) "aYN" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/security/vacantoffice) "aYO" = (/turf/simulated/wall,/area/security/vacantoffice) "aYP" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/locker) @@ -2645,7 +2645,7 @@ "aYS" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/locker) "aYT" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/requests_console{department = "Locker Room"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/crew_quarters/locker) "aYU" = (/obj/structure/table,/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/turf/simulated/floor,/area/crew_quarters/locker) -"aYV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/bar) +"aYV" = (/obj/structure/table,/obj/item/device/multitool,/obj/machinery/camera/network/command{c_tag = "Bridge West"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) "aYW" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/crew_quarters/locker) "aYX" = (/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) "aYY" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/storage/tools) @@ -2656,14 +2656,14 @@ "aZd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/bridge) "aZe" = (/obj/item/weapon/stool,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) "aZf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/bridge) -"aZg" = (/obj/item/device/radio/beacon,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/bridge) -"aZh" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/bridge) +"aZg" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/wall,/area/turret_protected/ai) +"aZh" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "aZi" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) "aZj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/bridge) "aZk" = (/obj/structure/bed/chair/office/light{dir = 8},/turf/simulated/floor,/area/security/vacantoffice) "aZl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/hallway/primary/central_two) "aZm" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_two) -"aZn" = (/obj/machinery/camera{c_tag = "Bridge East Entrance"; dir = 2},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_two) +"aZn" = (/obj/structure/table,/obj/item/weapon/storage/box/donut,/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/camera/network/command{c_tag = "Bridge East"},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge) "aZo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZp" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) @@ -2715,7 +2715,7 @@ "bak" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor,/area/crew_quarters/locker) "bal" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker) "bam" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/crew_quarters/locker) -"ban" = (/obj/machinery/camera{c_tag = "Locker Room West"; dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker) +"ban" = (/obj/machinery/atm{pixel_x = -25},/obj/machinery/camera/network/civilian_east{c_tag = "Bar West"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bao" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/crew_quarters/locker) "bap" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker) "baq" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Locker Room"; sortType = "Locker Room"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker) @@ -2729,8 +2729,8 @@ "bay" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Medical Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/medical) "baz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/substation/civilian_west) "baA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/substation/medical) -"baB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/bridge) -"baC" = (/obj/item/clothing/gloves/rainbow,/obj/item/clothing/shoes/rainbow,/obj/item/clothing/head/soft/rainbow,/obj/item/clothing/under/rainbow,/turf/simulated/floor/plating,/area/maintenance/locker) +"baB" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/machinery/camera/all/command{c_tag = "AI Chamber"; dir = 1},/obj/machinery/power/smes/buildable{charge = 5e+006; input_attempt = 1; input_level = 200000; output_level = 200000},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"baC" = (/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "baD" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/storage/tools) "baE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/storage/tools) "baF" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/light,/obj/random/tech_supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/storage/tools) @@ -2741,27 +2741,27 @@ "baK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_one) "baL" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/central_one) "baM" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/hallway/primary/central_one) -"baN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/bar) +"baN" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/hallway/secondary/exit) "baO" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/chapel/main) -"baP" = (/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance"; req_one_access = list(12,22)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/chapel/main) +"baP" = (/obj/machinery/light/small,/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_north_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_north_mech"; tag_airpump = "escape_dock_north_pump"; tag_chamber_sensor = "escape_dock_north_sensor"; tag_exterior_door = "escape_dock_north_outer"; tag_interior_door = "escape_dock_north_inner"; tag_shuttle_mech_sensor = "shuttle_dock_north_mech"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_north_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "baQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) "baR" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/bridge) -"baS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bluecorner"},/area/bridge) -"baT" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"baU" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"baV" = (/obj/machinery/light,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"baW" = (/obj/machinery/camera{c_tag = "Bridge Center"; dir = 1},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"baX" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"baY" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) -"baZ" = (/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"bba" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"bbb" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"bbc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/bridge) +"baS" = (/obj/machinery/power/sensor{name = "Powernet Sensor - AI Subgrid"; name_tag = "AI Subgrid"},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"baT" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"baU" = (/obj/machinery/button/remote/blast_door{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 6; pixel_y = -24; req_access = list(19)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light_switch{pixel_x = -5; pixel_y = -23},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"baV" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/command{c_tag = "Bridge Center"; dir = 1},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"baW" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_north_mech"; pixel_y = -19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"baX" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"baY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_north_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_north_mech"; pixel_y = -19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"baZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/bridge) +"bba" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"bbb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -28},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"bbc" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "bbd" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/bridge) -"bbe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) -"bbf" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) +"bbe" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/newscaster{pixel_y = -28},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"bbf" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "nuke_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 32; req_one_access = list(13)},/turf/space,/area/space) "bbg" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/bridge) -"bbh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Civilian West Substation"; req_one_access = list(11,24)},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) +"bbh" = (/obj/machinery/camera/network/exodus{c_tag = "Bridge East Entrance"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_two) "bbi" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/hallway/primary/central_two) "bbj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/primary/central_two) "bbk" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) @@ -2783,7 +2783,7 @@ "bbA" = (/obj/structure/table/reinforced,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) "bbB" = (/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden) "bbC" = (/obj/structure/flora/ausbushes/fernybush,/turf/simulated/floor/grass,/area/hydroponics/garden) -"bbD" = (/obj/structure/flora/ausbushes/brflowers,/obj/machinery/camera/autoname{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/grass,/area/hydroponics/garden) +"bbD" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/starboard) "bbE" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/wood,/area/library) "bbF" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) "bbG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Library"},/turf/simulated/floor/carpet,/area/hallway/primary/starboard) @@ -2791,22 +2791,22 @@ "bbI" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/library) "bbJ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "bbK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"bbL" = (/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) +"bbL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/civilian_west{c_tag = "Locker Room West"; dir = 1},/turf/simulated/floor,/area/crew_quarters/locker) "bbM" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/exit) "bbN" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/exit) "bbO" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/exit) -"bbP" = (/obj/machinery/door/airlock/maintenance{name = "Library Maintenance"; req_one_access = list(12,37)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/library) -"bbQ" = (/obj/machinery/door/airlock/maintenance{name = "Crematorium Maintenance"; req_access = list(27)},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/chapel/office) -"bbR" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access = list(22)},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"bbS" = (/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access = list(22)},/obj/machinery/mass_driver{dir = 4; id = "chapelgun"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/airlock_sensor{pixel_y = 25},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/chapel/main) +"bbP" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access = list(19)},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) +"bbQ" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access = list(19)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) +"bbR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/bridge) +"bbS" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "bbT" = (/obj/structure/table,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/tape_roll,/turf/simulated/floor,/area/crew_quarters/locker) "bbU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bbV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/vacantoffice) -"bbW" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{anchored = 1; department = "Vacant Office"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/security/vacantoffice) +"bbW" = (/obj/machinery/door/airlock/glass_command{id_tag = "sbridgedoor"; name = "Bridge"; req_access = list(19)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) "bbX" = (/obj/structure/table/rack{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/locker) "bbY" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/locker) "bbZ" = (/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet) -"bca" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/bar) +"bca" = (/obj/machinery/door/airlock/glass_command{id_tag = "sbridgedoor"; name = "Bridge"; req_access = list(19)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/bridge) "bcb" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker) "bcc" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/locker) "bcd" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/crew_quarters/locker) @@ -2826,18 +2826,18 @@ "bcr" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/hallway/primary/central_one) "bcs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central_one) "bct" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) -"bcu" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Bridge West Entrance"; dir = 1},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/central_one) +"bcu" = (/obj/structure/flora/ausbushes/brflowers,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera/network/civilian_east{c_tag = "Hydroponics Pasture South"; dir = 8},/turf/simulated/floor/grass,/area/hydroponics/garden) "bcv" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/central_one) "bcw" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/hallway/primary/central_one) "bcx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/bridge) "bcy" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/bridge) "bcz" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "bcA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"bcB" = (/obj/machinery/computer/guestpass{pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"bcC" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/bridge) +"bcB" = (/obj/item/device/radio/beacon,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/bridge) +"bcC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/bridge) "bcD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/bridge) "bcE" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/substation/command) -"bcF" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"bcF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "bcG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "bcH" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/hallway/primary/central_two) "bcI" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/central_two) @@ -2847,17 +2847,17 @@ "bcM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bcN" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bcO" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) -"bcP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/bar) +"bcP" = (/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/camera/network/exodus{c_tag = "Departures West"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) "bcQ" = (/obj/machinery/light_switch{pixel_x = 16; pixel_y = -23},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bcR" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bcS" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bcT" = (/obj/item/device/radio/intercom{pixel_x = 25},/obj/structure/window/reinforced,/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bcT" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "exterior access button"; pixel_x = 5; pixel_y = 25; req_one_access = list(13)},/turf/space,/area/space) "bcU" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bcV" = (/obj/item/weapon/stool,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/quartermaster/office) "bcW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics/garden) "bcX" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hydroponics/garden) "bcY" = (/obj/structure/flora/ausbushes,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) -"bcZ" = (/obj/machinery/light/small{dir = 1},/obj/machinery/power/smes/buildable{charge = 5e+006; input_attempt = 1; input_level = 200000; output_level = 200000},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bcZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "catwalk12"},/area/space) "bda" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/starboard) "bdb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) "bdc" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Library"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/hallway/primary/starboard) @@ -2877,7 +2877,7 @@ "bdq" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Chapel"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) "bdr" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) "bds" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hallway/secondary/exit) -"bdt" = (/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit) +"bdt" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "centcom_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "centcom_shuttle_dock_pump"; tag_chamber_sensor = "centcom_shuttle_dock_sensor"; tag_exterior_door = "centcom_shuttle_dock_outer"; tag_interior_door = "centcom_shuttle_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "centcom_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "centcom_shuttle_dock_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bdu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bdv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bdw" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/aft) @@ -2894,13 +2894,13 @@ "bdH" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) "bdI" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) "bdJ" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/suit,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"bdK" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) +"bdK" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bdL" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) "bdM" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/crew_quarters/locker) "bdN" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/crew_quarters/locker) "bdO" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) "bdP" = (/turf/simulated/wall,/area/quartermaster/storage) -"bdQ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Security Checkpoint"; req_access = list(63)},/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/entry/starboard) +"bdQ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bdR" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/office) "bdS" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/turf/simulated/floor/plating,/area/quartermaster/office) "bdT" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/structure/plasticflaps{opacity = 0},/turf/simulated/floor/plating,/area/quartermaster/office) @@ -2910,17 +2910,17 @@ "bdX" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) "bdY" = (/turf/simulated/wall/r_wall,/area/bridge/meeting_room) "bdZ" = (/turf/simulated/wall,/area/bridge/meeting_room) -"bea" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access = list(1)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) +"bea" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "beb" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai) "bec" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) "bed" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain) -"bee" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) +"bee" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{anchored = 1; department = "Vacant Office"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/status_display{pixel_x = 32},/turf/simulated/floor,/area/security/vacantoffice) "bef" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/bar) "beg" = (/obj/machinery/vending/cola,/turf/simulated/floor/wood,/area/crew_quarters/bar) "beh" = (/obj/machinery/light,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bei" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bej" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bek" = (/obj/machinery/camera{c_tag = "Bar South"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bek" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bel" = (/obj/item/device/radio/intercom{pixel_y = -30},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bem" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) "ben" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) @@ -2935,9 +2935,9 @@ "bew" = (/turf/simulated/floor,/area/hallway/primary/starboard) "bex" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bey" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/library) -"bez" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bez" = (/obj/machinery/computer/guestpass{pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "beA" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/library) -"beB" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/wood,/area/library) +"beB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/locker) "beC" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "beD" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/library) "beE" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) @@ -2948,17 +2948,17 @@ "beJ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) "beK" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/exit) "beL" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/exit) -"beM" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A. Cycler Access"; req_one_access = list(1,5,11,18,24)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"beN" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitchen Cold Room Maintenance"; req_access = list(28)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/bar) +"beM" = (/obj/machinery/light,/obj/machinery/camera/network/exodus{c_tag = "Bridge West Entrance"; dir = 1},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/central_one) +"beN" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "beO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "beP" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/aft) "beQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry/aft) -"beR" = (/obj/machinery/camera{c_tag = "Arrivals Auxiliary Docking North"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"beR" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/button/remote/blast_door{id = "kitchen"; name = "Kitchen Shutters Control"; pixel_x = -1; pixel_y = -24; req_access = list(28)},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "beS" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "beT" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/turf/simulated/floor,/area/security/vacantoffice) "beU" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor,/area/security/vacantoffice) -"beV" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/camera{c_tag = "Vacant Office"; dir = 1},/turf/simulated/floor,/area/security/vacantoffice) -"beW" = (/obj/structure/filingcabinet/medical{pixel_y = 0},/turf/simulated/floor,/area/security/vacantoffice) +"beV" = (/obj/machinery/camera/network/exodus{c_tag = "Departures East"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit) +"beW" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) "beX" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/locker) "beY" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/locker) "beZ" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) @@ -2976,19 +2976,19 @@ "bfl" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/quartermaster/office) "bfm" = (/turf/simulated/wall,/area/quartermaster/office) "bfn" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/bridge/meeting_room) -"bfo" = (/obj/machinery/door_control{id = "heads_meeting"; name = "Security Shutters"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"bfo" = (/obj/machinery/button/remote/blast_door{id = "heads_meeting"; name = "Security Shutters"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bfp" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"bfq" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Conference Room"; dir = 2},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"bfq" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Warehouse Maintenance"; req_access = list(31)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/quartermaster/storage) "bfr" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bfs" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bft" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bfu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bfv" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bfw" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/porta_turret,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bfx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Bar\\Library Maintenance"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library) -"bfy" = (/obj/machinery/door/window/southleft{name = "Bar Delivery"; icon_state = "left"; dir = 8; req_access = list(25); base_state = "left"},/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/bar) +"bfw" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/bridge) +"bfx" = (/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = list(19)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/bridge/meeting_room) +"bfy" = (/obj/machinery/door/airlock/command{id_tag = "captaindoor"; name = "Captain's Office"; req_access = list(20)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bfz" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bfA" = (/obj/machinery/porta_turret,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bfA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light_switch{pixel_x = -25; pixel_y = -25},/turf/simulated/floor,/area/bridge) "bfB" = (/obj/structure/bed/chair/comfy/black{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bfC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bfD" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -3010,7 +3010,7 @@ "bfT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bfU" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bfV" = (/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bfW" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 2"; dir = 2; network = list("SS13")},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) +"bfW" = (/obj/machinery/camera/network/civilian_east{c_tag = "Bar South"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bfX" = (/obj/machinery/computer/guestpass{pixel_y = 28},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bfY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/starboard) "bfZ" = (/obj/machinery/door/airlock/glass{name = "Garden"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/starboard) @@ -3034,7 +3034,7 @@ "bgr" = (/turf/simulated/wall,/area/hallway/secondary/entry/aft) "bgs" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bgt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"bgu" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) +"bgu" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "kitchen"; layer = 3.3; name = "Kitchen Shutters"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/hallway/primary/starboard) "bgv" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/locker) "bgw" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/locker) "bgx" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) @@ -3052,25 +3052,25 @@ "bgJ" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/turf/simulated/floor{icon_state = "arrival"; dir = 5},/area/quartermaster/office) "bgK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_one) "bgL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_one) -"bgM" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medical Hardsuits"; req_access = list(5)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"bgN" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/bridge/meeting_room) +"bgM" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light/small,/obj/machinery/camera/network/civilian_east{c_tag = "Library South"; dir = 1},/turf/simulated/floor/wood,/area/library) +"bgN" = (/obj/structure/extinguisher_cabinet{pixel_x = -13; pixel_y = 28},/obj/machinery/atm{pixel_x = 6; pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/port) "bgO" = (/turf/simulated/floor/wood,/area/bridge/meeting_room) "bgP" = (/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bgQ" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bgR" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bgS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bgT" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"bgU" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bgU" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/bridge) "bgV" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) -"bgW" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bgX" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/effect/landmark{name = "lightsout"},/obj/machinery/camera/all{c_tag = "AI Chamber"; dir = 1; pixel_x = 12},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bgW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light_switch{pixel_x = 25; pixel_y = -25},/turf/simulated/floor,/area/bridge) +"bgX" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "exterior access button"; pixel_x = 5; pixel_y = -25; req_one_access = list(13)},/turf/space,/area/space) "bgY" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "bgZ" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bha" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bhb" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bhc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bhd" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) -"bhe" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Security Hardsuits"; req_access = list(1)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) +"bhe" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 25; req_one_access = list(13)},/turf/space,/area/space) "bhf" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bhg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bhh" = (/obj/structure/flora/pottedplant{tag = "icon-plant-10"; icon_state = "plant-10"},/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -3094,34 +3094,34 @@ "bhz" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/hallway/primary/starboard) "bhA" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/hallway/primary/starboard) "bhB" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhC" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 2; network = list("SS13")},/turf/simulated/floor,/area/hallway/primary/starboard) +"bhC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/exodus{c_tag = "Arrivals Auxiliary Docking North"; dir = 8},/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bhD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/starboard) "bhE" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/hallway/primary/starboard) "bhF" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/starboard) "bhG" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/exit) "bhH" = (/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/secondary/exit) "bhI" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor,/area/hallway/secondary/exit) -"bhJ" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry/fore) -"bhK" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarstarboard) -"bhL" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) +"bhJ" = (/obj/structure/table,/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor,/area/security/vacantoffice) +"bhK" = (/obj/structure/filingcabinet,/turf/simulated/floor,/area/security/vacantoffice) +"bhL" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/camera/network/civilian_west{c_tag = "Vacant Office"; dir = 1},/turf/simulated/floor,/area/security/vacantoffice) "bhM" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plating,/area/hallway/secondary/exit) -"bhN" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"bhN" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/landmark{name = "blobstart"},/obj/machinery/camera/network/command{c_tag = "Bridge Conference Room"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bhO" = (/turf/space,/area/shuttle/specops/station) "bhP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bhQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry/aft) -"bhR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"bhS" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/fitness) -"bhT" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/locker) -"bhU" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/locker) -"bhV" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/locker) -"bhW" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/maintenance/locker) -"bhX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/wall,/area/maintenance/locker) +"bhR" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central West"},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) +"bhS" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/security/vacantoffice) +"bhT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/bridge/meeting_room) +"bhU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/command{c_tag = "AI - Upload Foyer"; dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bhV" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donut,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bhW" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - East"},/turf/simulated/floor,/area/hallway/primary/starboard) +"bhX" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_one_access = list(13)},/turf/simulated/floor,/area/hallway/secondary/exit) "bhY" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/locker) "bhZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/remains/robot,/turf/simulated/floor/plating,/area/maintenance/locker) "bia" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bib" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/machinery/light,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) "bic" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/crew_quarters/locker) -"bid" = (/obj/machinery/camera{c_tag = "Locker Room South"; dir = 8; network = list("SS13")},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/locker) +"bid" = (/obj/machinery/light/small{dir = 1},/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{frequency = 1380; id_tag = "escape_dock_south_airlock"; master_tag = "escape_dock"; pixel_y = -30; req_one_access = list(13); tag_airlock_mech_sensor = "escape_dock_south_mech"; tag_airpump = "escape_dock_south_pump"; tag_chamber_sensor = "escape_dock_south_sensor"; tag_exterior_door = "escape_dock_south_outer"; tag_interior_door = "escape_dock_south_inner"; tag_shuttle_mech_sensor = "shuttle_dock_south_mech"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "escape_dock_south_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bie" = (/obj/item/weapon/cigbutt,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/locker) "bif" = (/obj/structure/disposalpipe/sortjunction/wildcard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) "big" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) @@ -3134,10 +3134,10 @@ "bin" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "chapel"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) "bio" = (/obj/item/weapon/hand_labeler,/obj/item/device/assembly/timer,/obj/item/device/eftpos{eftpos_name = "Bridge EFTPOS scanner"},/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bip" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"biq" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"biq" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bir" = (/obj/item/weapon/folder/red,/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bis" = (/obj/item/weapon/book/manual/security_space_law,/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/bridge/meeting_room) -"bit" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/primary) +"bit" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "escape_dock_south_mech"; pixel_y = 19},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "biu" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/bridge/meeting_room) "biv" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Bridge"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "biw" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) @@ -3147,9 +3147,9 @@ "biA" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/captain) "biB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain) "biC" = (/turf/simulated/floor/wood,/area/crew_quarters/captain) -"biD" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Starboard Solar Access"; req_access = list(10)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"biD" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "biE" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"biF" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"biF" = (/obj/structure/sign/securearea{pixel_x = 32},/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/hallway/primary/starboard) "biG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "biH" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/flora/pottedplant{tag = "icon-plant-01"; icon_state = "plant-01"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/wood,/area/crew_quarters/captain) "biI" = (/obj/structure/disposalpipe/segment,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) @@ -3186,42 +3186,42 @@ "bjn" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/aft) "bjo" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bjp" = (/turf/simulated/wall,/area/maintenance/disposal) -"bjq" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_access = list(47)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bjq" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bjr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker) "bjs" = (/obj/machinery/door/airlock{name = "Unit 3"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bjt" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bju" = (/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/locker) -"bjv" = (/obj/effect/landmark{name = "blobstart"},/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/locker) -"bjw" = (/obj/machinery/meter,/obj/machinery/door_control{id = "mixvent"; name = "Mixing Room Vent Control"; pixel_x = -25; pixel_y = 5; req_access = list(7)},/obj/machinery/button/ignition{id = "mixingsparker"; pixel_x = -25; pixel_y = -5},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/rnd/mixing) +"bju" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"bjv" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/locker) +"bjw" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/locker) "bjx" = (/obj/structure/disposalpipe/tagger/partial{name = "Sorting Office"; sort_tag = "Sorting Office"},/turf/simulated/floor/plating,/area/maintenance/locker) "bjy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) "bjz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) "bjA" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bjB" = (/obj/machinery/camera{c_tag = "Cargo Bay Storage"; dir = 8; network = list("SS13")},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bjC" = (/obj/machinery/camera{c_tag = "Cargo Delivery Office"; dir = 4; network = list("SS13")},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office) +"bjB" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/locker) +"bjC" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/locker) "bjD" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) "bjE" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_one) "bjF" = (/obj/machinery/door/blast/regular{id = "chapelgun"; name = "Chapel Launcher Door"},/turf/simulated/floor/plating,/area/chapel/main) -"bjG" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_5"; pixel_x = 0; pixel_y = -25; tag_door = "escape_pod_5_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) -"bjH" = (/obj/structure/sign/securearea{pixel_x = 32},/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/hallway/primary/starboard) +"bjG" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/locker) +"bjH" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor,/area/quartermaster/office) "bjI" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bjJ" = (/obj/item/weapon/folder/blue,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/bridge/meeting_room) -"bjK" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor,/area/quartermaster/office) +"bjK" = (/obj/machinery/light/small{dir = 4},/obj/machinery/porta_turret{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bjL" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bjM" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bjN" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 20},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = -4},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bjO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) +"bjO" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bjP" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) -"bjQ" = (/obj/machinery/light/small{dir = 4},/obj/machinery/porta_turret{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bjR" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/cargo) +"bjQ" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/locker) +"bjR" = (/obj/machinery/light{dir = 1},/obj/item/weapon/stool,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) "bjS" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 19},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = -3},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bjT" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bjU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bjV" = (/obj/machinery/light{dir = 1},/obj/item/weapon/stool,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) +"bjV" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/maintenance/locker) "bjW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bjX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bjY" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/camera{c_tag = "Captain's Office"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bjZ" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/camera{c_tag = "Central Hallway East"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) +"bjY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/civilian_west{c_tag = "Locker Room South"; dir = 8},/turf/simulated/floor,/area/crew_quarters/locker) +"bjZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/bridge/meeting_room) "bka" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Stbd"; location = "HOP"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two) "bkb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two) "bkc" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) @@ -3232,7 +3232,7 @@ "bkh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/starboard) "bki" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) "bkj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkk" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Starboard Primary Hallway"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/starboard) +"bkk" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access = list(12)},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/disposal) "bkl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) "bkm" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) "bkn" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) @@ -3245,35 +3245,35 @@ "bku" = (/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/hallway/primary/starboard) "bkv" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) "bkw" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkx" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 3"; dir = 1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/hallway/primary/starboard) +"bkx" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/locker) "bky" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/starboard) "bkz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/starboard) -"bkA" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 4"; dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) +"bkA" = (/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Warehouse"; dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) "bkB" = (/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/starboard) "bkC" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/hallway/secondary/exit) "bkD" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bkE" = (/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bkF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) "bkG" = (/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) -"bkH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Mental Health"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) +"bkH" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Delivery Office"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office) "bkI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/exit) "bkJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/exit) -"bkK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Sub-Acute C"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_c) -"bkL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Secondary Storage"; req_access = list(5)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/medical/medbay2) -"bkM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Medbay Diagnostics Maintenance Access"; req_access = list(5)},/turf/simulated/floor/plating,/area/medical/sleeper) -"bkN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Patient Ward"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) +"bkK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/bridge/meeting_room) +"bkL" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = list(19)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/maintenance/substation/command) +"bkM" = (/obj/machinery/door/window{dir = 4; name = "AI Core Door"; req_access = list(16)},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bkN" = (/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = -27; pixel_y = 4},/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 32},/obj/machinery/requests_console{department = "AI"; departmentType = 5; pixel_x = -32; pixel_y = 32},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the AI core maintenance door."; id = "AICore"; name = "AI Maintenance Hatch"; pixel_x = 17; pixel_y = 25; req_access = list(109)},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bkO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc/high{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"bkP" = (/obj/machinery/conveyor{dir = 5; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) +"bkP" = (/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "AI Core Door"; req_access = list(16)},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bkQ" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) "bkR" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bkS" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) "bkT" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/disposal) "bkU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/locker) -"bkV" = (/obj/machinery/door/airlock/glass_medical{name = "Hygiene Facilities"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"bkV" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/camera/network/command{c_tag = "Bridge - Captain's Office"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bkW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) -"bkX" = (/obj/machinery/door/airlock/engineering{name = "Engineering Supplies"; req_one_access = list(10,24,5)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/engineering/break_room) -"bkY" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/cargo) -"bkZ" = (/obj/machinery/camera{c_tag = "Locker Room Toilets"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) +"bkX" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - East"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) +"bkY" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - West"; dir = 1},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/starboard) +"bkZ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central"; dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) "bla" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/locker) "blb" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) "blc" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3291,7 +3291,7 @@ "blo" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) "blp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "blq" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_one) -"blr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"blr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donut,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bls" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) "blt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "blu" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) @@ -3301,10 +3301,10 @@ "bly" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/bridge/meeting_room) "blz" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "blA" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"blB" = (/obj/machinery/camera{c_tag = "Medbay Lobby Port"; network = list("SS13")},/obj/item/weapon/stool,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) -"blC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Sub-Acute B"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"blB" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central East"; dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) +"blC" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_x = 0; pixel_y = -25; req_one_access = list(13)},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/hallway/secondary/exit) "blD" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"blE" = (/obj/machinery/camera{c_tag = "Medbay Lobby Starboard"; network = list("SS13")},/obj/item/weapon/stool,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) +"blE" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "specops_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "specops_dock_pump"; tag_chamber_sensor = "specops_dock_sensor"; tag_exterior_door = "specops_dock_outer"; tag_interior_door = "specops_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "specops_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "specops_dock_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "blF" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -30; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/megaphone,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "blG" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/captain,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain) "blH" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills{icon_state = "medlaptop"},/obj/item/weapon/hand_tele,/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -3319,7 +3319,7 @@ "blQ" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"},/turf/simulated/wall,/area/hallway/primary/starboard) "blR" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; opacity = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay4) "blS" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1443; icon_state = "map_injector"; id = "air_in"; use_power = 1},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"blT" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access = list(8)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/rnd/research) +"blT" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "blU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurplecorner"},/area/medical/medbay2) "blV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) "blW" = (/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/hallway/primary/starboard) @@ -3329,7 +3329,7 @@ "bma" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard) "bmb" = (/turf/simulated/floor{dir = 6; icon_state = "purple"},/area/hallway/primary/starboard) "bmc" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/exit) -"bmd" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "tox_airlock_pump"; tag_exterior_door = "tox_airlock_exterior"; id_tag = "tox_airlock_control"; tag_interior_door = "tox_airlock_interior"; pixel_x = -24; pixel_y = 0; tag_chamber_sensor = "tox_airlock_sensor"},/obj/machinery/atmospherics/tvalve/bypass{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warnwhitecorner"},/area/rnd/mixing) +"bmd" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bme" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/hallway/secondary/exit) "bmf" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/entry/aft) "bmg" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -3337,7 +3337,7 @@ "bmi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) "bmj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/locker) "bmk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/locker) -"bml" = (/obj/machinery/door_control{id = "scanhide"; name = "Diagnostics Room Separation Shutters"; pixel_x = -6; pixel_y = 25; req_access = list(5)},/obj/machinery/camera{c_tag = "Medbay Scanning"; network = list("SS13")},/obj/machinery/atmospherics/unary/freezer{dir = 8; icon_state = "freezer"},/obj/machinery/door_control{id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; pixel_x = 6; pixel_y = 25; req_access = list(5)},/turf/simulated/floor{icon_state = "delivery"},/area/medical/sleeper) +"bml" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bmm" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bmn" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bmo" = (/obj/item/stack/sheet/glass/reinforced,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3349,37 +3349,37 @@ "bmu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/locker) "bmv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/locker) "bmw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bmx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Sub-Acute A"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"bmx" = (/obj/machinery/conveyor{dir = 5; id = "garbage"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/disposal) "bmy" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) "bmz" = (/obj/structure/disposalpipe/sortjunction/untagged{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) "bmA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/quartermaster/office) "bmB" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office) "bmC" = (/obj/item/weapon/stool,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) "bmD" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) -"bmE" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/cargo) -"bmF" = (/obj/machinery/camera{c_tag = "Central Hallway West"; dir = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"bmE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/locker) +"bmF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bmG" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/command) -"bmH" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1379; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access = list(8)},/turf/simulated/floor/engine,/area/rnd/mixing) +"bmH" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/locker) "bmI" = (/obj/machinery/light/small{dir = 8},/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bmJ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "bmK" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bmL" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) "bmM" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) -"bmN" = (/obj/item/weapon/stool,/obj/machinery/camera{c_tag = "Medbay Examination Room"; network = list("SS13")},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) +"bmN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bmO" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = -30; pixel_y = 0},/obj/structure/filingcabinet,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bmP" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/bed/chair/wheelchair,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "bmQ" = (/obj/machinery/computer/communications,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bmR" = (/obj/structure/table/woodentable,/obj/item/device/eftpos{eftpos_name = "Captain EFTPOS scanner"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bmS" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bmT" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bmU" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1379; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access = list(8)},/turf/simulated/floor/engine,/area/rnd/mixing) -"bmV" = (/obj/machinery/camera{c_tag = "Chemistry"; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/machinery/chem_master,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bmU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/civilian_west{c_tag = "Locker Room Toilets"; dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) +"bmV" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/flasher{id = "AI"; pixel_x = 22; pixel_y = 24},/obj/machinery/turretid/stun{check_synth = 1; name = "AI Chamber turret control"; pixel_x = 36; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bmW" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bmX" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_y = 25},/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bmX" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_y = 25},/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bmY" = (/obj/structure/sign/chemistry,/turf/simulated/wall/r_wall,/area/medical/chemistry) "bmZ" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/reception) "bna" = (/obj/structure/table,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/storage/box/cups{pixel_x = 0; pixel_y = 0},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) -"bnb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/mixing) +"bnb" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 1},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/super/equipment{dir = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bnc" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Command"},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bnd" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/reception) "bne" = (/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/reception) @@ -3396,11 +3396,11 @@ "bnp" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) "bnq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) "bnr" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) -"bns" = (/obj/machinery/camera{c_tag = "Morgue"; network = list("SS13")},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) +"bns" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor,/area/hallway/primary/starboard) "bnt" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) "bnu" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/medical/morgue) "bnv" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bnw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Medbay Patient Wing Maintenance Access"; req_access = list(5)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/patient_wing) +"bnw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_one_access = list(5,12,47)},/turf/simulated/floor/plating,/area/hallway/primary/starboard) "bnx" = (/obj/machinery/door/blast/regular{id = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) "bny" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/chargebay) "bnz" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) @@ -3417,17 +3417,17 @@ "bnK" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency) "bnL" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/storage/emergency) "bnM" = (/turf/simulated/wall,/area/storage/emergency) -"bnN" = (/obj/machinery/door_control{id = "misclab"; name = "Test Chamber Blast Doors"; pixel_x = 6; pixel_y = 30; req_access = list(47)},/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bnN" = (/obj/machinery/door/airlock/maintenance{name = "Maintenance Access"; req_access = list(12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bnO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) -"bnP" = (/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Arrivals Auxiliary Docking South"; dir = 4; network = list("SS13")},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/aft) +"bnP" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker) "bnQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"bnR" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/structure/sign/vacuum{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bnS" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_access = list(47)},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bnR" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/locker) +"bnS" = (/obj/machinery/button/remote/blast_door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; req_access = list(31)},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) "bnT" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bnU" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bnV" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bnW" = (/obj/machinery/door/window/eastleft{name = "Medical Delivery"; req_access = list(5)},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "delivery"},/area/medical/sleeper) -"bnX" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "toxin_test_pump"; tag_exterior_door = "toxin_test_outer"; frequency = 1379; id_tag = "toxin_test_airlock"; tag_interior_door = "toxin_test_inner"; pixel_x = 0; pixel_y = 25; req_access = list(13); tag_chamber_sensor = "toxin_test_sensor"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/research_starboard) +"bnU" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Mailing Room"; req_access = list(50)},/turf/simulated/floor{icon_state = "bot"},/area/hallway/primary/central_one) +"bnV" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - West"; dir = 8},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"bnW" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"bnX" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/effect/landmark/start{name = "Captain"},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the office door."; id = "captaindoor"; name = "Office Door Control"; pixel_x = 15; pixel_y = 30; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the starboard bridge doors."; id = "sbridgedoor"; name = "Bridge Door Control"; pixel_x = 15; pixel_y = 39; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bnY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/locker) "bnZ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/locker) "boa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3438,14 +3438,14 @@ "bof" = (/obj/machinery/light,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/rnd/research) "bog" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/storage) "boh" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/quartermaster/office) -"boi" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "toxin_test_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = -20; req_access = list(13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/space) +"boi" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "boj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office) "bok" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) -"bol" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bol" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/machinery/chem_master,/obj/machinery/camera/network/medbay{c_tag = "Medbay - Chemistry"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bom" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/substation/command) "bon" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/substation/command) "boo" = (/obj/item/weapon/stool,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics) -"bop" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bop" = (/obj/item/weapon/stool,/obj/machinery/camera/network/mining{c_tag = "Medbay Lobby Port"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) "boq" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab) "bor" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bos" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/maintenance/substation/command) @@ -3466,7 +3466,7 @@ "boH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) "boI" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/rnd/research) "boJ" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"boK" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "toxin_test_airlock"; name = "interior access button"; pixel_x = 20; pixel_y = 20; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/research_starboard) +"boK" = (/obj/item/weapon/stool,/obj/machinery/camera/network/mining{c_tag = "Medbay Lobby Starboard"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) "boL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "boM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "boN" = (/obj/structure/bed,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) @@ -3478,7 +3478,7 @@ "boT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "boU" = (/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "boV" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"boW" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/rnd/test_area) +"boW" = (/obj/item/weapon/stool,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/camera/network/medbay{c_tag = "Medbay Examination Room"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "boX" = (/obj/structure/sign/examroom,/turf/simulated/wall,/area/medical/reception) "boY" = (/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "boZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) @@ -3494,22 +3494,22 @@ "bpj" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bpk" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/assembly/chargebay) "bpl" = (/turf/simulated/floor,/area/assembly/chargebay) -"bpm" = (/obj/machinery/door_control{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24},/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay) +"bpm" = (/obj/machinery/button/remote/blast_door{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24},/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay) "bpn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/chargebay) -"bpo" = (/obj/machinery/door/airlock/glass_medical{name = "Patient Ward"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) +"bpo" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/medbay{c_tag = "Medbay Morgue"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) "bpp" = (/turf/simulated/wall,/area/assembly/robotics) "bpq" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bpr" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 6; pixel_y = 28},/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/medical/reception) -"bps" = (/obj/machinery/camera{c_tag = "Robotics"; dir = 2; network = list("SS13","Research"); pixel_x = 22},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/assembly/robotics) +"bpr" = (/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; pixel_x = 6; pixel_y = 28},/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/medical/reception) +"bps" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access = list(29)},/turf/simulated/floor,/area/hallway/primary/starboard) "bpt" = (/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics) "bpu" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "bpv" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/assembly/robotics) -"bpw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Observation Room"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) +"bpw" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Robotics Desk"; req_access = list(29)},/turf/simulated/floor/plating,/area/hallway/primary/starboard) "bpx" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/hallway/primary/starboard) "bpy" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab) "bpz" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/firealarm{pixel_y = 27},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/quartermaster/office) "bpA" = (/obj/structure/table,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab) -"bpB" = (/obj/machinery/camera{c_tag = "Research and Development Lab"; dir = 2; network = list("SS13","Research")},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/rnd/lab) +"bpB" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/window/southright{name = "Research and Development Desk"; req_access = list(7)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/hallway/primary/starboard) "bpC" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) "bpD" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) "bpE" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency) @@ -3519,15 +3519,15 @@ "bpI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bpJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bpK" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"bpL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) -"bpM" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/disposal) -"bpN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) +"bpL" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 25; req_one_access = list(13)},/turf/space,/area/space) +"bpM" = (/obj/structure/closet/emcloset,/obj/machinery/camera/network/exodus{c_tag = "Arrivals Auxiliary Docking South"},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/aft) +"bpN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) "bpO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/turret_protected/ai_upload) -"bpP" = (/turf/simulated/floor/plating,/area/maintenance/disposal) +"bpP" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/structure/sign/vacuum{pixel_x = -32},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/disposal) "bpQ" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/disposal) "bpR" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bpS" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_outer"; locked = 1; name = "Engineering EVA External Access"; req_access = list(13)},/turf/simulated/floor/airless{icon_state = "circuit"},/area/maintenance/atmos_control) -"bpT" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_inner"; locked = 1; name = "Engineering EVA Internal Access"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"bpS" = (/obj/item/trash/candy,/obj/item/trash/popcorn,/turf/simulated/floor/plating,/area/maintenance/disposal) +"bpT" = (/obj/effect/decal/cleanable/blood/oil,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/disposal) "bpU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/locker) "bpV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/locker) "bpW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3536,11 +3536,11 @@ "bpZ" = (/obj/structure/table,/obj/item/clothing/head/soft,/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft,/turf/simulated/floor,/area/quartermaster/storage) "bqa" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/hand_labeler,/turf/simulated/floor,/area/quartermaster/storage) "bqb" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/quartermaster/storage) -"bqc" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/structure/closet/secure_closet/cargotech,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/quartermaster/storage) +"bqc" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/disposal) "bqd" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor,/area/quartermaster/storage) "bqe" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/quartermaster/storage) "bqf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/quartermaster/storage) -"bqg" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access = list(56)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bqg" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker) "bqh" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/storage) "bqi" = (/obj/machinery/photocopier,/turf/simulated/floor,/area/quartermaster/office) "bqj" = (/obj/structure/disposalpipe/sortjunction{dir = 1; name = "Sorting Office"; sortType = "Sorting Office"},/turf/simulated/floor,/area/quartermaster/office) @@ -3552,31 +3552,31 @@ "bqp" = (/turf/simulated/floor/plating/airless,/area/rnd/xenobiology) "bqq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/substation/command) -"bqs" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central_three) -"bqt" = (/obj/structure/table,/obj/item/weapon/aiModule/reset,/obj/machinery/camera{c_tag = "AI Upload Chamber"; dir = 4; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bqs" = (/obj/effect/decal/cleanable/generic,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/maintenance/locker) +"bqt" = (/obj/machinery/door/window/eastleft{name = "Mail"; req_access = list(50)},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "delivery"},/area/quartermaster/office) "bqu" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless,/area/rnd/xenobiology) "bqv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plating,/area/maintenance/substation/command) "bqw" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"bqx" = (/obj/structure/table,/obj/item/weapon/aiModule/protectStation,/obj/machinery/light{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bqy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/central_three) +"bqx" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"bqy" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access = list(33)},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "chemcounter"; name = "Pharmacy Counter Shutters"; opacity = 0},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/medical/chemistry) "bqz" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/mask/gas,/obj/item/clothing/suit/armor/captain,/obj/item/clothing/head/helmet/space/capspace,/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bqA" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bqB" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Break Room"; req_one_access = list(10,24,5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/break_room) +"bqB" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/research{c_tag = "Research - Robotics"},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/assembly/robotics) "bqC" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bqD" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bqE" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bqF" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"bqG" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/obj/item/device/mass_spectrometer/adv,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/machinery/door_control{id = "chemwindow"; name = "Pharmacy Windows Shutter Control"; pixel_x = -22; pixel_y = -10; pixel_z = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bqG" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/obj/item/device/mass_spectrometer/adv,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/machinery/button/remote/blast_door{id = "chemwindow"; name = "Pharmacy Windows Shutter Control"; pixel_x = -22; pixel_y = -10; pixel_z = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bqH" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bqI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bqJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bqK" = (/obj/machinery/camera{c_tag = "Common Brig Northwest"; dir = 4; network = list("SS13","Prison")},/obj/machinery/computer/arcade,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/prison) +"bqK" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics) "bqL" = (/turf/simulated/wall/r_wall,/area/medical/chemistry) "bqM" = (/obj/structure/bed,/obj/item/weapon/bedsheet/captain,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bqN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "bqO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "bqP" = (/turf/simulated/floor{dir = 4; icon_state = "whiteblue_ex"; tag = "icon-whiteblue (EAST)"},/area/medical/reception) -"bqQ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Washroom"; req_one_access = list(10,24,5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/break_room) +"bqQ" = (/obj/machinery/door/airlock/research{id_tag = "researchdoor"; name = "Research Division Access"; req_access = list(47)},/turf/simulated/floor{icon_state = "white"},/area/hallway/primary/starboard) "bqR" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "bqS" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "bqT" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) @@ -3588,7 +3588,7 @@ "bqZ" = (/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bra" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/assembly/chargebay) "brb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) -"brc" = (/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = list(64)},/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor{icon_state = "bcarpet04"},/area/medical/psych) +"brc" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/research{c_tag = "Research - R&D Lab"},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/rnd/lab) "brd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bre" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "brf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) @@ -3596,7 +3596,7 @@ "brh" = (/turf/simulated/wall/r_wall,/area/assembly/robotics) "bri" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/rnd/research) "brj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"brk" = (/obj/machinery/camera{c_tag = "Research Division Access"; dir = 2; network = list("SS13","Research")},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/research) +"brk" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/hallway/secondary/entry/aft) "brl" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) "brm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) "brn" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) @@ -3606,28 +3606,28 @@ "brr" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency) "brs" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "brt" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"bru" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/ward) -"brv" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/holosign/surgery,/obj/machinery/door/airlock/glass_medical{id_tag = "Surgery"; name = "Pre-Op Prep Room"; req_access = list(5)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"brw" = (/obj/machinery/door/firedoor,/obj/machinery/holosign/surgery,/obj/machinery/door/airlock/glass_medical{id_tag = "Surgery"; name = "Pre-Op Prep Room"; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"brx" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"bry" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry/aft) +"bru" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/machinery/door/blast/regular{density = 1; icon_state = "pdoor1"; id = "Disposal Exit"; name = "Disposal Exit Vent"; opacity = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/disposal) +"brv" = (/obj/item/weapon/cigbutt{pixel_x = -10; pixel_y = -10},/turf/simulated/floor/plating,/area/maintenance/disposal) +"brw" = (/obj/machinery/button/remote/blast_door{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access = list(12)},/obj/machinery/button/remote/driver{id = "trash"; pixel_x = -26; pixel_y = -6},/obj/item/weapon/cigbutt,/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/maintenance/disposal) +"brx" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/locker) +"bry" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access = list(12)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/nosmoking_1{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/disposal) "brz" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) "brA" = (/turf/simulated/floor,/area/hallway/secondary/entry/aft) "brB" = (/obj/machinery/sparker{dir = 2; id = "mixingsparker"; pixel_x = 25},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"brC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal) -"brD" = (/obj/machinery/camera{c_tag = "Disposals"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal) +"brC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"brD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "brE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/locker) "brF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "brG" = (/turf/simulated/wall/r_wall,/area/maintenance/locker) "brH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/locker) -"brI" = (/obj/machinery/seed_storage/xenobotany,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"brI" = (/obj/structure/closet/secure_closet/cargotech,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Bay North"},/turf/simulated/floor,/area/quartermaster/storage) "brJ" = (/turf/simulated/floor,/area/quartermaster/storage) "brK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/quartermaster/storage) "brL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/storage) "brM" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/quartermaster/office) "brN" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/office) "brO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{pixel_y = 23},/turf/simulated/floor,/area/quartermaster/office) -"brP" = (/obj/machinery/botany/editor,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"brP" = (/obj/machinery/button/remote/blast_door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; req_access = list(31)},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/quartermaster/storage) "brQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/office) "brR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/quartermaster/office) "brS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/quartermaster/office) @@ -3645,33 +3645,33 @@ "bse" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/maintenance/substation/command) "bsf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/substation/medical) "bsg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/obj/machinery/power/sensor{name = "Powernet Sensor - Medbay Subgrid"; name_tag = "Medbay Subgrid"},/turf/simulated/floor/plating,/area/maintenance/substation/medical) -"bsh" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"bsh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/command{name = "Electrical Maintenance"; req_access = list(19)},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bsi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) -"bsj" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access = list(47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"bsk" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bsl" = (/obj/machinery/computer/borgupload,/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = -5; pixel_y = 22},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bsj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/vault/bolted{name = "AI core"; req_access = list(16)},/obj/machinery/door/blast/regular{id = "AICore"; name = "AI core maintenance hatch"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bsk" = (/obj/machinery/door/airlock/highsecurity{name = "AI Upload Access"; req_access = list(16)},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bsl" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Captain's Desk Door"; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bsm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/flasher{id = "AI"; pixel_x = -22; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bsn" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/computer/aiupload,/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bso" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Science Substation"; req_one_access = list(11,24,47)},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/substation/research) +"bsn" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/medical{name = "Examination room"; req_access = list(5)},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room) +"bso" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/medical/morgue) "bsp" = (/turf/simulated/wall,/area/crew_quarters/captain) -"bsq" = (/obj/machinery/door/airlock/maintenance{name = "Miscellaneous Reseach Maintenance"; req_access = list(47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/substation/research) -"bsr" = (/obj/machinery/door/firedoor/border_only{name = "hazard door south"},/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access = list(47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bsq" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"bsr" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera/network/research{c_tag = "Research Division Access"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/research) "bss" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two) "bst" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bsu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bsv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Diagnostics Room"; req_access = list(5)},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay4) +"bsv" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) "bsw" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception) "bsx" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/box/cups,/obj/item/weapon/storage/box/cups{pixel_x = 2; pixel_y = 5},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/reception) -"bsy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access = list(56)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bsy" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "admin_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "admin_shuttle_dock_pump"; tag_chamber_sensor = "admin_shuttle_dock_sensor"; tag_exterior_door = "admin_shuttle_dock_outer"; tag_interior_door = "admin_shuttle_dock_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry/aft) "bsz" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) "bsA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) -"bsB" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/turf/simulated/floor/plating/airless,/area/rnd/test_area) +"bsB" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -8; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/aft) "bsC" = (/obj/structure/filingcabinet/chestdrawer{name = "Medical Forms"},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/medical/reception) "bsD" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) "bsE" = (/obj/structure/table,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/tramadol,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "bsF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "bsG" = (/obj/structure/table,/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cane{pixel_x = -6; pixel_y = 4},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bsH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bsH" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bsI" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/morgue) "bsJ" = (/obj/machinery/mech_bay_recharge_port,/turf/simulated/floor/plating,/area/assembly/chargebay) "bsK" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay) @@ -3697,12 +3697,12 @@ "bte" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency) "btf" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "admin_shuttle_dock_sensor"; pixel_x = -30; pixel_y = 8},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/aft) "btg" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"bth" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bth" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/aft) "bti" = (/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/aft) "btj" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/aft) "btk" = (/obj/machinery/disposal/deliveryChute{dir = 1; name = "disposal inlet"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/disposal) -"btl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/disposal) -"btm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/disposal) +"btl" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry/aft) +"btm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) "btn" = (/turf/space,/area/supply/station) "bto" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "btp" = (/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage) @@ -3711,52 +3711,52 @@ "bts" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor,/area/quartermaster/storage) "btt" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/quartermaster/storage) "btu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/quartermaster/storage) -"btv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"btv" = (/obj/machinery/camera/network/civilian_west{c_tag = "Waste Disposal"; dir = 8},/obj/item/ashtray/plastic{pixel_x = 5; pixel_y = -5},/obj/effect/decal/cleanable/ash,/obj/item/weapon/cigbutt/cigarbutt,/turf/simulated/floor/plating,/area/maintenance/disposal) "btw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office) "btx" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/quartermaster/office) "bty" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/quartermaster/office) "btz" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/office) "btA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/office) -"btB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"btB" = (/obj/structure/table,/obj/item/weapon/deck{pixel_y = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) "btC" = (/turf/simulated/wall,/area/hallway/primary/central_three) "btD" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_three) "btE" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_three) "btF" = (/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor,/area/hallway/primary/central_three) "btG" = (/turf/simulated/wall/r_wall,/area/hallway/primary/central_three) "btH" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/command) -"btI" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) +"btI" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access = list(31)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/quartermaster/storage) "btJ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan,/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) -"btK" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"btK" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/office) "btL" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "btM" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/turret_protected/ai_upload) "btN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"btO" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"btO" = (/obj/structure/table,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Core Modules"; req_access = list(20)},/obj/structure/window/reinforced,/obj/item/weapon/aiModule/corp,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "btP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "btQ" = (/obj/structure/displaycase,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "btR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "btS" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"btT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) +"btT" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = -5; pixel_y = 22},/obj/machinery/porta_turret,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "btU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) "btV" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/captain) "btW" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/hallway/primary/central_two) -"btX" = (/obj/machinery/camera{c_tag = "Central Hallway East South-East"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two) +"btX" = (/obj/structure/closet/crate{name = "Camera Assembly Crate"},/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) "btY" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "btZ" = (/obj/machinery/chem_master,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bua" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bub" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = -8},/obj/machinery/door_control{id = "chemwindow"; name = "Chemistry Laboratory Window Shutters Control"; pixel_x = 26; pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bub" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = -8},/obj/machinery/button/remote/blast_door{id = "chemwindow"; name = "Chemistry Laboratory Window Shutters Control"; pixel_x = 26; pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "buc" = (/turf/simulated/wall,/area/medical/chemistry) "bud" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = -32},/turf/simulated/floor{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/reception) "bue" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception) "buf" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/crew,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/reception) "bug" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/office) "buh" = (/obj/structure/table,/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Reception Emergency Phone"},/turf/simulated/floor,/area/medical/reception) -"bui" = (/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/maintenance/research_port) -"buj" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "hop_office_desk"; name = "Desk Privacy Shutter"; pixel_x = 16; pixel_y = 28},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/crew_quarters/heads/hop) +"bui" = (/obj/structure/table,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access = list(20)},/obj/item/weapon/aiModule/purge,/obj/structure/window/reinforced,/obj/item/weapon/aiModule/antimov,/obj/item/weapon/aiModule/teleporterOffline,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"buj" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "hop_office_desk"; name = "Desk Privacy Shutter"; pixel_x = 16; pixel_y = 28},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/crew_quarters/heads/hop) "buk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/filingcabinet/medical{pixel_y = 0},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/reception) "bul" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception) "bum" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 32},/turf/simulated/floor{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/reception) "bun" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"buo" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"buo" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bup" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) "buq" = (/obj/structure/morgue,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/medical/morgue) "bur" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) @@ -3765,7 +3765,7 @@ "buu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) "buv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) "buw" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/morgue) -"bux" = (/obj/machinery/camera{c_tag = "Mech Bay"; dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor,/area/assembly/chargebay) +"bux" = (/obj/machinery/door/airlock/maintenance{name = "Captain's Office Maintenance"; req_access = list(20)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/captain) "buy" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/assembly/chargebay) "buz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/assembly/robotics) "buA" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/assembly/robotics) @@ -3787,14 +3787,14 @@ "buQ" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research/station) "buR" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/research/station) "buS" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/research/station) -"buT" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Patient C"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/patient_c) -"buU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Break Room"; req_one_access = list(10,24,5)},/turf/simulated/floor,/area/engineering/break_room) +"buT" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"buU" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) "buV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "buW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "buX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) -"buY" = (/obj/machinery/mass_driver{id = "trash"},/turf/simulated/floor/plating/airless,/area/maintenance/disposal) -"buZ" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bva" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/disposal) +"buY" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 3},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) +"buZ" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/folder/white{pixel_y = 0},/obj/item/weapon/pen,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 16},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) +"bva" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bvb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/disposal) "bvc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "bvd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage) @@ -3803,14 +3803,14 @@ "bvg" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/storage) "bvh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/storage) "bvi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/storage) -"bvj" = (/obj/structure/closet/secure_closet/engineering_chief,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bvj" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/disposal) "bvk" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office) "bvl" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/office) "bvm" = (/obj/structure/disposalpipe/tagger/partial{name = "Sorting Office"; sort_tag = "Sorting Office"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/office) "bvn" = (/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/structure/table,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/quartermaster/office) "bvo" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/quartermaster/office) "bvp" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor,/area/quartermaster/office) -"bvq" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor,/area/quartermaster/office) +"bvq" = (/obj/machinery/mass_driver{id = "trash"},/obj/machinery/airlock_sensor{pixel_x = -25; pixel_y = 10},/turf/simulated/floor/plating/airless,/area/maintenance/disposal) "bvr" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/substation/medical) "bvs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/central_three) "bvt" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_three) @@ -3822,19 +3822,19 @@ "bvz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/recharger/wallcharger{pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/hop) "bvA" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/crew_quarters/heads/hop) "bvB" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bvC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bvC" = (/obj/item/weapon/cigbutt{pixel_y = 12},/turf/simulated/floor/plating,/area/maintenance/disposal) "bvD" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 28},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) -"bvE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) -"bvF" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bvE" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access = list(31)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/quartermaster/storage) +"bvF" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/turf/simulated/floor,/area/quartermaster/office) "bvG" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bvH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bvI" = (/obj/structure/table,/obj/item/weapon/aiModule/nanotrasen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bvI" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = list(57)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/maintenance/substation/command) "bvJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bvK" = (/obj/machinery/hologram/holopad,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bvL" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module,/obj/machinery/light_switch{pixel_x = 27},/obj/structure/reagent_dispensers/acid{density = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) "bvM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bvN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bvO" = (/obj/structure/table,/obj/item/weapon/aiModule/freeform,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bvO" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/borgupload,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bvP" = (/obj/structure/grille,/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/heads/hop) "bvQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bvR" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) @@ -3845,21 +3845,21 @@ "bvW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/chemistry) "bvX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/chemistry) "bvY" = (/obj/machinery/smartfridge/secure/medbay,/turf/simulated/wall,/area/medical/chemistry) -"bvZ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) +"bvZ" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/aiupload,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bwa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4) "bwb" = (/obj/structure/table,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/item/weapon/reagent_containers/glass/bottle/stoxin{pixel_x = -6; pixel_y = 10},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/random/medical,/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry) -"bwc" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door_control{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = -24; pixel_y = 10; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = -10; req_access = list(10); specialfunctions = 4},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bwc" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) "bwd" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/medical/reception) "bwe" = (/turf/simulated/floor,/area/medical/reception) "bwf" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/medical/reception) -"bwg" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "eng_eva_pump"; tag_exterior_door = "eng_eva_outer"; frequency = 1379; id_tag = "eng_eva_airlock"; tag_interior_door = "eng_eva_inner"; name = "Engineering Airlock Console"; pixel_y = 25; req_access = list(13); tag_chamber_sensor = "eng_eva_sensor"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor{dir = 5; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) +"bwg" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - East Southwest"; dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two) "bwh" = (/obj/machinery/door/blast/regular{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/plating/airless,/area/rnd/mixing) "bwi" = (/obj/machinery/door/blast/regular{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/plating/airless,/area/rnd/test_area) "bwj" = (/obj/structure/table,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/turf/simulated/floor,/area/medical/reception) "bwk" = (/turf/simulated/wall,/area/medical/medbay2) -"bwl" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) +"bwl" = (/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; pixel_x = -16; pixel_y = 28},/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/medical/reception) "bwm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay2) -"bwn" = (/obj/machinery/door/airlock/glass_mining{name = "Quartermaster"; req_access = list(41)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/qm) +"bwn" = (/obj/structure/table,/obj/machinery/button/remote/blast_door{id = "medbayrecquar"; name = "Medbay Entrance Lockdown Shutters Control"; pixel_x = 6; pixel_y = 8; req_access = list(5)},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Reception Emergency Phone"; pixel_x = -5},/turf/simulated/floor,/area/medical/reception) "bwo" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/assembly/chargebay) "bwp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/assembly/chargebay) "bwq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics) @@ -3869,7 +3869,7 @@ "bwu" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Medical"},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/substation/medical) "bwv" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/assembly/robotics) "bww" = (/turf/simulated/wall/r_wall,/area/rnd/research) -"bwx" = (/obj/structure/table,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_shuttle"; pixel_x = 25; pixel_y = -8; req_one_access = list(13,48); tag_door = "mining_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) +"bwx" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/camera/network/research{c_tag = "Research - Mech Bay"; dir = 4},/turf/simulated/floor,/area/assembly/chargebay) "bwy" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/rnd/research) "bwz" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab) "bwA" = (/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab) @@ -3897,7 +3897,7 @@ "bwW" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Cargo Bay"; name = "Cargo Bay"},/turf/simulated/floor,/area/quartermaster/office) "bwX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/office) "bwY" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/random/firstaid,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bwZ" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access = list(26)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/central_three) +"bwZ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = 30; pixel_y = -5; req_one_access = list(13)},/turf/space,/area/space) "bxa" = (/turf/simulated/floor{icon_state = "delivery"},/area/quartermaster/office) "bxb" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 5; pixel_y = 5},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/random/firstaid,/turf/simulated/floor{dir = 8; icon_state = "whiteyellowcorner"},/area/medical/chemistry) "bxc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_three) @@ -3910,40 +3910,40 @@ "bxj" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "bxk" = (/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "bxl" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bxm" = (/obj/structure/sign/kiddieplaque,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload) +"bxm" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bxn" = (/obj/structure/table/woodentable,/obj/item/device/camera,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bxo" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) -"bxp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) +"bxp" = (/obj/machinery/door/blast/regular{id = "trash"; name = "disposal mass driver"},/turf/simulated/floor/plating/airless,/area/maintenance/disposal) "bxq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/obj/machinery/power/sensor{name = "Powernet Sensor - Command Subgrid"; name_tag = "Command Subgrid"},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bxr" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload) "bxs" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/maintenance/substation/command) "bxt" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -5; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/extinguisher_cabinet{pixel_x = 6; pixel_y = -29},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bxu" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor,/area/assembly/chargebay) -"bxv" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_two) +"bxv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) "bxw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two) "bxx" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 1; icon_state = "whiteyellowcorner"},/area/medical/chemistry) "bxy" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/chemistry) -"bxz" = (/obj/machinery/camera{c_tag = "Medbay Drug Storage"; dir = 2; network = list("SS13")},/obj/machinery/light{dir = 1},/obj/structure/closet/secure_closet/chemical,/obj/item/weapon/storage/box/pillbottles,/obj/item/device/radio/headset/headset_med,/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/chemistry) +"bxz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access = list(31)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/storage) "bxA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bxB" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bxC" = (/turf/simulated/wall,/area/medical/medbay) -"bxD" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_three) +"bxD" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Lobby"},/turf/simulated/floor,/area/quartermaster/office) "bxE" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/medical/medbay) "bxF" = (/turf/simulated/wall,/area/medical/medbay3) "bxG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay3) -"bxH" = (/obj/machinery/camera{c_tag = "EMT Storage"; dir = 1; network = list("SS13")},/obj/machinery/door_control{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = -25; req_access = list(5)},/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bxI" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_dock_airlock"; pixel_x = 25; pixel_y = -5; req_one_access = list(13,48); tag_airpump = "mining_dock_pump"; tag_chamber_sensor = "mining_dock_sensor"; tag_exterior_door = "mining_dock_outer"; tag_interior_door = "mining_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "mining_dock_sensor"; pixel_x = 25; pixel_y = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/quartermaster/miningdock) +"bxH" = (/obj/structure/table,/obj/item/weapon/aiModule/nanotrasen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/weapon/aiModule/reset,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bxI" = (/obj/structure/table,/obj/item/weapon/aiModule/freeform,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/item/weapon/aiModule/protectStation,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bxJ" = (/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/medical/medbay2) "bxK" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-white_ex"; icon_state = "white_ex"; dir = 2},/area/medical/medbay2) "bxL" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bxM" = (/obj/machinery/photocopier,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bxN" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bxO" = (/obj/machinery/camera{c_tag = "Medbay Fore Starboard"; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) +"bxO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Chemistry Laboratory"; req_access = list(33)},/obj/structure/sign/chemistry{pixel_x = 32},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bxP" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/medical/medbay2) "bxQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitehall_m"; tag = "icon-whitehall_m"},/area/medical/medbay2) "bxR" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/medical/medbay2) "bxS" = (/obj/machinery/vending/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bxT" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access = list(26)},/turf/simulated/floor{icon_state = "delivery"},/area/janitor) +"bxT" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/medical/reception) "bxU" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/obj/machinery/computer/cryopod/robot{pixel_y = -30},/turf/simulated/floor,/area/assembly/chargebay) "bxV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/research_port) "bxW" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) @@ -3964,7 +3964,7 @@ "byl" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research/station) "bym" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research/station) "byn" = (/obj/machinery/computer/shuttle_control/research,/turf/simulated/shuttle/floor,/area/shuttle/research/station) -"byo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"byo" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/turf/simulated/floor,/area/medical/reception) "byp" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating,/area/quartermaster/storage) "byq" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) "byr" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/quartermaster/storage) @@ -3986,17 +3986,17 @@ "byH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "byI" = (/mob/living/simple_animal/corgi/Ian,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "byJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"byK" = (/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"byK" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access = list(5)},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/medical/reception) "byL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) -"byM" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = 0; pixel_y = -27},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"byM" = (/obj/machinery/door/window/eastright{name = "Medical Reception"; req_access = list(5)},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/medical/reception) "byN" = (/turf/simulated/wall/r_wall,/area/teleporter) -"byO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Staff Room"; req_access = list(5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay2) +"byO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Examination Room"; req_access = list(5)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "byP" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two) -"byQ" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"byQ" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6,5)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/medbay2) "byR" = (/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "byS" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "byT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/medical/chemistry) -"byU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"byU" = (/obj/machinery/door/airlock/research{id_tag = "researchdoor"; name = "Research Division Access"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "byV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay) "byW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay) "byX" = (/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay3) @@ -4004,7 +4004,7 @@ "byZ" = (/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) "bza" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/alarm{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay3) "bzb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2) -"bzc" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 24; pixel_y = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) +"bzc" = (/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; pixel_x = 24; pixel_y = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "bzd" = (/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "bze" = (/obj/machinery/door/firedoor,/obj/structure/sign/examroom{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bzf" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) @@ -4019,7 +4019,7 @@ "bzo" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/patient_wing) "bzp" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "bzq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/patient_wing) -"bzr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(8,12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) +"bzr" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access = list(50)},/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor,/area/quartermaster/office) "bzs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) "bzt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/assembly/chargebay) "bzu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) @@ -4035,21 +4035,21 @@ "bzE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/rnd/research) "bzF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/rnd/research) "bzG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/rnd/research) -"bzH" = (/obj/machinery/door/airlock/glass_command{name = "Research Director"; req_access = list(30)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research) +"bzH" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "hop_office_desk"; name = "HoP Office Privacy Shutters"; opacity = 0},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Reception Window"},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access = list(57)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/hop) "bzI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/rnd/research) -"bzJ" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/window/westleft{dir = 8; name = "Server Room"; opacity = 1; req_access = list(30)},/obj/machinery/door/window/westleft{dir = 4; name = "Server Room"; opacity = 1; req_access = list(30)},/turf/simulated/floor{icon_state = "dark"},/area/server) +"bzJ" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bzK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/docking) "bzL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/docking) "bzM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/docking) -"bzN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/rnd/docking) -"bzO" = (/obj/machinery/door_control{id = "acute1"; name = "EMT Storage Privacy Shutters"; pixel_x = 26; pixel_y = 25; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bzP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{id_tag = "cmodoor"; name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bzN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera/network/command{c_tag = "AI Upload"; dir = 4},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"bzO" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) +"bzP" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bzQ" = (/turf/simulated/floor/plating,/area/quartermaster/storage) "bzR" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/quartermaster/storage) "bzS" = (/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/storage) "bzT" = (/turf/simulated/floor{icon_state = "delivery"},/area/quartermaster/storage) "bzU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #1"},/obj/machinery/bot/mulebot{beacon_freq = 1400; home_destination = "QM #1"; suffix = "#1"},/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/storage) -"bzV" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Cargo Office"; dir = 4; network = list("SS13")},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/device/multitool,/turf/simulated/floor,/area/quartermaster/office) +"bzV" = (/obj/machinery/light{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bzW" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor,/area/quartermaster/office) "bzX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster/office) "bzY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/office) @@ -4058,40 +4058,40 @@ "bAb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_three) "bAc" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_three) "bAd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_three) -"bAe" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/vending/wallmed1{pixel_x = -32; pixel_y = 0},/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bAe" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/camera/network/command{c_tag = "Bridge - Captain's Quarters"; dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bAf" = (/obj/structure/closet/secure_closet/hop,/turf/simulated/floor,/area/crew_quarters/heads/hop) "bAg" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/heads/hop) "bAh" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_server_room) -"bAi" = (/obj/machinery/porta_turret{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) +"bAi" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"},/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) "bAj" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_cyborg_station) "bAk" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/table,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/teleporter) "bAl" = (/obj/machinery/light{dir = 1},/obj/structure/table,/obj/item/weapon/hand_tele,/turf/simulated/floor,/area/teleporter) "bAm" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/closet/crate,/obj/item/weapon/crowbar,/turf/simulated/floor,/area/teleporter) "bAn" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/teleporter) -"bAo" = (/obj/machinery/camera{c_tag = "Teleporter"},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor,/area/teleporter) +"bAo" = (/obj/machinery/light{dir = 1},/obj/structure/closet/secure_closet/chemical,/obj/item/weapon/storage/box/pillbottles,/obj/item/device/radio/headset/headset_med,/obj/machinery/camera/network/medbay{c_tag = "Medbay Drug Storage"},/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/chemistry) "bAp" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/teleporter) "bAq" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/teleporter) "bAr" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/hallway/primary/central_two) "bAs" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/random/firstaid,/turf/simulated/floor{dir = 8; icon_state = "whiteyellowcorner"},/area/medical/chemistry) -"bAt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) -"bAu" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/machinery/light,/turf/simulated/floor,/area/quartermaster/office) +"bAt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass{id_tag = "MedbayFoyerPort"; req_access = list(5)},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/medical/medbay) +"bAu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medbay Reception"; req_access = list(5)},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3) "bAv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bAw" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bAx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 1; name = "EMT Storage"; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay) +"bAx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass{id_tag = "MedbayFoyerStar"; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/medical/medbay2) "bAy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bAz" = (/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = "Medbay"; name = "Medbay"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bAA" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access = list(26)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/janitor) +"bAA" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera/network/medbay{c_tag = "Medbay Fore Starboard Corridor"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bAB" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) "bAC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) "bAD" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) "bAE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) -"bAF" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Tech Storage"; req_access = list(19,23)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/storage/tech) +"bAF" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) "bAG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bAH" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bAI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bAJ" = (/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bAK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bAL" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Head of Personnel"},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "hop_office_desk"; name = "Desk Privacy Shutter"; pixel_x = 26; pixel_y = 17},/obj/machinery/button/windowtint{pixel_x = 36; pixel_y = 18},/turf/simulated/floor,/area/crew_quarters/heads/hop) +"bAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/highsecurity{name = "AI Upload"; req_access = list(16)},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) "bAM" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurplecorner"},/area/medical/medbay2) "bAN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/medbay2) "bAO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whitepurplecorner"},/area/medical/medbay2) @@ -4101,9 +4101,9 @@ "bAS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whiteredcorner"},/area/medical/patient_wing) "bAT" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "whitered_c"; tag = "icon-whitered_c (WEST)"},/area/medical/patient_wing) "bAU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bAV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/camera{c_tag = "Medbay Patient Hallway - Starboard"; dir = 1; network = list("SS13")},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"bAV" = (/obj/machinery/door/airlock/maintenance{name = "Teleporter Maintenance"; req_access = list(17)},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/plating,/area/teleporter) "bAW" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bAX" = (/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access = list(23)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/aft) +"bAX" = (/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; pixel_x = -24; pixel_y = 26},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay) "bAY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/assembly/chargebay) "bAZ" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay) "bBa" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -1; pixel_y = -2},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/assembly/robotics) @@ -4122,46 +4122,46 @@ "bBn" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/research) "bBo" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/rnd/research) "bBp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) -"bBq" = (/obj/structure/sign/securearea{pixel_x = -32},/obj/structure/sign/securearea{pixel_x = -32},/obj/structure/sign/securearea{pixel_x = -32},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/rnd/mixing) +"bBq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Medbay Substation"; req_one_access = list(11,24,5)},/turf/simulated/floor/plating,/area/maintenance/substation/medical) "bBr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bBs" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Research Shuttle Maintainance"; dir = 2},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bBt" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Patient A"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/patient_a) +"bBs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_access = list(29)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/assembly/chargebay) +"bBt" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access = list(7)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bBu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora_storage) "bBv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) -"bBw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) -"bBx" = (/obj/structure/closet/emcloset,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bBw" = (/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_one_access = list(12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/storage/emergency) +"bBx" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) "bBy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking) "bBz" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/research/station) -"bBA" = (/obj/machinery/door_control{id = "scanhide"; name = "Diagnostics Room Separation Shutters"; pixel_x = -6; pixel_y = -25; req_access = list(5)},/obj/machinery/door_control{id = "acute2"; name = "Acute Treatment Privacy Shutters"; pixel_x = 6; pixel_y = -25; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bBA" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/device/multitool,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/turf/simulated/floor,/area/quartermaster/office) "bBB" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/research/station) "bBC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "bBD" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) -"bBE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bBE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/office) "bBF" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #2"},/obj/machinery/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/storage) "bBG" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos{eftpos_name = "Cargo Bay EFTPOS scanner"},/turf/simulated/floor,/area/quartermaster/office) "bBH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/quartermaster/office) "bBI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/office) -"bBJ" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Patient B"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/patient_b) -"bBK" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/machinery/camera{c_tag = "Medbay Equipment Storage"; dir = 1},/obj/item/clothing/accessory/stethoscope,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) +"bBJ" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bBK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "bBL" = (/obj/structure/closet/secure_closet/hop2,/turf/simulated/floor,/area/crew_quarters/heads/hop) "bBM" = (/turf/simulated/floor,/area/crew_quarters/heads/hop) "bBN" = (/obj/structure/table,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/megaphone,/turf/simulated/floor,/area/crew_quarters/heads/hop) "bBO" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/heads/hop) "bBP" = (/obj/machinery/message_server,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) -"bBQ" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) -"bBR" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bBS" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "mining_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 25; req_one_access = list(13,48)},/turf/space,/area/space) +"bBQ" = (/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload turret control"; pixel_x = 6; pixel_y = 24},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = -12; pixel_y = 20},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bBR" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bBS" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) "bBT" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plating,/area/medical/genetics) -"bBU" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) +"bBU" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/camera/network/command{c_tag = "Bridge - Teleporter"},/turf/simulated/floor,/area/teleporter) "bBV" = (/obj/machinery/computer/aifixer,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) "bBW" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/teleporter) -"bBX" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/aft) +"bBX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = list(5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bBY" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/teleporter) "bBZ" = (/obj/item/device/radio/beacon,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/teleporter) "bCa" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/teleporter) "bCb" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/teleporter) -"bCc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(8,12)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"bCd" = (/obj/machinery/door/window/southright{name = "Toxins Launcher"; req_access = list(8)},/obj/machinery/door/window/southright{dir = 1; name = "Toxins Launcher"; req_access = list(8)},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/mixing) +"bCc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(5)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bCd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bCe" = (/turf/simulated/floor{dir = 2; icon_state = "whiteyellow"},/area/medical/chemistry) "bCf" = (/obj/structure/closet/wardrobe/chemistry_white,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "whiteyellowcorner"},/area/medical/chemistry) "bCg" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -4171,31 +4171,31 @@ "bCk" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/syringes,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay3) "bCl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "bCm" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bCn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bCo" = (/obj/machinery/door/window/southright{dir = 1; name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/window/southright{name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bCn" = (/obj/machinery/door/airlock{name = "Medbay Substation"; req_access = list(5)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/medical) +"bCo" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "bCp" = (/turf/simulated/wall,/area/medical/genetics) "bCq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bCr" = (/obj/machinery/door/window/southleft{dir = 1; name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/window/southleft{name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bCr" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/camera/network/research{c_tag = "Research Shuttle Dock Maintainance"},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "bCs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/rnd/research) "bCt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/rnd/research) "bCu" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bCv" = (/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) -"bCw" = (/obj/machinery/camera{c_tag = "Research Division North"; dir = 1; network = list("SS13","Research")},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bCw" = (/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access = list(65)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "bCx" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bCy" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bCz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bCA" = (/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/rnd/docking) +"bCA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) "bCB" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) "bCC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "bCD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bCE" = (/obj/structure/sign/nosmoking_2{pixel_x = -32},/obj/machinery/camera{c_tag = "Toxins Lab"; dir = 4; network = list("SS13","Research")},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bCE" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) "bCF" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay3) "bCG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bCH" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bCI" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "research_dock_pump"},/obj/machinery/camera/autoname{dir = 2; network = list("SS13","Supermatter","Atmospherics")},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/rnd/docking) +"bCH" = (/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bCI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking) "bCJ" = (/turf/simulated/wall,/area/rnd/docking) -"bCK" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/engineering) -"bCL" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "mining_dock_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_one_access = list(13,48)},/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock) +"bCK" = (/obj/structure/table,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "research_shuttle"; pixel_x = -8; pixel_y = -25; req_one_access = list(13,65); tag_door = "research_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/research/station) +"bCL" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "cargo_bay"; name = "cargo bay hatch controller"; pixel_x = -30; pixel_y = 0; req_one_access = list(13,31); tag_door = "cargo_bay_door"},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Recieving Dock"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage) "bCM" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage) "bCN" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) "bCO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/quartermaster/storage) @@ -4208,18 +4208,18 @@ "bCV" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/account_database,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/crew_quarters/heads/hop) "bCW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bCX" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/item/device/eftpos{eftpos_name = "HoP EFTPOS scanner"},/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bCY" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bCZ" = (/obj/machinery/computer/message_monitor,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bDa" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bDb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bDc" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_dock_inner"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/turf/simulated/floor,/area/quartermaster/miningdock) -"bDd" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; name = "Private AI Channel"; pixel_x = -12; pixel_y = 20},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload turret control"; pixel_x = 6; pixel_y = 24},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) -"bDe" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Quartermaster"},/turf/simulated/floor,/area/quartermaster/qm) -"bDf" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_dock_outer"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/miningdock) -"bDg" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) -"bDh" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) -"bDi" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) -"bDj" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/turret_protected/ai_cyborg_station) +"bCY" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{id_tag = "cargodoor"; name = "Cargo Office"; req_access = list(50)},/turf/simulated/floor,/area/quartermaster/office) +"bCZ" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) +"bDa" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) +"bDb" = (/obj/machinery/door/airlock/highsecurity{name = "AI Upload Access"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bDc" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bDd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_three) +"bDe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bDf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_three) +"bDg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bDh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_three) +"bDi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bDj" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/command{name = "Teleport Access"; req_access = list(17)},/turf/simulated/floor,/area/teleporter) "bDk" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/teleporter) "bDl" = (/turf/simulated/floor{icon_state = "warning"},/area/teleporter) "bDm" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/teleporter) @@ -4232,7 +4232,7 @@ "bDt" = (/turf/simulated/wall,/area/medical/sleeper) "bDu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute1"; name = "EMT Storage Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/sleeper) "bDv" = (/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"},/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/inaprovaline,/turf/simulated/wall,/area/medical/sleeper) -"bDw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(8)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bDw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bDx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/sleeper) "bDy" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/medbay) "bDz" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -4244,9 +4244,9 @@ "bDF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bDG" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/cryo) "bDH" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/cryo) -"bDI" = (/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera{c_tag = "Medbay Cryogenics"; network = list("SS13")},/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/cryo) +"bDI" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Laboratory"; req_access = list(9)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bDJ" = (/turf/simulated/wall,/area/medical/cryo) -"bDK" = (/obj/machinery/camera{c_tag = "Medbay Cloning"; network = list("SS13")},/obj/structure/closet/wardrobe/medic_white,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) +"bDK" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_one_access = list(5,12,47)},/turf/simulated/floor/plating,/area/maintenance/research_port) "bDL" = (/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bDM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bDN" = (/obj/item/apc_frame,/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/genetics) @@ -4260,7 +4260,7 @@ "bDV" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay3) "bDW" = (/obj/machinery/light{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/rnd/research) "bDX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bDY" = (/obj/machinery/camera{c_tag = "Research Division West"; dir = 2; network = list("SS13","Research")},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bDY" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29,47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bDZ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bEa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bEb" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) @@ -4270,27 +4270,27 @@ "bEf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/rnd/research) "bEg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) "bEh" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bEi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research) -"bEj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research) -"bEk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research) +"bEi" = (/obj/machinery/camera/network/research{c_tag = "Research Division North"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bEj" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access = list(47)},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "delivery"},/area/rnd/research) +"bEk" = (/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access = list(65)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "bEl" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bEm" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock) "bEn" = (/turf/simulated/wall,/area/maintenance/research_shuttle) "bEo" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bEp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bEp" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "bEq" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/medical/sleeper) -"bEr" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Acute Treatment"; req_access = list(5)},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay) -"bEs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/camera{c_tag = "Medbay Acute"; network = list("SS13")},/obj/machinery/door_control{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = 25; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bEr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bEs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking) "bEt" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/sign/poster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/medical/sleeper) -"bEu" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/docking) +"bEu" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/research/station) "bEv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/rnd/docking) -"bEw" = (/obj/machinery/door/airlock/maintenance{name = "Mining Maintenance"; req_access = list(48)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/quartermaster/miningdock) +"bEw" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/light,/turf/simulated/floor,/area/quartermaster/office) "bEx" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage) "bEy" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) "bEz" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) "bEA" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage) "bEB" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/quartermaster/storage) -"bEC" = (/obj/machinery/camera{c_tag = "Cargo Bay South"; dir = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor,/area/quartermaster/storage) +"bEC" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Head of Personnel"},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "hop_office_desk"; name = "Desk Privacy Shutter"; pixel_x = 26; pixel_y = 17},/obj/machinery/button/windowtint{pixel_x = 36; pixel_y = 18},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the office door."; id = "hopdoor"; name = "Office Door Control"; pixel_x = 26; pixel_y = -17; req_access = list(57)},/turf/simulated/floor,/area/crew_quarters/heads/hop) "bED" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/quartermaster/storage) "bEE" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #4"},/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/storage) "bEF" = (/obj/structure/table,/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/obj/item/weapon/tape_roll,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/floor,/area/quartermaster/office) @@ -4298,25 +4298,25 @@ "bEH" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/computer/guestpass{pixel_y = -28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "browncorner"},/area/quartermaster/office) "bEI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/office) "bEJ" = (/obj/structure/noticeboard{pixel_y = -27},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/quartermaster/office) -"bEK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/office) -"bEL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/office) -"bEM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/quartermaster/office) +"bEK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = -24; pixel_y = -8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bEL" = (/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) +"bEM" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload_foyer) "bEN" = (/obj/machinery/atm{pixel_x = -28},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_three) "bEO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/hallway/primary/central_three) "bEP" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/hallway/primary/central_three) "bEQ" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/crew_quarters/heads/hop) -"bER" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel RC"; pixel_y = -30},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1},/turf/simulated/floor,/area/crew_quarters/heads/hop) +"bER" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) "bES" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/turf/simulated/floor,/area/crew_quarters/heads/hop) "bET" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bEU" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) -"bEV" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) -"bEW" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/camera{c_tag = "Messaging Server"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bEX" = (/obj/machinery/camera{c_tag = "AI Upload Access"; dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) -"bEY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) -"bEZ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room"; req_access = list(8)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/rnd/mixing) -"bFa" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/camera{c_tag = "Cyborg Station"; dir = 1},/obj/structure/closet/crate{name = "Camera Assembly Crate"},/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) -"bFb" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) -"bFc" = (/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) +"bEU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bEV" = (/obj/machinery/camera/network/command{c_tag = "AI - Messaging Server"; dir = 1},/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) +"bEW" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 1; name = "Emergency Kit"; req_access = list(5)},/obj/machinery/door/firedoor,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag,/obj/item/device/radio{frequency = 1487; name = "Medbay Emergency Radio Link"},/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/sleeper) +"bEX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = list(5)},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bEY" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/camera/network/medbay{c_tag = "Medbay Equipment Storage"; dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) +"bEZ" = (/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/machinery/camera/network/medbay{c_tag = "Medbay Cryogenics"},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/cryo) +"bFa" = (/obj/structure/closet/wardrobe/medic_white,/obj/machinery/camera/network/medbay{c_tag = "Medbay Cloning"},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) +"bFb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/camera/network/research{c_tag = "Research Division West"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bFc" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized,/turf/simulated/floor/plating,/area/rnd/research) "bFd" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/teleporter) "bFe" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/teleporter) "bFf" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/teleporter) @@ -4328,10 +4328,10 @@ "bFl" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bFm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bFn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bFo" = (/obj/machinery/camera{c_tag = "Medbay Emergency Entrance"; dir = 2; network = list("SS13")},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bFo" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/turf/simulated/floor/plating,/area/rnd/research) "bFp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bFq" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay) -"bFr" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access = list(8)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bFr" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/rnd/research) "bFs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "bFt" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bFu" = (/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/medbay2) @@ -4345,7 +4345,7 @@ "bFC" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/medical/genetics) "bFD" = (/turf/simulated/floor/plating,/area/medical/genetics) "bFE" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/medical/genetics) -"bFF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bFF" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bFG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bFH" = (/obj/machinery/computer/mech_bay_power_console,/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/medical/sleeper) "bFI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay) @@ -4361,7 +4361,7 @@ "bFS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bFT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research) "bFU" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/stamp/rd{pixel_x = 3; pixel_y = -2},/obj/item/weapon/paper/monitorkey,/obj/item/device/megaphone,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bFV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bFV" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bFW" = (/obj/machinery/computer/aifixer,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = -2; pixel_y = 30},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bFX" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/crew_quarters/heads/hor) "bFY" = (/obj/structure/lamarr,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/hor) @@ -4371,12 +4371,12 @@ "bGc" = (/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bGd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bGe" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bGf" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) -"bGg" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/rnd/docking) -"bGh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/rnd/docking) -"bGi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/shuttle/plating,/area/rnd/docking) -"bGj" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "research_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/rnd/docking) -"bGk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bGf" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera/network/research{c_tag = "Research Shuttle Dock"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bGg" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_dock_outer"; locked = 1; name = "Shuttle Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/rnd/docking) +"bGh" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "research_dock_airlock"; name = "exterior access button"; pixel_x = -40; pixel_y = 8; req_one_access = list(13,65)},/obj/structure/lattice,/turf/space,/area/space) +"bGi" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) +"bGj" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Bay South"; dir = 1},/turf/simulated/floor,/area/quartermaster/storage) +"bGk" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/qm) "bGl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "bGm" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "bGn" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -4386,17 +4386,17 @@ "bGr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "bGs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "bGt" = (/turf/simulated/wall,/area/quartermaster/miningdock) -"bGu" = (/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bGu" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/qm) "bGv" = (/turf/simulated/wall,/area/quartermaster/qm) "bGw" = (/obj/structure/filingcabinet,/turf/simulated/floor,/area/quartermaster/qm) "bGx" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor,/area/quartermaster/qm) "bGy" = (/obj/machinery/computer/security/mining,/turf/simulated/floor,/area/quartermaster/qm) "bGz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/quartermaster/qm) -"bGA" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Cargo Bay Entrance"; dir = 8; network = list("SS13")},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_three) +"bGA" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/qm) "bGB" = (/obj/machinery/status_display,/turf/simulated/wall,/area/hallway/primary/central_three) -"bGC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bGD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bGE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bGC" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/qm) +"bGD" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel RC"; pixel_y = -30},/obj/machinery/camera/network/command{c_tag = "Bridge - HoP's Office"; dir = 1},/turf/simulated/floor,/area/crew_quarters/heads/hop) +"bGE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 24; pixel_y = -8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) "bGF" = (/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bGG" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bGH" = (/obj/machinery/vending/medical,/turf/simulated/wall,/area/medical/medbay) @@ -4414,11 +4414,11 @@ "bGT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whiteredcorner"},/area/medical/cryo) "bGU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) "bGV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) -"bGW" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(8)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bGW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) "bGX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bGY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bGZ" = (/obj/structure/disposalpipe/junction{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) -"bHa" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "cmooffice"; name = "CMO Privacy Shutters"; pixel_x = 38; pixel_y = 21},/obj/machinery/door_control{desc = "A remote control switch for the CMO's office."; id = "cmodoor"; name = "CMO Office Door Control"; normaldoorcontrol = 1; pixel_x = 28; pixel_y = 21},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = -15; pixel_y = 38; req_access = list(5)},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "medbayquar"; name = "Medbay Emergency Lockdown Control"; pixel_x = -15; pixel_y = 30; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bHa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) "bHb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/medical/genetics) "bHc" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/medical/genetics) "bHd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) @@ -4426,11 +4426,11 @@ "bHf" = (/obj/item/light_fixture_frame,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) "bHg" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay2) "bHh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 0; icon_state = "shutter0"; id = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cryo) -"bHi" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/bed/roller,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = -32},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/structure/closet/secure_closet/medical_wall{name = "O- Blood Locker"; pixel_x = -32},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper) -"bHj" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29,47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bHi" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/command{c_tag = "AI - Cyborg Station"; dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) +"bHj" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) "bHk" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bHl" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access = list(47)},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "delivery"},/area/rnd/research) -"bHm" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_one_access = list(5,12,47)},/turf/simulated/floor/plating,/area/maintenance/research_port) +"bHl" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/turret_protected/ai_cyborg_station) +"bHm" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/medical/sleeper) "bHn" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bHo" = (/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/crew_quarters/heads/hor) "bHp" = (/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/crew_quarters/heads/hor) @@ -4456,26 +4456,26 @@ "bHJ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_three) "bHK" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_three) "bHL" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Central Primary Hallway South South-West"; dir = 2},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHN" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHO" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central_three) -"bHP" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor{icon_state = "dark"},/area/server) -"bHQ" = (/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/primary/central_three) -"bHR" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/hallway/primary/central_three) -"bHS" = (/obj/machinery/camera{c_tag = "Central Primary Hallway South South-East"; dir = 2},/turf/simulated/floor,/area/hallway/primary/central_three) +"bHM" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "Medbay Emergency Entrance"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bHN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) +"bHO" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Genetics Research"; req_access = list(9)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) +"bHP" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access = list(47)},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bHQ" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/rnd/research) +"bHR" = (/obj/structure/table,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) +"bHS" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) "bHT" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/hallway/primary/central_three) -"bHU" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_two) -"bHV" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor,/area/hallway/primary/central_two) +"bHU" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "research_dock_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_one_access = list(13,65)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bHV" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/camera/network/research{c_tag = "Research Shuttle Dock Airlock"},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/rnd/docking) "bHW" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/central_two) "bHX" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/central_two) "bHY" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/hallway/primary/central_two) -"bHZ" = (/obj/machinery/camera{c_tag = "Central Hallway South-East"; dir = 2},/turf/simulated/floor,/area/hallway/primary/central_two) +"bHZ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_dock_inner"; locked = 1; name = "Shuttle Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) "bIa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay2) "bIb" = (/obj/machinery/light_switch{pixel_x = -22; pixel_y = 11},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bIc" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay) "bId" = (/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) "bIe" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) -"bIf" = (/obj/structure/sign/goldenplaque{desc = "Done No Harm."; name = "Best Doctor 2552"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Medbay Equipment Storage Hallway"; dir = 1; network = list("SS13")},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) +"bIf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "research_dock_pump"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/docking) "bIg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "white_cmo"; tag = "icon-whitehall_m"},/area/medical/medbay3) "bIh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) "bIi" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) @@ -4484,22 +4484,22 @@ "bIl" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) "bIm" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) "bIn" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) -"bIo" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Laboratory"; req_access = list(9)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) +"bIo" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/mining{id_tag = "cargodoor"; name = "Mining Dock"; req_access = list(48)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/miningdock) "bIp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bIq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/genetics) "bIr" = (/obj/item/light_fixture_frame,/turf/simulated/floor/plating,/area/medical/genetics) "bIs" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/genetics) "bIt" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) "bIu" = (/obj/item/weapon/table_parts,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) -"bIv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) +"bIv" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Southwest"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_three) "bIw" = (/turf/simulated/wall/r_wall,/area/maintenance/research_port) "bIx" = (/turf/simulated/wall/r_wall,/area/server) "bIy" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bIz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 0; icon_state = "shutter0"; id = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cryo) -"bIA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"bIB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/server) +"bIA" = (/obj/machinery/door/airlock/command{id_tag = "hopdoor"; name = "Head of Personnel"; req_access = list(57)},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/crew_quarters/heads/hop) +"bIB" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_three) "bIC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/server) -"bID" = (/obj/machinery/camera{c_tag = "Research Division Server Room"; dir = 2; network = list("SS13","Research"); pixel_x = 0},/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "dark"},/area/server) +"bID" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_three) "bIE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay2) "bIF" = (/turf/simulated/wall/r_wall,/area/rnd/storage) "bIG" = (/obj/machinery/computer/area_atmos,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "bot"},/area/rnd/storage) @@ -4508,7 +4508,7 @@ "bIJ" = (/turf/simulated/wall,/area/rnd/storage) "bIK" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) "bIL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research) -"bIM" = (/obj/structure/table/rack,/obj/item/weapon/rig/hazmat,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) +"bIM" = (/obj/machinery/door/airlock/multi_tile/glass{autoclose = 1; dir = 2; req_access = list(5)},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/medical/sleeper) "bIN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bIO" = (/obj/machinery/computer/mecha,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bIP" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) @@ -4516,14 +4516,14 @@ "bIR" = (/obj/structure/table,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/item/weapon/circuitboard/teleporter,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bIS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bIT" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/turf/simulated/floor,/area/quartermaster/miningdock) -"bIU" = (/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access = list(65)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) +"bIU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(5)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) "bIV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/miningdock) "bIW" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/turf/simulated/floor,/area/quartermaster/miningdock) -"bIX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/qm) +"bIX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Laboratory"; req_access = list(9)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) "bIY" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/qm) "bIZ" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/turf/simulated/floor,/area/quartermaster/qm) "bJa" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor,/area/quartermaster/qm) -"bJb" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Quartermaster's Office"; dir = 8},/turf/simulated/floor,/area/quartermaster/qm) +"bJb" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = list(30)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/rnd/research) "bJc" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/hallway/primary/central_three) "bJd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) "bJe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) @@ -4538,8 +4538,8 @@ "bJn" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHE"; location = "AIE"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) "bJo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_three) "bJp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central_three) -"bJq" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) -"bJr" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) +"bJq" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access = list(8)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/rnd/research) +"bJr" = (/obj/structure/table,/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bJs" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) "bJt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) "bJu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_two) @@ -4551,7 +4551,7 @@ "bJA" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) "bJB" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay) "bJC" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor,/area/rnd/storage) -"bJD" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_dock_outer"; locked = 1; name = "Shuttle Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/rnd/docking) +"bJD" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/button/remote/blast_door{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -38; pixel_y = 13; req_access = list(47)},/obj/machinery/button/windowtint{pixel_x = -26; pixel_y = 21},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the cargo doors."; id = "researchdoor"; name = "Research door control"; pixel_x = -27; pixel_y = 13; req_access = list(30)},/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Toxins Test Area","Robots","Anomaly Isolation","Research Outpost"); pixel_x = 0; pixel_y = 34},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bJE" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/medbay4) "bJF" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4) "bJG" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) @@ -4569,7 +4569,7 @@ "bJS" = (/obj/machinery/alarm/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bJT" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bJU" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"bJV" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "research_dock_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = 8; req_one_access = list(13,65)},/turf/space,/area/space) +"bJV" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "research_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/rnd/docking) "bJW" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server) "bJX" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bJY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server) @@ -4579,7 +4579,7 @@ "bKc" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) "bKd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bKe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) -"bKf" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/command{name = "Teleport Access"; req_access = list(17)},/turf/simulated/floor,/area/hallway/primary/central_two) +"bKf" = (/obj/machinery/light/small{dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "research_dock_airlock"; pixel_x = 25; pixel_y = 0; req_one_access = list(13,65); tag_airpump = "research_dock_pump"; tag_chamber_sensor = "research_dock_sensor"; tag_exterior_door = "research_dock_outer"; tag_interior_door = "research_dock_inner"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/docking) "bKg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bKh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bKi" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop) @@ -4588,7 +4588,7 @@ "bKl" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bKm" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/device/flashlight,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bKn" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) -"bKo" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) +"bKo" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Quartermaster"},/obj/machinery/button/windowtint{pixel_x = 24; pixel_y = -24},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the office door."; id = "qmdoor"; name = "Office Door Control"; pixel_x = 15; pixel_y = -25; req_access = list(20)},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the cargo doors."; id = "cargodoor"; name = "Cargo door control"; pixel_x = 15; pixel_y = -34; req_access = list(41)},/turf/simulated/floor,/area/quartermaster/qm) "bKp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/rnd/test_area) "bKq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/rnd/test_area) "bKr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/rnd/test_area) @@ -4599,9 +4599,9 @@ "bKw" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/mining/station) "bKx" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/mining/station) "bKy" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/mining/station) -"bKz" = (/obj/machinery/computer/security/mining,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/camera{c_tag = "Mining Dock"; dir = 4; network = list("SS13")},/turf/simulated/floor,/area/quartermaster/miningdock) +"bKz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - South Southwest"},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central_three) "bKA" = (/turf/simulated/floor,/area/quartermaster/miningdock) -"bKB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/qm) +"bKB" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/primary/central_three) "bKC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/qm) "bKD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/qm) "bKE" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/qm) @@ -4620,13 +4620,13 @@ "bKR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/central_three) "bKS" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Janitor Closet"; name = "Janitor Closet"},/turf/simulated/floor,/area/hallway/primary/central_three) "bKT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bKU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_two) -"bKV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor,/area/hallway/primary/central_two) +"bKU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/central_three) +"bKV" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/central_three) "bKW" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/hallway/primary/central_two) "bKX" = (/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/central_two) "bKY" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/central_two) "bKZ" = (/obj/structure/closet/secure_closet/medical1,/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -31},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/random/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bLa" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) +"bLa" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central_three) "bLb" = (/obj/machinery/sleep_console,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bLc" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "scanhide"; name = "Diagnostics Room Separation Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) "bLd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) @@ -4639,7 +4639,7 @@ "bLk" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "scanhide"; name = "Diagnostics Room Separation Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) "bLl" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4) "bLm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4) -"bLn" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Office"; req_access = list(50)},/turf/simulated/floor,/area/quartermaster/office) +"bLn" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - South Southeast"},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/primary/central_three) "bLo" = (/turf/simulated/wall,/area/medical/genetics_cloning) "bLp" = (/obj/structure/computerframe,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) "bLq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/plating,/area/medical/genetics) @@ -4649,9 +4649,9 @@ "bLu" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_port) "bLv" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/research_port) "bLw" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"bLx" = (/obj/machinery/camera{c_tag = "Cargo Recieving Dock"; dir = 4},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "cargo_bay"; name = "cargo bay hatch controller"; pixel_x = -30; pixel_y = 0; req_one_access = list(13,31); tag_door = "cargo_bay_door"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage) +"bLx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/central_three) "bLy" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"bLz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/server) +"bLz" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Southeast"},/turf/simulated/floor,/area/hallway/primary/central_two) "bLA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server) "bLB" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor{icon_state = "dark"},/area/server) "bLC" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{icon_state = "dark"},/area/server) @@ -4660,7 +4660,7 @@ "bLF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bLG" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bLH" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop) -"bLI" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/science,/obj/item/weapon/cartridge/signal/science{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/science{pixel_x = 4; pixel_y = 6},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("SS13","Research")},/obj/item/clothing/glasses/welding/superior,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) +"bLI" = (/obj/structure/sign/goldenplaque{desc = "Done No Harm."; name = "Best Doctor 2552"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "Medbay Equipment Storage Hallway"; dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) "bLJ" = (/obj/structure/closet/secure_closet/RD,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bLK" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bLL" = (/obj/structure/window/reinforced,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) @@ -4676,7 +4676,7 @@ "bLV" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/mining/station) "bLW" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bLX" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/shuttle/floor,/area/shuttle/mining/station) -"bLY" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) +"bLY" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(9,12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_port) "bLZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bMa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bMb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) @@ -4685,16 +4685,16 @@ "bMe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/miningdock) "bMf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/miningdock) "bMg" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/miningdock) -"bMh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(5)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bMi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/quartermaster/qm) +"bMh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server) +"bMi" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/research{c_tag = "Research - Server Room"},/turf/simulated/floor{icon_state = "dark"},/area/server) "bMj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/quartermaster/qm) "bMk" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/quartermaster/qm) -"bMl" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = list(5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bMl" = (/obj/structure/table/rack,/obj/item/weapon/rig/hazmat/equipped,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bMm" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/central_three) "bMn" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) "bMo" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/junction,/turf/simulated/floor,/area/hallway/primary/central_three) -"bMp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bMq" = (/obj/machinery/door/airlock{name = "Medbay Substation"; req_access = list(5)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/medical) +"bMp" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/rnd/research) +"bMq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking) "bMr" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_two) "bMs" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bMt" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acutesep"; name = "Acute Separation Shutters"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) @@ -4706,12 +4706,12 @@ "bMz" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bMA" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bMB" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/CMO,/obj/item/clothing/mask/gas,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo) -"bMC" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) +"bMC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking) "bMD" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bME" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/medical/medbay2) -"bMF" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/door_control{id = "staffroom"; name = "Staff Room Shutters Control"; pixel_x = -26; pixel_y = 0},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) +"bMF" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/button/remote/blast_door{id = "staffroom"; name = "Staff Room Shutters Control"; pixel_x = -26; pixel_y = 0},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bMG" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bMH" = (/obj/machinery/camera{c_tag = "Medbay Break Room"; network = list("SS13")},/obj/machinery/washing_machine,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) +"bMH" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/space,/area/space) "bMI" = (/obj/structure/noticeboard{pixel_y = 28},/obj/structure/table/woodentable,/obj/item/weapon/book/manual/medical_diagnostics_manual{pixel_y = 7},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 4; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Break Room Emergency Phone"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bMJ" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bMK" = (/turf/simulated/wall,/area/crew_quarters/medbreak) @@ -4719,34 +4719,34 @@ "bMM" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) "bMN" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_port) "bMO" = (/turf/simulated/wall/r_wall,/area/rnd/misc_lab) -"bMP" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Toxins Storage"; dir = 4; network = list("SS13","Research")},/turf/simulated/floor,/area/rnd/storage) +"bMP" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/qm) "bMQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/mob/living/simple_animal/mouse/white,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage) "bMR" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) -"bMS" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) +"bMS" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo - Quartermaster's Office"; dir = 8},/turf/simulated/floor,/area/quartermaster/qm) "bMT" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bMU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) "bMV" = (/turf/simulated/wall/r_wall,/area/rnd/mixing) "bMW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing) "bMX" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing) "bMY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing) -"bMZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) +"bMZ" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/rnd/mixing) "bNa" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bNb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bNc" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bNd" = (/obj/machinery/door/airlock/research{name = "Research Shuttle Dock"; req_access = list(65)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) +"bNd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_three) "bNe" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"bNf" = (/obj/machinery/camera{c_tag = "Toxins Test Chamber North"; network = list("Toxins Test Area")},/obj/machinery/light{dir = 1},/turf/simulated/floor/airless,/area/rnd/test_area) +"bNf" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) "bNg" = (/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bNh" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/obj/structure/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bNi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bNj" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_dock_pump"},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/quartermaster/miningdock) -"bNk" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/research/station) +"bNk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central_three) "bNl" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/quartermaster/miningdock) "bNm" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock) "bNn" = (/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock) "bNo" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/quartermaster/miningdock) "bNp" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/quartermaster/miningdock) -"bNq" = (/obj/structure/closet,/obj/machinery/light_switch{pixel_x = -27},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/quartermaster/qm) +"bNq" = (/obj/machinery/button/remote/blast_door{id = "acute1"; name = "EMT Storage Privacy Shutters"; pixel_x = 26; pixel_y = 25; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bNr" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor,/area/quartermaster/qm) "bNs" = (/obj/structure/table,/obj/item/weapon/coin/silver{pixel_x = -3; pixel_y = 3},/obj/item/weapon/coin/silver,/obj/item/device/eftpos{eftpos_name = "Quartermaster EFTPOS scanner"},/turf/simulated/floor,/area/quartermaster/qm) "bNt" = (/obj/structure/table,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/quartermaster/qm) @@ -4757,7 +4757,7 @@ "bNy" = (/turf/simulated/wall,/area/storage/tech) "bNz" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech) "bNA" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating,/area/storage/tech) -"bNB" = (/obj/machinery/camera{c_tag = "Tech Storage"; dir = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/storage/tech) +"bNB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{id_tag = "cmodoor"; name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bNC" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/turf/simulated/floor/plating,/area/storage/tech) "bND" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/unary_atmos/heater,/obj/item/weapon/circuitboard/unary_atmos/cooler{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) "bNE" = (/obj/machinery/vending/assist,/turf/simulated/floor/plating,/area/storage/tech) @@ -4767,41 +4767,41 @@ "bNI" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bNJ" = (/obj/structure/closet/jcloset,/turf/simulated/floor,/area/janitor) "bNK" = (/obj/structure/closet/l3closet/janitor,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor,/area/janitor) -"bNL" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Custodial Closet"},/turf/simulated/floor,/area/janitor) +"bNL" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/window/westleft{dir = 8; name = "Server Room"; opacity = 1; req_access = list(30)},/obj/machinery/door/window/westleft{dir = 4; name = "Server Room"; opacity = 1; req_access = list(30)},/turf/simulated/floor{icon_state = "dark"},/area/server) "bNM" = (/obj/machinery/newscaster{pixel_y = 30},/turf/simulated/floor,/area/janitor) "bNN" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/janitor) "bNO" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/janitor) "bNP" = (/turf/simulated/floor,/area/janitor) -"bNQ" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) +"bNQ" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/server) "bNR" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "bot"},/area/janitor) "bNS" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engineering) "bNT" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) "bNU" = (/turf/simulated/wall,/area/maintenance/engineering) -"bNV" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = 26},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay) +"bNV" = (/obj/item/weapon/camera_assembly,/turf/simulated/floor/plating,/area/medical/genetics) "bNW" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bNX" = (/obj/item/weapon/camera_assembly,/turf/simulated/floor/plating,/area/medical/genetics) -"bNY" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Janitor"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/janitor) -"bNZ" = (/obj/machinery/hologram/holopad,/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bNX" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Janitor"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/janitor) +"bNY" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/sleeper,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper) +"bNZ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/command{name = "Research Director"; req_access = list(30)},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research) "bOa" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bOb" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access = list(7)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bOc" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/sleeper,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper) -"bOd" = (/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_one_access = list(12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/storage/emergency) +"bOb" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) +"bOc" = (/obj/machinery/computer/security/mining,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Mining Dock"; dir = 4},/turf/simulated/floor,/area/quartermaster/miningdock) +"bOd" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/quartermaster/qm) "bOe" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bOf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Medbay Substation"; req_one_access = list(11,24,5)},/turf/simulated/floor/plating,/area/maintenance/substation/medical) +"bOf" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/quartermaster/qm) "bOg" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) "bOh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bOi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_access = list(29)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/assembly/chargebay) +"bOi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor,/area/hallway/primary/central_three) "bOj" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bOk" = (/obj/structure/table,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "research_shuttle"; pixel_x = -8; pixel_y = -25; req_one_access = list(13,65); tag_door = "research_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/research/station) -"bOl" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) +"bOk" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) +"bOl" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bOm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bOn" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) +"bOn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_three) "bOo" = (/obj/machinery/light,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/medical/genetics) -"bOp" = (/obj/machinery/button/driver{dir = 2; id = "toxinsdriver"; pixel_y = 24},/turf/simulated/floor,/area/rnd/mixing) +"bOp" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins Test Area"); pixel_x = 32; pixel_y = 0},/turf/simulated/floor,/area/rnd/mixing) "bOq" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/engine,/area/rnd/misc_lab) "bOr" = (/obj/machinery/portable_atmospherics/canister,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/rnd/misc_lab) "bOs" = (/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOt" = (/obj/machinery/camera{c_tag = "Miscellaneous Reseach Test Chamber"; dir = 2; network = list("SS13","Research","Miscellaneous Reseach"); pixel_x = 0},/turf/simulated/floor/engine,/area/rnd/misc_lab) +"bOt" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/vending/wallmed1{pixel_x = -32; pixel_y = 0},/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bOu" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/engine,/area/rnd/misc_lab) "bOv" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/engine,/area/rnd/misc_lab) "bOw" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/rnd/misc_lab) @@ -4811,24 +4811,24 @@ "bOA" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) "bOB" = (/obj/machinery/light{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) "bOC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bOD" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bOE" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bOF" = (/obj/machinery/portable_atmospherics/canister,/obj/structure/window/reinforced{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 10; icon_state = "whitepurple"},/area/rnd/mixing) -"bOG" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/rnd/mixing) -"bOH" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/rnd/mixing) -"bOI" = (/obj/machinery/portable_atmospherics/powered/pump,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/rnd/mixing) -"bOJ" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{dir = 6; icon_state = "whitepurple"},/area/rnd/mixing) -"bOK" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/rnd/mixing) -"bOL" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/mixing) -"bOM" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/mixing) -"bON" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) +"bOD" = (/obj/structure/closet/bombcloset,/turf/simulated/floor{dir = 6; icon_state = "whitepurple"},/area/rnd/mixing) +"bOE" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/rnd/mixing) +"bOF" = (/obj/structure/disposalpipe/segment,/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) +"bOG" = (/obj/machinery/portable_atmospherics/canister,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/rnd/mixing) +"bOH" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) +"bOI" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bOJ" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/atmospherics/portables_connector,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) +"bOK" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) +"bOL" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 6; tag_west = 2; use_power = 0},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) +"bOM" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/omni/mixer{tag_east = 1; tag_east_con = 0.5; tag_south = 1; tag_south_con = 0.5; tag_west = 2; use_power = 0},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) +"bON" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 1; name = "EMT Storage"; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay) "bOO" = (/turf/simulated/wall,/area/rnd/mixing) "bOP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/rnd/test_area) -"bOQ" = (/obj/machinery/door/airlock/maintenance{name = "Teleporter Maintenance"; req_access = list(17)},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/plating,/area/teleporter) -"bOR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass{id_tag = "MedbayFoyerPort"; req_access = list(5)},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/medical/medbay) +"bOQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server) +"bOR" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/science,/obj/item/weapon/cartridge/signal/science{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/science{pixel_x = 4; pixel_y = 6},/obj/item/clothing/glasses/welding/superior,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/camera/network/research{c_tag = "Research - RD's Office"; dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) "bOS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/quartermaster/miningdock) -"bOT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medbay Reception"; req_access = list(5)},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3) -"bOU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass{id_tag = "MedbayFoyerStar"; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/medical/medbay2) +"bOT" = (/obj/structure/table,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_shuttle"; pixel_x = 25; pixel_y = -8; req_one_access = list(13,48); tag_door = "mining_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) +"bOU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/light_switch{pixel_x = -24; pixel_y = -24},/turf/simulated/floor,/area/quartermaster/qm) "bOV" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock) "bOW" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/miningdock) "bOX" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/cargo) @@ -4847,79 +4847,79 @@ "bPk" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor,/area/hallway/primary/aft) "bPl" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bPm" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/janitor) -"bPn" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins Test Area"); pixel_x = 32; pixel_y = 0},/turf/simulated/floor,/area/rnd/mixing) +"bPn" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/bed/roller,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = -32},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/structure/closet/secure_closet/medical_wall{name = "O- Blood Locker"; pixel_x = -32},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper) "bPo" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/janitor) "bPp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/janitor) "bPq" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/janitor) "bPr" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/janitor) "bPs" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor,/area/janitor) "bPt" = (/turf/simulated/wall,/area/janitor) -"bPu" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) -"bPv" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access = list(50)},/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor,/area/quartermaster/office) +"bPu" = (/obj/structure/grille/broken,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) +"bPv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/mining{id_tag = "qmdoor"; name = "Quartermaster"; req_access = list(41)},/turf/simulated/floor,/area/quartermaster/qm) "bPw" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/engineering) "bPx" = (/turf/simulated/floor/plating,/area/maintenance/engineering) "bPy" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/engineering) -"bPz" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "hop_office_desk"; name = "HoP Office Privacy Shutters"; opacity = 0},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Reception Window"},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access = list(57)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bPA" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute2"; name = "Acute Privacy Shutters"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay) -"bPB" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"},/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) -"bPC" = (/obj/machinery/camera{c_tag = "Medbay Port Corridor"; dir = 8; network = list("SS13")},/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = 22; pixel_y = -9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) -"bPD" = (/obj/machinery/camera{c_tag = "Medbay CMO Office"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -22; pixel_y = -9},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = -34; pixel_y = 2},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo) +"bPz" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute2"; name = "Acute Privacy Shutters"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay) +"bPA" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_three) +"bPB" = (/mob/living/simple_animal/cat/fluff/Runtime,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bPC" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access = list(26)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/central_three) +"bPD" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_two) "bPE" = (/obj/structure/table,/obj/machinery/computer/skills{pixel_y = 4},/obj/item/device/megaphone,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bPF" = (/obj/structure/table,/obj/item/weapon/paper{desc = "A few notes scratched out by the last CMO before they departed the station."; info = "\[i]\[center]To the incoming CMO of Exodus:\[/i]\[/center]\[br]\[br]I wish you and your crew well. Do take note:\[br]\[br]\[br]The Medical Emergency Red Phone system has proven itself well. Take care to keep the phones in their designated places as they have been optimised for broadcast. The two handheld green radios (I have left one in this office, and one near the Emergency Entrance) are free to be used. The system has proven effective at alerting Medbay of important details, especially during power outages.\[br]\[br]I think I may have left the toilet cubicle doors shut. It might be a good idea to open them so the staff and patients know they are not engaged.\[br]\[br]The new syringe gun has been stored in secondary storage. I tend to prefer it stored in my office, but 'guidelines' are 'guidelines'.\[br]\[br]Also in secondary storage is the grenade equipment crate. I've just realised I've left it open - you may wish to shut it.\[br]\[br]There were a few problems with their installation, but the Medbay Quarantine shutters should now be working again - they lock down the Emergency and Main entrances to prevent travel in and out. Pray you shan't have to use them.\[br]\[br]The new version of the Medical Diagnostics Manual arrived. I distributed them to the shelf in the staff break room, and one on the table in the corner of this room.\[br]\[br]The exam/triage room has the walking canes in it. I'm not sure why we'd need them - but there you have it.\[br]\[br]Emergency Cryo bags are beside the emergency entrance, along with a kit.\[br]\[br]Spare paper cups for the reception are on the left side of the reception desk.\[br]\[br]I've fed Runtime. She should be fine.\[br]\[br]\[br]\[center]That should be all. Good luck!\[/center]"; name = "Outgoing CMO's Notes"},/obj/item/device/radio{frequency = 1487; name = "Medbay Emergency Radio Link"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bPF" = (/obj/machinery/button/remote/blast_door{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = -25; req_access = list(5)},/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Paramedic"},/obj/machinery/camera/network/medbay{c_tag = "Medbay EMT Storage"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bPG" = (/obj/structure/table,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo) -"bPH" = (/obj/machinery/camera{c_tag = "Medbay Starboard Corridor"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) +"bPH" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/camera/network/medbay{c_tag = "Medbay Starboard Corridor"; dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "bPI" = (/obj/structure/disposalpipe/segment,/obj/machinery/newscaster{pixel_x = 30},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bPJ" = (/mob/living/simple_animal/cat/fluff/Runtime,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bPJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoA_window_tint"; pixel_y = 26},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/patient_a) "bPK" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bPL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bPM" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoA_window_tint"; pixel_y = 26},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/patient_a) +"bPM" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoB_window_tint"; pixel_y = 26},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/patient_b) "bPN" = (/obj/machinery/computer/med_data,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bPO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_port) "bPP" = (/obj/machinery/sparker{id = "Xenobio"; pixel_x = -25},/turf/simulated/floor/engine,/area/rnd/misc_lab) "bPQ" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/engine,/area/rnd/misc_lab) "bPR" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bPS" = (/obj/machinery/camera{c_tag = "Telescience Chamber"; dir = 8; network = list("Telesci Test Area")},/obj/structure/table,/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/device/multitool,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/engine,/area/rnd/misc_lab) +"bPS" = (/obj/machinery/washing_machine,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/medbay{c_tag = "Medbay Break Room"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bPT" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage) "bPU" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) "bPV" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bPW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) -"bPX" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(9,12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_port) +"bPX" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Storage"; dir = 4},/turf/simulated/floor,/area/rnd/storage) "bPY" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bPZ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQa" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQb" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQc" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQd" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQe" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/rnd/mixing) +"bPZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bQa" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Waste to Scrubbers"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bQb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bQc" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor{dir = 2; icon_state = "whitehall"},/area/rnd/mixing) +"bQd" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bQe" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/rnd/mixing) "bQf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/mixing) -"bQg" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/rnd/mixing) +"bQg" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/rnd/mixing) "bQh" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/rnd/mixing) -"bQi" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoB_window_tint"; pixel_y = 26},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/patient_b) -"bQj" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins Test Area"); pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/rnd/mixing) +"bQi" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins Test Area"); pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/rnd/mixing) +"bQj" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/camera/network/research{c_tag = "Research Division Central"; dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) "bQk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/mixing) "bQl" = (/turf/simulated/floor/airless{dir = 9; icon_state = "warning"},/area/rnd/test_area) "bQm" = (/turf/simulated/floor/airless{icon_state = "warning"; dir = 1},/area/rnd/test_area) "bQn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bQo" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/obj/item/weapon/ore/iron,/obj/structure/closet/crate,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_dock_pump"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock) -"bQp" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "warning"},/area/quartermaster/miningdock) +"bQp" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/turf/simulated/floor/plating/airless,/area/rnd/test_area) "bQq" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/wall,/area/quartermaster/miningdock) "bQr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock) "bQs" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/quartermaster/miningdock) "bQt" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "QM Office"; name = "QM Office"},/turf/simulated/floor,/area/quartermaster/miningdock) -"bQu" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access = list(8)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/rnd/research) +"bQu" = (/obj/machinery/light{dir = 1},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Test Chamber North"; network = list("Research","Toxins Test Area")},/turf/simulated/floor/airless,/area/rnd/test_area) "bQv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/cargo) "bQw" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "HoP Office"; name = "HoP Office"},/turf/simulated/floor/plating,/area/maintenance/cargo) "bQx" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/cargo) "bQy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/cargo) "bQz" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/storage/tech) "bQA" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor,/area/storage/tech) -"bQB" = (/obj/machinery/camera{c_tag = "Secure Tech Storage"; dir = 2},/turf/simulated/floor,/area/storage/tech) +"bQB" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_dock_airlock"; pixel_x = 25; pixel_y = -5; req_one_access = list(13,48); tag_airpump = "mining_dock_pump"; tag_chamber_sensor = "mining_dock_sensor"; tag_exterior_door = "mining_dock_outer"; tag_interior_door = "mining_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "mining_dock_sensor"; pixel_x = 25; pixel_y = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/quartermaster/miningdock) "bQC" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/storage/tech) "bQD" = (/obj/structure/table,/obj/item/device/aicard,/obj/item/weapon/aiModule/reset,/turf/simulated/floor/plating,/area/storage/tech) "bQE" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/pandemic{pixel_x = -3; pixel_y = 3},/obj/item/weapon/circuitboard/rdconsole,/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe,/obj/item/weapon/circuitboard/rdserver{pixel_x = 3; pixel_y = -3},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tech) "bQF" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/arcade,/obj/item/weapon/circuitboard/message_monitor{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) "bQG" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/security/mining,/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/tech) -"bQH" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Aft Primary Hallway"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"bQH" = (/obj/machinery/sleeper,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper) "bQI" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "bQJ" = (/turf/simulated/floor,/area/hallway/primary/aft) "bQK" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -4935,22 +4935,22 @@ "bQU" = (/obj/structure/closet,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) "bQV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bQW" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bQX" = (/obj/machinery/sleeper,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper) +"bQX" = (/obj/structure/closet,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/quartermaster/qm) "bQY" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/engine,/area/rnd/misc_lab) "bQZ" = (/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo) -"bRa" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = list(30)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/rnd/research) -"bRb" = (/obj/structure/table/rack,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/glasses/hud/health,/obj/item/device/flashlight/pen,/obj/item/weapon/storage/belt/medical,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -38},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/crew_quarters/heads/cmo) +"bRa" = (/obj/structure/table/rack,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/glasses/hud/health,/obj/item/device/flashlight/pen,/obj/item/weapon/storage/belt/medical,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -38},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/crew_quarters/heads/cmo) +"bRb" = (/obj/item/weapon/stool,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -30},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bRc" = (/obj/structure/table,/obj/item/weapon/folder/white{pixel_y = 10},/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/weapon/stamp/cmo,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo) -"bRd" = (/obj/structure/table,/obj/machinery/door_control{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = 5; pixel_y = 15; req_access = list(47)},/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bRe" = (/obj/machinery/door/airlock/multi_tile/glass{autoclose = 1; dir = 2; req_access = list(5)},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/medical/sleeper) +"bRd" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/security{c_tag = "Engineering - Technical Storage"},/turf/simulated/floor/plating,/area/storage/tech) +"bRe" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/security{c_tag = "Custodial Closet"},/turf/simulated/floor,/area/janitor) "bRf" = (/obj/machinery/computer/crew,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bRg" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/patient_a) "bRh" = (/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/patient_a) -"bRi" = (/obj/item/weapon/stool,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -30},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) +"bRi" = (/obj/item/weapon/stool,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bRj" = (/turf/simulated/wall,/area/medical/patient_a) "bRk" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/patient_b) "bRl" = (/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/patient_b) -"bRm" = (/obj/item/weapon/stool,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) +"bRm" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/patient_a) "bRn" = (/turf/simulated/wall,/area/medical/patient_b) "bRo" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/engine,/area/rnd/misc_lab) "bRp" = (/obj/structure/table,/obj/item/device/assembly/igniter,/turf/simulated/floor/engine,/area/rnd/misc_lab) @@ -4959,21 +4959,21 @@ "bRs" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) "bRt" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bRu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) -"bRv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Laboratory"; req_access = list(9)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) +"bRv" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access = list(26)},/turf/simulated/floor{icon_state = "delivery"},/area/janitor) "bRw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bRx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(5)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) -"bRy" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = list(57)},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_three) -"bRz" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload Access"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "vault"},/area/hallway/primary/central_three) -"bRA" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/mining{name = "Mining Dock"; req_access = list(48)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/miningdock) -"bRB" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "research_dock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "research_dock_airlock"; pixel_x = 25; pixel_y = 0; req_one_access = list(13,65); tag_airpump = "research_dock_pump"; tag_chamber_sensor = "research_dock_sensor"; tag_exterior_door = "research_dock_outer"; tag_interior_door = "research_dock_inner"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/docking) +"bRx" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bRy" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bRz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bRA" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Staff Room"; req_access = list(5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay2) +"bRB" = (/obj/machinery/camera/network/research{c_tag = "Research - Miscellaneous Test Chamber"; network = list("Research","Miscellaneous Reseach")},/turf/simulated/floor/engine,/area/rnd/misc_lab) "bRC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay) -"bRD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/rnd/mixing) +"bRD" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/rnd/mixing) "bRE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/mixing) -"bRF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/mixing) +"bRF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/rnd/mixing) "bRG" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay2) "bRH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/rnd/mixing) "bRI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/rnd/mixing) -"bRJ" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/patient_a) +"bRJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) "bRK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/mixing) "bRL" = (/turf/simulated/floor/airless{dir = 8; icon_state = "warning"},/area/rnd/test_area) "bRM" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/mining/station) @@ -4986,69 +4986,69 @@ "bRT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/storage/tech) "bRU" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/storage/tech) "bRV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/storage/tech) -"bRW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) +"bRW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(8,12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bRX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/storage/tech) "bRY" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/storage/tech) "bRZ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/storage/tech) "bSa" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/storage/tech) "bSb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/storage/tech) -"bSc" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Toxins Test Area","Robots","Anomaly Isolation","Research Outpost"); pixel_x = 0; pixel_y = 2},/obj/structure/table,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) +"bSc" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_dock_outer"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bSd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "bSe" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/primary/aft) -"bSf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Genetics Research"; req_access = list(9)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) -"bSg" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access = list(47)},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bSf" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/patient_b) +"bSg" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bSh" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) -"bSi" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engineering) +"bSi" = (/obj/structure/grille/broken,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engineering) "bSj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) "bSk" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/engineering) "bSl" = (/obj/structure/table,/obj/item/device/t_scanner,/turf/simulated/floor/plating,/area/maintenance/engineering) "bSm" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bSn" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/patient_b) +"bSn" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "mining_dock_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_one_access = list(13,48)},/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock) "bSo" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bSp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay2) "bSq" = (/obj/machinery/light,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/crew_quarters/heads/cmo) -"bSr" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) +"bSr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Heater to Waste"},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/rnd/mixing) "bSs" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bSt" = (/obj/machinery/computer/crew,/obj/machinery/light,/turf/simulated/floor{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/crew_quarters/heads/cmo) -"bSu" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_dock_inner"; locked = 1; name = "Shuttle Airlock"; req_access = list(13)},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) +"bSu" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_dock_inner"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/turf/simulated/floor,/area/quartermaster/miningdock) "bSv" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bSw" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "research_dock_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_one_access = list(13,65)},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/rnd/docking) +"bSw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/miningdock) "bSx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bSy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bSz" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins Test Area"); pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/rnd/mixing) +"bSy" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins Test Area"); pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/rnd/mixing) +"bSz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "bSA" = (/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay Lobby)"; pixel_x = 0; pixel_y = -30},/obj/machinery/hologram/holopad,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) "bSB" = (/obj/machinery/light,/obj/machinery/vending/snack,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bSC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) +"bSC" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) "bSD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_a) -"bSE" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) -"bSF" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 1; name = "Emergency Kit"; req_access = list(5)},/obj/machinery/door/firedoor,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag,/obj/item/device/radio{frequency = 1487; name = "Medbay Emergency Radio Link"},/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/sleeper) +"bSE" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/engineering) +"bSF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/requests_console{department = "Tech storage"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech) "bSG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_b) -"bSH" = (/obj/machinery/light/small{dir = 4},/obj/machinery/requests_console{department = "Tech storage"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech) +"bSH" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/aft) "bSI" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage) "bSJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage) "bSK" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) "bSL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bSM" = (/obj/structure/closet/bombcloset,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bSN" = (/obj/structure/closet/bombcloset,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bSO" = (/obj/item/device/assembly/prox_sensor{pixel_x = -4; pixel_y = 1},/obj/item/device/assembly/prox_sensor{pixel_x = 8; pixel_y = 9},/obj/item/device/assembly/prox_sensor{pixel_x = 9; pixel_y = -2},/obj/item/device/assembly/prox_sensor{pixel_x = 0; pixel_y = 2},/obj/structure/table,/turf/simulated/floor{dir = 9; icon_state = "whitepurple"},/area/rnd/mixing) -"bSP" = (/obj/item/device/assembly/signaler{pixel_x = 0; pixel_y = 8},/obj/item/device/assembly/signaler{pixel_x = -8; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = 6; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = -2; pixel_y = -2},/obj/structure/table,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/mixing) -"bSQ" = (/obj/item/device/assembly/timer{pixel_x = 5; pixel_y = 4},/obj/item/device/assembly/timer{pixel_x = -4; pixel_y = 2},/obj/item/device/assembly/timer{pixel_x = 6; pixel_y = -4},/obj/item/device/assembly/timer{pixel_x = 0; pixel_y = 0},/obj/structure/table,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/mixing) -"bSR" = (/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 5},/obj/item/device/transfer_valve{pixel_x = 5},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/mixing) -"bSS" = (/obj/structure/dispenser,/turf/simulated/floor{dir = 5; icon_state = "whitepurple"},/area/rnd/mixing) -"bST" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/aft) -"bSU" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"bSV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = list(5)},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bSW" = (/obj/machinery/camera{c_tag = "Toxins Launch Room Access"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/rnd/mixing) +"bSM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bSN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Heated to Waste"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bSO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/rnd/mixing) +"bSP" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bSQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bSR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bSS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bST" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"bSU" = (/turf/simulated/wall,/area/engineering/break_room) +"bSV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/button/remote/blast_door{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = 25; req_access = list(5)},/obj/machinery/camera/network/medbay{c_tag = "Medbay Acute"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bSW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Acute Treatment"; req_access = list(5)},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay) "bSX" = (/obj/machinery/disposal,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -30; pixel_y = 0},/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/rnd/mixing) "bSY" = (/turf/simulated/floor{icon_state = "warning"},/area/rnd/mixing) -"bSZ" = (/turf/simulated/wall,/area/engineering/break_room) +"bSZ" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/medical/sleeper) "bTa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/mixing) "bTb" = (/turf/simulated/floor/airless{dir = 4; icon_state = "warning"},/area/rnd/test_area) "bTc" = (/turf/simulated/floor/airless{icon_state = "warningcorner"; dir = 1},/area/rnd/test_area) "bTd" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/mining/station) "bTe" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area/shuttle/mining/station) "bTf" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/mining/station) -"bTg" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) +"bTg" = (/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = 22; pixel_y = -9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/network/medbay{c_tag = "Medbay Port Corridor"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) "bTh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bTi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bTj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock) @@ -5065,10 +5065,10 @@ "bTu" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/security/engineering,/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) "bTv" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/secure_data{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/security{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/skills{pixel_x = 4; pixel_y = -3},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/tech) "bTw" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plating,/area/storage/tech) -"bTx" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/medical/sleeper) +"bTx" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/sleeper) "bTy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/aft) "bTz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"bTA" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) +"bTA" = (/obj/machinery/light_switch{pixel_x = -22; pixel_y = -9},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = -34; pixel_y = 2},/obj/machinery/camera/network/medbay{c_tag = "Medbay - CMO's Office"; dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo) "bTB" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/engineering) "bTC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/engineering) "bTD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engineering) @@ -5080,10 +5080,10 @@ "bTJ" = (/turf/simulated/wall,/area/medical/medbay4) "bTK" = (/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "bTL" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay4) -"bTM" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/sleeper) -"bTN" = (/obj/machinery/light{dir = 1},/obj/structure/bed/chair/comfy/teal{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) -"bTO" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bTP" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 26},/obj/structure/bed/chair/comfy/teal{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) +"bTM" = (/obj/machinery/light{dir = 1},/obj/structure/bed/chair/comfy/teal{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) +"bTN" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 26},/obj/structure/bed/chair/comfy/teal{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) +"bTO" = (/obj/structure/table,/obj/item/weapon/paper{desc = "A few notes scratched out by the last CMO before they departed the station."; info = "\[i]\[center]To the incoming CMO of Exodus:\[/i]\[/center]\[br]\[br]I wish you and your crew well. Do take note:\[br]\[br]\[br]The Medical Emergency Red Phone system has proven itself well. Take care to keep the phones in their designated places as they have been optimised for broadcast. The two handheld green radios (I have left one in this office, and one near the Emergency Entrance) are free to be used. The system has proven effective at alerting Medbay of important details, especially during power outages.\[br]\[br]I think I may have left the toilet cubicle doors shut. It might be a good idea to open them so the staff and patients know they are not engaged.\[br]\[br]The new syringe gun has been stored in secondary storage. I tend to prefer it stored in my office, but 'guidelines' are 'guidelines'.\[br]\[br]Also in secondary storage is the grenade equipment crate. I've just realised I've left it open - you may wish to shut it.\[br]\[br]There were a few problems with their installation, but the Medbay Quarantine shutters should now be working again - they lock down the Emergency and Main entrances to prevent travel in and out. Pray you shan't have to use them.\[br]\[br]The new version of the Medical Diagnostics Manual arrived. I distributed them to the shelf in the staff break room, and one on the table in the corner of this room.\[br]\[br]The exam/triage room has the walking canes in it. I'm not sure why we'd need them - but there you have it.\[br]\[br]Emergency Cryo bags are beside the emergency entrance, along with a kit.\[br]\[br]Spare paper cups for the reception are on the left side of the reception desk.\[br]\[br]I've fed Runtime. She should be fine.\[br]\[br]\[br]\[center]That should be all. Good luck!\[/center]"; name = "Outgoing CMO's Notes"},/obj/item/device/radio{frequency = 1487; name = "Medbay Emergency Radio Link"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bTP" = (/obj/machinery/vending/medical,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) "bTQ" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) "bTR" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay4) "bTS" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) @@ -5095,28 +5095,28 @@ "bTY" = (/obj/machinery/iv_drip,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/patient_b) "bTZ" = (/obj/machinery/shieldwallgen{anchored = 1; req_access = list(47)},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bUa" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) -"bUb" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bUb" = (/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "bUc" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; use_power = 1; power_setting = 20; set_temperature = 73},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "dark"},/area/server) "bUd" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "map_vent_out"; use_power = 1},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"bUe" = (/obj/machinery/vending/medical,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) +"bUe" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) "bUf" = (/obj/structure/sign/science{pixel_x = 32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bUg" = (/turf/simulated/wall,/area/rnd/misc_lab) "bUh" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage) "bUi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/rnd/storage) "bUj" = (/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) -"bUk" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/wall/r_wall,/area/rnd/mixing) +"bUk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/mixing) "bUl" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{id = "isoA_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "isoA_window_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "isoA_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "isoA_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_a) "bUm" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 4; id = "isoA_window_tint"},/obj/structure/window/reinforced/polarized{id = "isoA_window_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "isoA_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "isoA_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_a) "bUn" = (/turf/simulated/wall,/area/maintenance/research_starboard) -"bUo" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 25; req_one_access = list(13)},/turf/space,/area/space) +"bUo" = (/obj/structure/table,/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/device/multitool,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/engine,/area/rnd/misc_lab) "bUp" = (/obj/structure/disposaloutlet,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating/airless,/area/rnd/mixing) -"bUq" = (/obj/effect/decal/cleanable/generic,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/maintenance/locker) +"bUq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(8)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bUr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/mixing) "bUs" = (/turf/simulated/floor/airless{icon_state = "warning"},/area/rnd/test_area) "bUt" = (/turf/simulated/floor/airless{dir = 6; icon_state = "warning"},/area/rnd/test_area) "bUu" = (/turf/simulated/floor/airless{dir = 10; icon_state = "warning"},/area/rnd/test_area) "bUv" = (/turf/simulated/wall/r_wall,/area/maintenance/cargo) -"bUw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/locker) +"bUw" = (/obj/machinery/button/remote/driver{dir = 2; id = "toxinsdriver"; pixel_y = 24},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Launch Room"},/turf/simulated/floor,/area/rnd/mixing) "bUx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/cargo) "bUy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/storage/tech) "bUz" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/tech) @@ -5126,7 +5126,7 @@ "bUD" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bUE" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/aft) "bUF" = (/obj/structure/table/reinforced,/obj/machinery/button/ignition{id = "Xenobio"; pixel_x = -6; pixel_y = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bUG" = (/obj/machinery/airlock_sensor{id_tag = "tox_airlock_sensor"; master_tag = "tox_airlock_control"; pixel_y = 24},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/engine,/area/rnd/mixing) +"bUG" = (/obj/machinery/vending/phoronresearch,/turf/simulated/floor{dir = 5; icon_state = "whitepurple"},/area/rnd/mixing) "bUH" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/engineering) "bUI" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/engineering) "bUJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/engineering) @@ -5134,31 +5134,31 @@ "bUL" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engineering) "bUM" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/engineering) "bUN" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/medical/sleeper) -"bUO" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) -"bUP" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker) +"bUO" = (/obj/machinery/light,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bUP" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Mining Dock Airlock"; dir = 8},/turf/simulated/floor{icon_state = "warning"},/area/quartermaster/miningdock) "bUQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/medical/sleeper) -"bUR" = (/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access = list(12)},/obj/machinery/button/driver{id = "trash"; pixel_x = -26; pixel_y = -6},/turf/simulated/floor/plating,/area/maintenance/disposal) +"bUR" = (/obj/machinery/door/airlock/maintenance{name = "Mining Maintenance"; req_access = list(48)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/quartermaster/miningdock) "bUS" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bUT" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "bUU" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay4) "bUV" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/mixing) -"bUW" = (/obj/machinery/camera{c_tag = "Medbay Lounge"; network = list("SS13")},/obj/structure/table,/obj/structure/disposalpipe/segment,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) +"bUW" = (/obj/machinery/camera/network/security{c_tag = "Engineering - Secure Technical Storage"},/turf/simulated/floor,/area/storage/tech) "bUX" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/carpet,/area/engineering/break_room) "bUY" = (/obj/machinery/vending/coffee,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) "bUZ" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) "bVa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay4) "bVb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bVc" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) +"bVc" = (/obj/structure/table/woodentable,/obj/item/weapon/dice,/turf/simulated/floor/carpet,/area/engineering/break_room) "bVd" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) "bVe" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) -"bVf" = (/obj/structure/table/woodentable,/obj/item/weapon/dice,/turf/simulated/floor/carpet,/area/engineering/break_room) +"bVf" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/engineering/break_room) "bVg" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) "bVh" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) "bVi" = (/turf/simulated/wall,/area/medical/patient_wing) -"bVj" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central_two) -"bVk" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"bVj" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bVk" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "cmooffice"; name = "CMO Privacy Shutters"; pixel_x = 38; pixel_y = 21},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the CMO's office."; id = "cmodoor"; name = "CMO Office Door Control"; pixel_x = 28; pixel_y = 21},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = -15; pixel_y = 38; req_access = list(5)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "medbayquar"; name = "Medbay Emergency Lockdown Control"; pixel_x = -15; pixel_y = 30; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) "bVl" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; sortType = "RD Office"; name = "RD Office"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bVm" = (/obj/machinery/door/window/eastleft{name = "Mail"; req_access = list(50)},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "delivery"},/area/quartermaster/office) +"bVm" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(8)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bVn" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bVo" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bVp" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar/red,/obj/item/clothing/glasses/science,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) @@ -5167,18 +5167,18 @@ "bVs" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bVt" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bVu" = (/obj/machinery/computer/security/telescreen{desc = "Used to monitor the proceedings inside the test chamber."; name = "Test Chamber Monitor"; network = list("Miscellaneous Reseach"); pixel_x = 32; pixel_y = 0},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bVv" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access = list(47)},/turf/simulated/floor{icon_state = "white"},/area/hallway/primary/starboard) +"bVv" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/rnd/mixing) "bVw" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bVx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research) -"bVy" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics) -"bVz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) +"bVy" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bVz" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/rnd/mixing) "bVA" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) "bVB" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/rnd/mixing) -"bVC" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/engineering/break_room) -"bVD" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 2},/obj/item/weapon/book/manual/atmospipes,/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bVE" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/evaguide{pixel_x = -2; pixel_y = 7},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bVC" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 2},/obj/item/weapon/book/manual/atmospipes,/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bVD" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/evaguide{pixel_x = -2; pixel_y = 7},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bVE" = (/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/carpet,/area/engineering/break_room) "bVF" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/mixing) -"bVG" = (/obj/item/weapon/wrench,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bVG" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/meter,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) "bVH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "bVI" = (/obj/structure/closet/wardrobe/grey,/obj/item/weapon/storage/backpack,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "bVJ" = (/obj/machinery/mass_driver{dir = 4; id = "toxinsdriver"},/turf/simulated/floor/plating/airless,/area/rnd/mixing) @@ -5186,7 +5186,7 @@ "bVL" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = -32},/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; sortType = "Research"; name = "Research"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bVM" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bVN" = (/obj/item/device/radio/beacon,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/airless{icon_state = "bot"},/area/rnd/test_area) -"bVO" = (/obj/machinery/camera{c_tag = "Toxins Test Chamber East"; dir = 8; network = list("Toxins Test Area")},/obj/machinery/light{dir = 4},/turf/simulated/floor/airless,/area/rnd/test_area) +"bVO" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/mixing) "bVP" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod5/station) "bVQ" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod5/station) "bVR" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/wall,/area/shuttle/escape_pod5/station) @@ -5200,19 +5200,19 @@ "bVZ" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/device/multitool,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating,/area/storage/tech) "bWa" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bWb" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/aft) -"bWc" = (/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/carpet,/area/engineering/break_room) -"bWd" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/medical/sleeper) -"bWe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/medical/sleeper) -"bWf" = (/obj/structure/bed/chair/comfy/teal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/patient_wing) -"bWg" = (/obj/structure/bed/chair/comfy/teal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/medical/patient_wing) -"bWh" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access = list(33)},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "chemcounter"; name = "Pharmacy Counter Shutters"; opacity = 0},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/medical/chemistry) -"bWi" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Scientist"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bWc" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/medical/sleeper) +"bWd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/medical/sleeper) +"bWe" = (/obj/structure/bed/chair/comfy/teal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/patient_wing) +"bWf" = (/obj/structure/bed/chair/comfy/teal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/medical/patient_wing) +"bWg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bWh" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Scientist"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bWi" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/rnd/mixing) "bWj" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Medbay"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/medical/sleeper) -"bWk" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker) +"bWk" = (/obj/structure/dispenser,/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/rnd/mixing) "bWl" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/medical/sleeper) -"bWm" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/effect/landmark/start{name = "Captain"},/obj/machinery/door_control{desc = "A remote control-switch for the office door."; id = "captaindoor"; name = "Office Door Control"; normaldoorcontrol = 1; pixel_x = 15; pixel_y = 30; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door_control{desc = "A remote control-switch for the starboard bridge doors."; id = "sbridgedoor"; name = "Bridge Door Control"; normaldoorcontrol = 1; pixel_x = 15; pixel_y = 39; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bWn" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) -"bWo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/medical/sleeper) +"bWm" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) +"bWn" = (/obj/machinery/light_switch{pixel_x = -22; pixel_y = -10},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bWo" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access = list(8)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) "bWp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/medical/sleeper) "bWq" = (/obj/machinery/door/blast/shutters{dir = 2; id = "qm_warehouse"; name = "Warehouse Shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage) "bWr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) @@ -5231,52 +5231,52 @@ "bWE" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "bWF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/medical/patient_wing) "bWG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitered_a"; tag = "icon-whitered_a (WEST)"},/area/medical/patient_wing) -"bWH" = (/obj/machinery/light_switch{pixel_x = -22; pixel_y = -10},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bWH" = (/obj/structure/bed/chair/comfy/beige,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room) "bWI" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 25},/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bWJ" = (/obj/structure/bed/chair/comfy/beige,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bWJ" = (/turf/simulated/floor/carpet,/area/engineering/break_room) "bWK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitered_b"; tag = "icon-whitered_b (WEST)"},/area/medical/patient_wing) "bWL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/patient_wing) -"bWM" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/command{name = "Conference Room"; req_access = list(19)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/maintenance/substation/command) +"bWM" = (/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) "bWN" = (/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bWO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bWP" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bWQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bWR" = (/turf/simulated/floor/carpet,/area/engineering/break_room) +"bWR" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/carpet,/area/engineering/break_room) "bWS" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bWT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bWU" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bWV" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Mailing Room"; req_access = list(50)},/turf/simulated/floor{icon_state = "bot"},/area/hallway/primary/central_one) +"bWU" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) +"bWV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room"; req_access = list(8)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/rnd/mixing) "bWW" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bWX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bWY" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bWZ" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bXa" = (/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) +"bXa" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/rnd/mixing) "bXb" = (/obj/machinery/air_sensor{frequency = 1430; id_tag = "toxins_mixing_exterior"; output = 63},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"bXc" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; req_access = list(31)},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"bXc" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Tech Storage"; req_access = list(19,23)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/storage/tech) "bXd" = (/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume{dir = 2; frequency = 1379; id = "tox_airlock_pump"},/obj/machinery/air_sensor{frequency = 1430; id_tag = "toxins_mixing_interior"; output = 63; pixel_x = -8; pixel_y = -18},/turf/simulated/floor/engine,/area/rnd/mixing) -"bXe" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Robotics Desk"; req_access = list(29)},/turf/simulated/floor/plating,/area/hallway/primary/starboard) -"bXf" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/window/southright{name = "Research and Development Desk"; req_access = list(7)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/hallway/primary/starboard) +"bXe" = (/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access = list(23)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/aft) +"bXf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Aft"; dir = 8},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bXg" = (/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) "bXh" = (/obj/machinery/computer/general_air_control{frequency = 1430; name = "Mixing Chamber Monitor"; sensors = list("toxins_mixing_exterior" = "Mixing Chamber - Exterior", "toxins_mixing_interior" = "Mixing Chamber - Interior")},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/mixing) -"bXi" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bXi" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/wall/r_wall,/area/rnd/mixing) "bXj" = (/turf/simulated/floor/plating,/area/maintenance/research_starboard) "bXk" = (/turf/simulated/floor/airless{dir = 5; icon_state = "warning"},/area/rnd/test_area) "bXl" = (/turf/simulated/floor/airless{icon_state = "warningcorner"; dir = 4},/area/rnd/test_area) "bXm" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/station) -"bXn" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) -"bXo" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/ointment{pixel_y = 10},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) -"bXp" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/airlock/research{name = "Mech Bay"; req_access = list(29)},/turf/simulated/floor,/area/hallway/primary/starboard) -"bXq" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bXn" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/bruise_pack{pixel_x = -4; pixel_y = 3},/obj/item/stack/medical/ointment{pixel_y = 10},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) +"bXo" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) +"bXp" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access = list(26)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/janitor) +"bXq" = (/obj/machinery/button/remote/blast_door{id = "scanhide"; name = "Diagnostics Room Separation Shutters"; pixel_x = -6; pixel_y = -25; req_access = list(5)},/obj/machinery/button/remote/blast_door{id = "acute2"; name = "Acute Treatment Privacy Shutters"; pixel_x = 6; pixel_y = -25; req_access = list(5)},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bXr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_5_berth"; pixel_x = -25; pixel_y = 25; tag_door = "escape_pod_5_berth_hatch"},/turf/simulated/floor/plating,/area/maintenance/cargo) "bXs" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/cargo) "bXt" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"bXu" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) -"bXv" = (/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/engine,/area/rnd/mixing) -"bXw" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "specops_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "specops_dock_pump"; tag_chamber_sensor = "specops_dock_sensor"; tag_exterior_door = "specops_dock_outer"; tag_interior_door = "specops_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "specops_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "specops_dock_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) -"bXx" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor{dir = 4; icon_state = "yellowpatch"},/area/engineering/foyer) -"bXy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) -"bXz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/foyer) -"bXA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/foyer) +"bXu" = (/obj/structure/sign/nosmoking_2{pixel_x = -32},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Lab"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) +"bXv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient A"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/patient_a) +"bXw" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor{dir = 4; icon_state = "yellowpatch"},/area/engineering/foyer) +"bXx" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient Room B"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/patient_b) +"bXy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/foyer) +"bXz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/foyer) +"bXA" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{dir = 2; icon_state = "yellowpatch"},/area/engineering/foyer) "bXB" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 32},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/engineering) "bXC" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/medical/sleeper) "bXD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/medical/sleeper) @@ -5302,32 +5302,32 @@ "bXX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) "bXY" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/research) "bXZ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/substation/research) -"bYa" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"bYa" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) "bYb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/research_port) "bYc" = (/turf/simulated/wall,/area/maintenance/substation/research) "bYd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/research_port) -"bYe" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{dir = 2; icon_state = "yellowpatch"},/area/engineering/foyer) +"bYe" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/foyer) "bYf" = (/turf/simulated/wall,/area/maintenance/research_port) "bYg" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = -32},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_port) "bYh" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bYi" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/obj/machinery/power/sensor{name = "Powernet Sensor - Research Subgrid"; name_tag = "Research Subgrid"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/substation/research) -"bYj" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/foyer) +"bYj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/break_room) "bYk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) "bYl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/research_port) "bYm" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bYn" = (/obj/machinery/light_switch{pixel_x = 7; pixel_y = -23},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bYo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/locker) +"bYo" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) "bYp" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bYq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bYr" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bYs" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bYt" = (/obj/machinery/camera{c_tag = "Research Division South"; dir = 1; network = list("SS13","Research"); pixel_x = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bYt" = (/obj/machinery/airlock_sensor{id_tag = "tox_airlock_sensor"; master_tag = "tox_airlock_control"; pixel_y = 24},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/engine,/area/rnd/mixing) "bYu" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "bYv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bYw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) -"bYx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/break_room) -"bYy" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/supermatter_engine{pixel_x = -3},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bYz" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/machinery/light,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) +"bYw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Launch Room Access"; dir = 1},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/rnd/mixing) +"bYx" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/supermatter_engine{pixel_x = -3},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bYy" = (/obj/structure/bed/chair/comfy/beige{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bYz" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "tox_airlock_pump"; tag_exterior_door = "tox_airlock_exterior"; id_tag = "tox_airlock_control"; tag_interior_door = "tox_airlock_interior"; pixel_x = -24; pixel_y = 0; tag_chamber_sensor = "tox_airlock_sensor"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/tvalve/bypass{dir = 8},/turf/simulated/floor{dir = 1; icon_state = "warnwhitecorner"},/area/rnd/mixing) "bYA" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/mixing) "bYB" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/research_starboard) "bYC" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/research_starboard) @@ -5335,34 +5335,34 @@ "bYE" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/cargo) "bYF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/wall,/area/maintenance/cargo) "bYG" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/cargo) -"bYH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"bYH" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "mining_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 25; req_one_access = list(13,48)},/turf/space,/area/space) "bYI" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/chief) "bYJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) "bYK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) "bYL" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/crew_quarters/heads/chief) -"bYM" = (/obj/machinery/computer/station_alert,/obj/machinery/computer/security/telescreen{desc = "Used to monitor the engine room."; layer = 3.3; name = "Engine Monitor"; network = list("Supermatter"); pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bYM" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/aft) "bYN" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "bYO" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "bYP" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/crew_quarters/heads/chief) -"bYQ" = (/obj/structure/bed/chair/comfy/beige{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bYR" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bYS" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bYT" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/locker) -"bYU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bYV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) -"bYW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -20; pixel_y = 22},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) -"bYX" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) -"bYY" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) -"bYZ" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay4) -"bZa" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay4) -"bZb" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{id = "isoC_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "isoC_window_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "isoC_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "isoC_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_c) -"bZc" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"bYQ" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bYR" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bYS" = (/obj/machinery/door/window/southright{dir = 1; name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/window/southright{name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bYT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/carpet,/area/engineering/break_room) +"bYU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) +"bYV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -20; pixel_y = 22},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) +"bYW" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) +"bYX" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) +"bYY" = (/obj/machinery/door/window/southleft{dir = 1; name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/window/southleft{name = "Test Chamber"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bYZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/rnd/mixing) +"bZa" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{id = "isoC_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "isoC_window_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "isoC_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "isoC_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_c) +"bZb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(8,12)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bZc" = (/obj/machinery/door/window/southright{name = "Toxins Launcher"; req_access = list(8)},/obj/machinery/door/window/southright{dir = 1; name = "Toxins Launcher"; req_access = list(8)},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/mixing) "bZd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -29},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bZe" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall/r_wall,/area/rnd/mixing) +"bZe" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) "bZf" = (/turf/simulated/wall/r_wall,/area/maintenance/atmos_control) "bZg" = (/turf/simulated/wall,/area/maintenance/atmos_control) "bZh" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) -"bZi" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"bZi" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/cargo) "bZj" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/medical/sleeper) "bZk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/medical/sleeper) "bZl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/medical/sleeper) @@ -5371,68 +5371,68 @@ "bZo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "bZp" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "bZq" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/medbay4) -"bZr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 1},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/super/equipment{dir = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bZs" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/flasher{id = "AI"; pixel_x = 22; pixel_y = 24},/obj/machinery/turretid/stun{check_synth = 1; name = "AI Chamber turret control"; pixel_x = 36; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bZr" = (/obj/machinery/button/remote/blast_door{id = "scanhide"; name = "Diagnostics Room Separation Shutters"; pixel_x = -6; pixel_y = 25; req_access = list(5)},/obj/machinery/atmospherics/unary/freezer{dir = 8; icon_state = "freezer"},/obj/machinery/button/remote/blast_door{id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; pixel_x = 6; pixel_y = 25; req_access = list(5)},/turf/simulated/floor{icon_state = "delivery"},/area/medical/sleeper) +"bZs" = (/obj/structure/table,/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/medbay{c_tag = "Medbay Lounge"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) "bZt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/hallway/primary/starboard) -"bZu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor,/area/hallway/primary/starboard) -"bZv" = (/obj/machinery/camera{c_tag = "Medbay Patient Hallway - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"bZu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Sub-Acute A"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"bZv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Sub-Acute B"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "bZw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_port) "bZx" = (/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "bZy" = (/turf/simulated/wall,/area/medical/biostorage) -"bZz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_one_access = list(5,12,47)},/turf/simulated/floor/plating,/area/hallway/primary/starboard) +"bZz" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access = list(8)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/rnd/research) "bZA" = (/turf/simulated/wall,/area/medical/patient_c) -"bZB" = (/obj/machinery/door/airlock/maintenance{name = "Maintenance Access"; req_access = list(12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/exit) -"bZC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access = list(12)},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/disposal) +"bZB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) +"bZC" = (/obj/machinery/light{dir = 4},/obj/machinery/camera/network/research{c_tag = "Research Toxins Test Chamber East"; dir = 8; network = list("Research","Toxins Test Area")},/turf/simulated/floor/airless,/area/rnd/test_area) "bZD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) "bZE" = (/obj/machinery/light,/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bZF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) "bZG" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "bZH" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/maintenance/atmos_control) -"bZI" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/camera{c_tag = "Telescience Control Room"; dir = 1; network = list("SS13","Research"); pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"bZI" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) "bZJ" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/closet/bombcloset,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "bZK" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light,/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bZL" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/locker) +"bZL" = (/obj/machinery/door/window/eastleft{name = "Medical Delivery"; req_access = list(5)},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "delivery"},/area/medical/sleeper) "bZM" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/blast/shutters{dir = 2; id = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor{icon_state = "delivery"},/area/hallway/primary/starboard) "bZN" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/hallway/primary/starboard) -"bZO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"bZP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bZO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/mixing) +"bZP" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "bZQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/research_starboard) "bZR" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/research_starboard) -"bZS" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) -"bZT" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"bZU" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"bZV" = (/obj/machinery/button/driver{id = "enginecore"; name = "Emergency Core Eject"; pixel_x = -20; pixel_y = 0},/obj/structure/window/basic{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/heads/chief) -"bZW" = (/obj/structure/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chief Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"bZX" = (/obj/structure/bed/chair{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bZS" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space) +"bZT" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"bZU" = (/obj/machinery/button/remote/driver{id = "enginecore"; name = "Emergency Core Eject"; pixel_x = -20; pixel_y = 0},/obj/structure/window/basic{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/heads/chief) +"bZV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/medical/sleeper) +"bZW" = (/obj/structure/bed/chair{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bZX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) "bZY" = (/obj/structure/table/reinforced,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief) "bZZ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"caa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) +"caa" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Medbay Patient Wing Maintenance Access"; req_access = list(5)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/patient_wing) "cab" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cac" = (/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "AI Core Door"; req_access = list(16)},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cac" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering/foyer) "cad" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/flame/lighter/zippo,/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief) -"cae" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering/foyer) +"cae" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) "caf" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cag" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) -"cah" = (/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"cai" = (/obj/structure/disposalpipe/sortjunction{sortType = "CE Office"; name = "CE Office"},/turf/simulated/floor,/area/engineering/foyer) -"caj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/break_room) -"cak" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/yellow,/turf/simulated/floor/carpet,/area/engineering/break_room) -"cal" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/carpet,/area/engineering/break_room) -"cam" = (/obj/machinery/newscaster{pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/engineering/break_room) -"can" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/iv_drip,/turf/simulated/floor,/area/medical/sleeper) -"cao" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/structure/bed/roller,/turf/simulated/floor,/area/medical/sleeper) -"cap" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/comfy/teal{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/ward) +"cag" = (/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) +"cah" = (/obj/structure/disposalpipe/sortjunction{sortType = "CE Office"; name = "CE Office"},/turf/simulated/floor,/area/engineering/foyer) +"cai" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/break_room) +"caj" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/yellow,/turf/simulated/floor/carpet,/area/engineering/break_room) +"cak" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/carpet,/area/engineering/break_room) +"cal" = (/obj/machinery/newscaster{pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/engineering/break_room) +"cam" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/iv_drip,/turf/simulated/floor,/area/medical/sleeper) +"can" = (/obj/machinery/button/remote/blast_door{id = "misclab"; name = "Test Chamber Blast Doors"; pixel_x = 6; pixel_y = 30; req_access = list(47)},/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) +"cao" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/comfy/teal{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/ward) +"cap" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/bed/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "caq" = (/turf/simulated/wall,/area/crew_quarters/sleep/engi_wash) "car" = (/obj/item/weapon/cigbutt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/engineering) "cas" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "delivery"},/area/medical/sleeper) "cat" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/turf/simulated/floor,/area/medical/sleeper) -"cau" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/bed/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"cav" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cau" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cav" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "caw" = (/obj/machinery/power/apc/high{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor,/area/medical/sleeper) -"cax" = (/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = -27; pixel_y = 4},/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_y = 25},/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 32},/obj/machinery/requests_console{department = "AI"; departmentType = 5; pixel_x = -32; pixel_y = 32},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/door_control{desc = "A remote control-switch for the AI core maintenance door."; id = "AICore"; name = "AI Maintenance Hatch"; pixel_x = 17; pixel_y = 25; req_access = list(109)},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cax" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_access = list(47)},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "cay" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "caz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"caA" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"caA" = (/obj/machinery/atmospherics/tvalve{dir = 4; name = "siphon switching valve"},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "caB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/ward) "caC" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/ward) "caD" = (/obj/machinery/iv_drip,/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/ward) @@ -5441,7 +5441,7 @@ "caG" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/medical/psych) "caH" = (/obj/structure/table/woodentable,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/wood,/area/medical/psych) "caI" = (/turf/simulated/wall,/area/medical/psych) -"caJ" = (/obj/machinery/atmospherics/tvalve{dir = 4; name = "siphon switching valve"},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"caJ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) "caK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) "caL" = (/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) "caM" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/patient_c) @@ -5454,67 +5454,67 @@ "caT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/meter,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/research_port) "caU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/research_port) "caV" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/plating,/area/maintenance/research_port) -"caW" = (/obj/machinery/door/window{dir = 4; name = "AI Core Door"; req_access = list(16)},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"caW" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1379; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access = list(8)},/turf/simulated/floor/engine,/area/rnd/mixing) "caX" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/device/flashlight,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "caY" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "caZ" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cba" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbb" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cbb" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) "cbc" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbd" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cbd" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) +"cbe" = (/obj/structure/sign/fire{pixel_y = -32},/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/engine,/area/rnd/mixing) +"cbf" = (/obj/machinery/button/remote/blast_door{id = "mixvent"; name = "Mixing Room Vent Control"; pixel_x = -25; pixel_y = 5; req_access = list(7)},/obj/machinery/button/ignition{id = "mixingsparker"; pixel_x = -25; pixel_y = -5},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/valve{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/rnd/mixing) +"cbg" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/rnd/mixing) "cbh" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) -"cbj" = (/obj/item/weapon/storage/box/donut,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/bridge/meeting_room) -"cbk" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_x = 0; pixel_y = -25; req_one_access = list(13)},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/hallway/secondary/exit) -"cbl" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access = list(31)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/storage) -"cbm" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_eva_pump"},/turf/simulated/floor{dir = 9; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) -"cbn" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = 30; pixel_y = -5; req_one_access = list(13)},/turf/space,/area/space) -"cbo" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) -"cbp" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"cbq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"cbr" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"cbi" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1379; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access = list(8)},/turf/simulated/floor/engine,/area/rnd/mixing) +"cbj" = (/obj/machinery/light,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) +"cbk" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_5"; pixel_x = 0; pixel_y = -25; tag_door = "escape_pod_5_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) +"cbl" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_eva_pump"},/turf/simulated/floor{dir = 9; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) +"cbm" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) +"cbn" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/cargo) +"cbo" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"cbp" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"cbq" = (/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) +"cbr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient Hallway - Starboard"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "cbs" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cbt" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Medical Reception"; req_access = list(5)},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/medical/reception) +"cbt" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_access = list(47)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "cbu" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "cbv" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/clothing/glasses/welding/superior,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief) "cbw" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "cbx" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cby" = (/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"cbz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) -"cbA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"cbB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Chemistry Laboratory"; req_access = list(33)},/obj/structure/sign/chemistry{pixel_x = 32},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"cbC" = (/obj/structure/bed/chair/comfy/beige{tag = "icon-comfychair (NORTH)"; icon_state = "comfychair"; dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room) -"cbD" = (/obj/structure/bed/chair/comfy/beige{tag = "icon-comfychair (NORTH)"; icon_state = "comfychair"; dir = 1},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor/carpet,/area/engineering/break_room) -"cbE" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Engineering Break Room"; dir = 8; network = list("SS13")},/turf/simulated/floor/carpet,/area/engineering/break_room) +"cby" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/research{c_tag = "Research Division South"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"cbz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) +"cbA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cbB" = (/obj/structure/bed/chair/comfy/beige{tag = "icon-comfychair (NORTH)"; icon_state = "comfychair"; dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room) +"cbC" = (/obj/structure/bed/chair/comfy/beige{tag = "icon-comfychair (NORTH)"; icon_state = "comfychair"; dir = 1},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor/carpet,/area/engineering/break_room) +"cbD" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/cargo) +"cbE" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "cbF" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 16},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "cbG" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 16},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "cbH" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "cbI" = (/turf/simulated/wall,/area/medical/surgeryobs) -"cbJ" = (/obj/machinery/camera{c_tag = "Medbay Surgery Access"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"cbK" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"cbL" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{pixel_x = -26},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/ward) +"cbJ" = (/obj/machinery/computer/station_alert,/obj/machinery/computer/security/telescreen{desc = "Used to monitor the engine room."; layer = 3.3; name = "Engine Monitor"; network = list("Engine"); pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"cbK" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{pixel_x = -26},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/ward) +"cbL" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) "cbM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "cbN" = (/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cbO" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6,5)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/medbay2) +"cbO" = (/obj/machinery/door/airlock/engineering{name = "Engineering Supplies"; req_one_access = list(10,24,5)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/engineering/break_room) "cbP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/medical/psych) -"cbQ" = (/obj/structure/table/woodentable,/obj/machinery/light_switch{pixel_x = -4},/obj/machinery/button/windowtint{pixel_x = 3},/turf/simulated/floor/wood,/area/medical/psych) -"cbR" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/medical/psych) +"cbQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Medbay Diagnostics Maintenance Access"; req_access = list(5)},/turf/simulated/floor/plating,/area/medical/sleeper) +"cbR" = (/obj/structure/bed/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "cbS" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) "cbT" = (/obj/structure/closet/crate{icon_state = "crateopen"; name = "Grenade Crate"; opened = 1},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) -"cbU" = (/obj/structure/bed/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"cbU" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/patient_c) "cbV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_c) -"cbW" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/patient_c) +"cbW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Patient Ward"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "cbX" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/substation/research) "cbY" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/substation/research) "cbZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/substation/research) "cca" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) "ccb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"ccc" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Examination Room"; req_access = list(5)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) +"ccc" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/medical/psych) "ccd" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/substation/research) -"cce" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/research_port) +"cce" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/research_port) "ccf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/medical/patient_wing) "ccg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) "cch" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) @@ -5523,61 +5523,61 @@ "cck" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/research_port) "ccl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) "ccm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_port) -"ccn" = (/obj/machinery/door/window/eastright{name = "Medical Reception"; req_access = list(5)},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/medical/reception) +"ccn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{id_tag = "mentaldoor"; name = "Mental Health"; req_access = list(64)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/psych) "cco" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/research_port) "ccp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/research_port) -"ccq" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) -"ccr" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = list(57)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/maintenance/substation/command) -"ccs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"cct" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"ccu" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access = list(31)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/quartermaster/storage) -"ccv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"ccq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) +"ccr" = (/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "psych"; name = "Mental Health Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/medical/psych) +"ccs" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Research"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/substation/research) +"cct" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"ccu" = (/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient Hallway - Port"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"ccv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "ccw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "ccx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "ccy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "ccz" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/research_starboard) -"ccA" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Research"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/substation/research) -"ccB" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Research Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/research) -"ccC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"ccD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"ccE" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"ccF" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/turf/simulated/floor,/area/quartermaster/office) -"ccG" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/weapon/rig/ce,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief) +"ccA" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Research Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/research) +"ccB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"ccC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"ccD" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"ccE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Secondary Storage"; req_access = list(5)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) +"ccF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"ccG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Sub-Acute C"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_c) "ccH" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "ccI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"ccJ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"ccJ" = (/obj/machinery/door/airlock/glass_medical{name = "Hygiene Facilities"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) "ccK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "ccL" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 6; name = "Chief Engineer RC"; pixel_x = 0; pixel_y = -34},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"ccM" = (/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{layer = 4; name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"ccM" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/camera/network/research{c_tag = "Research - Miscellaneous"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) "ccN" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "ccO" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"ccP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"ccQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"ccR" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -16; pixel_y = 28},/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/medical/reception) -"ccS" = (/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) -"ccT" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eng_eva_pump"},/obj/machinery/camera{c_tag = "Engineering EVA Airlock"; dir = 1},/turf/simulated/floor{dir = 6; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) -"ccU" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 10; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) -"ccV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) -"ccW" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"ccX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"ccY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"ccZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) -"cda" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) -"cdb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/engineering/foyer) +"ccP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"ccQ" = (/obj/structure/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chief Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/button/windowtint{pixel_x = 36; pixel_y = 18},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the office door."; id = "cedoor"; name = "Office Door Control"; pixel_x = 26; pixel_y = 17; req_access = list(56)},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"ccR" = (/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) +"ccS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/command{id_tag = "cedoor"; name = "Chief Engineer"; req_access = list(56)},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"ccT" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 10; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) +"ccU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) +"ccV" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"ccW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"ccX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) +"ccY" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/structure/bed/roller,/obj/machinery/camera/network/medbay{c_tag = "Medbay Scanning"; dir = 1},/turf/simulated/floor,/area/medical/sleeper) +"ccZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) +"cda" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/engineering/foyer) +"cdb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) "cdc" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -20; pixel_y = -21},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "cdd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cde" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) +"cde" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; name = "Engineering Break Room"; sortType = "Engineering Break Room"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) "cdf" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "cdg" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/surgeryobs) "cdh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/surgeryobs) "cdi" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/surgeryobs) -"cdj" = (/obj/machinery/camera{c_tag = "Medbay Surgery Observation"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/surgeryobs) +"cdj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Diagnostics Room"; req_access = list(5)},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay4) "cdk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/surgeryobs) "cdl" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 22},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/medical/surgeryobs) -"cdm" = (/obj/structure/table,/obj/machinery/door_control{id = "medbayrecquar"; name = "Medbay Entrance Lockdown Shutters Control"; pixel_x = 6; pixel_y = 8; req_access = list(5)},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Reception Emergency Phone"; pixel_x = -5},/turf/simulated/floor,/area/medical/reception) +"cdm" = (/obj/machinery/door/airlock/maintenance{name = "Miscellaneous Reseach Maintenance"; req_access = list(47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/substation/research) "cdn" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor{icon_state = "white_halfo"},/area/medical/medbay4) "cdo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white_halfp"},/area/medical/medbay4) -"cdp" = (/obj/machinery/door/airlock/maintenance{name = "Cargo Bay Maintenance"; req_access = list(31)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/quartermaster/storage) +"cdp" = (/obj/machinery/door/firedoor/border_only{name = "hazard door south"},/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access = list(47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) "cdq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/ward) "cdr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/ward) "cds" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) @@ -5586,14 +5586,14 @@ "cdv" = (/turf/simulated/floor{icon_state = "bcarpet02"},/area/medical/psych) "cdw" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bcarpet03"},/area/medical/psych) "cdx" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) -"cdy" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; name = "Engineering Break Room"; sortType = "Engineering Break Room"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) +"cdy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) "cdz" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{dir = 10; icon_state = "whitered"},/area/medical/patient_c) "cdA" = (/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/patient_c) -"cdB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) +"cdB" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_outer"; locked = 1; name = "Engineering EVA External Access"; req_access = list(13)},/turf/simulated/floor/airless{icon_state = "circuit"},/area/maintenance/atmos_control) "cdC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/research_port) "cdD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) "cdE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/medical/virologyaccess) -"cdF" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/office) +"cdF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) "cdG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance,/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/virologyaccess) "cdH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/medical/virologyaccess) "cdI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) @@ -5601,56 +5601,56 @@ "cdK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/research_port) "cdL" = (/turf/simulated/wall/r_wall,/area/rnd/xenobiology/xenoflora_storage) "cdM" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/turf/simulated/floor{dir = 5; icon_state = "whiteblue"},/area/hallway/primary/starboard) -"cdN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/hallway/primary/central_one) +"cdN" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "exterior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) "cdO" = (/turf/simulated/wall/r_wall,/area/rnd/xenobiology) "cdP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light/small,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology) -"cdQ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) +"cdQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room) "cdR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light/small,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology) "cdS" = (/turf/simulated/wall/r_wall,/area/rnd/xenobiology/xenoflora) -"cdT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/turf/simulated/floor,/area/medical/reception) -"cdU" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/reception) +"cdT" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "eng_eva_pump"; tag_exterior_door = "eng_eva_outer"; frequency = 1379; id_tag = "eng_eva_airlock"; tag_interior_door = "eng_eva_inner"; name = "Engineering Airlock Console"; pixel_y = 25; req_access = list(13); tag_chamber_sensor = "eng_eva_sensor"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor{dir = 5; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) +"cdU" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eng_eva_airlock"; name = "interior access button"; pixel_x = 0; pixel_y = 25; req_access = list(13)},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) "cdV" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/medical/reception) "cdW" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/medical/reception) "cdX" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cdY" = (/obj/structure/table,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Core Modules"; req_access = list(20)},/obj/structure/window/reinforced,/obj/item/weapon/aiModule/corp,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"cdZ" = (/obj/structure/table,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access = list(20)},/obj/item/weapon/aiModule/purge,/obj/structure/window/reinforced,/obj/item/weapon/aiModule/antimov,/obj/item/weapon/aiModule/teleporterOffline,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"cdY" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_eva_inner"; locked = 1; name = "Engineering EVA Internal Access"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"cdZ" = (/obj/structure/closet/secure_closet/engineering_chief,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/crew_quarters/heads/chief) "cea" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "toxin_test_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "toxin_test_sensor"; pixel_x = 0; pixel_y = 16},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/research_starboard) -"ceb" = (/obj/machinery/door/airlock/maintenance{name = "Captain's Office Maintenance"; req_access = list(20)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/captain) -"cec" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"ced" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/machinery/door/blast/regular{density = 1; icon_state = "pdoor1"; id = "Disposal Exit"; name = "Disposal Exit Vent"; opacity = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) -"cee" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room) -"cef" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "admin_shuttle_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "admin_shuttle_dock_pump"; tag_chamber_sensor = "admin_shuttle_dock_sensor"; tag_exterior_door = "admin_shuttle_dock_outer"; tag_interior_door = "admin_shuttle_dock_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry/aft) +"ceb" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = -24; pixel_y = 10; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; pixel_x = -24; pixel_y = -10; req_access = list(10); specialfunctions = 4},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"cec" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) +"ced" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Break Room"; req_one_access = list(10,24,5)},/turf/simulated/floor,/area/engineering/break_room) +"cee" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) +"cef" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/engineering{c_tag = "Engineering Break Room"; dir = 8},/turf/simulated/floor/carpet,/area/engineering/break_room) "ceg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/rnd/test_area) "ceh" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"cei" = (/obj/machinery/camera{c_tag = "Toxins Test Chamber South"; dir = 1; network = list("Toxins Test Area")},/obj/machinery/light,/turf/simulated/floor/airless,/area/rnd/test_area) +"cei" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/network/medbay{c_tag = "Medbay Surgery Access"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "cej" = (/turf/simulated/wall,/area/construction) -"cek" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) -"cel" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) -"cem" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -8; pixel_y = 25; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"cen" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/carpet,/area/engineering/break_room) -"ceo" = (/obj/machinery/iv_drip,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"cep" = (/obj/structure/table,/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) -"ceq" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoC_window_tint"; pixel_y = -26},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/patient_c) -"cer" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology) -"ces" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) -"cet" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"ceu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"cev" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) -"cew" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) -"cex" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"cey" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/obj/structure/cable/green,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) +"cek" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) +"cel" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/ward) +"cem" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/carpet,/area/engineering/break_room) +"cen" = (/obj/machinery/iv_drip,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"ceo" = (/obj/structure/table,/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) +"cep" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoC_window_tint"; pixel_y = -26},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/patient_c) +"ceq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology) +"cer" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/medical/psych) +"ces" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"cet" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"ceu" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/button/windowtint{pixel_x = -25},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 8},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the office door."; id = "mentaldoor"; name = "office door control"; pixel_x = -34; pixel_y = 7},/turf/simulated/floor/wood,/area/medical/psych) +"cev" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient Room C"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/patient_c) +"cew" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) +"cex" = (/obj/item/weapon/shard,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_port) +"cey" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) "cez" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "ceA" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "ceB" = (/obj/machinery/door/airlock/medical{autoclose = 0; icon_state = "door_open"; id_tag = "engineering_cubicle"; name = "Restroom"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"ceC" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"ceC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) "ceD" = (/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryobs) -"ceE" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) +"ceE" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) "ceF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bluecorner"},/area/medical/surgeryobs) "ceG" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/surgeryobs) -"ceH" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) -"ceI" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/folder/white{pixel_y = 0},/obj/item/weapon/pen,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 16},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) +"ceH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) +"ceI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "ceJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"ceK" = (/obj/structure/table,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 3},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) +"ceK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "ceL" = (/turf/simulated/floor{icon_state = "bcarpet05"},/area/medical/psych) "ceM" = (/obj/structure/bookcase,/turf/simulated/floor{icon_state = "bcarpet06"},/area/medical/psych) "ceN" = (/obj/machinery/vending/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) @@ -5658,144 +5658,144 @@ "ceP" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/suit/bio_suit/general,/obj/item/clothing/suit/bio_suit/general,/obj/item/clothing/suit/bio_suit/general,/obj/item/clothing/mask/gas,/obj/item/clothing/head/bio_hood/general,/obj/item/clothing/head/bio_hood/general,/obj/item/clothing/head/bio_hood/general,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) "ceQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/research_port) "ceR" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/mirror{pixel_x = 32},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"ceS" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"ceT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"ceU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"ceS" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"ceT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"ceU" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) "ceV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) -"ceW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"ceX" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"ceY" = (/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"ceW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"ceX" = (/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"ceY" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "ceZ" = (/obj/structure/table,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/hand_labeler,/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/rnd/xenobiology/xenoflora_storage) -"cfa" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"cfa" = (/obj/structure/bed/chair,/turf/simulated/floor,/area/medical/surgeryobs) "cfb" = (/obj/structure/closet/secure_closet/hydroponics{req_access = list(47)},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) -"cfc" = (/obj/structure/bed/chair,/turf/simulated/floor,/area/medical/surgeryobs) +"cfc" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/smartfridge/drying_rack,/turf/simulated/floor{tag = "icon-whitegreen_v (NORTHEAST)"; icon_state = "whitegreen_v"; dir = 5},/area/rnd/xenobiology/xenoflora_storage) "cfd" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/rnd/xenobiology) -"cfe" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/smartfridge/drying_rack,/turf/simulated/floor{tag = "icon-whitegreen_v (NORTHEAST)"; icon_state = "whitegreen_v"; dir = 5},/area/rnd/xenobiology/xenoflora_storage) +"cfe" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cff" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/rnd/xenobiology) "cfg" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = 32},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cfh" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) -"cfi" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; req_access = list(31)},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/quartermaster/storage) -"cfj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/vault/bolted{name = "AI core"; req_access = list(16)},/obj/machinery/door/blast/regular{id = "AICore"; name = "AI core maintenance hatch"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cfk" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"cfi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cfj" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eng_eva_pump"},/obj/machinery/camera/network/security{c_tag = "Engineering Airlock Access"; dir = 1},/turf/simulated/floor{dir = 6; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) +"cfk" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/weapon/rig/ce/equipped,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief) "cfl" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/box/botanydisk,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cfm" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Captain's Desk Door"; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"cfm" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access = list(56)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) "cfn" = (/obj/machinery/botany/extractor,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cfo" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cfp" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/smartfridge,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cfq" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/research_starboard) "cfr" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/research_starboard) -"cfs" = (/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/research_starboard) +"cfs" = (/obj/item/device/radio/intercom{layer = 4; name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/engineering{c_tag = "Engineering - CE's Office"; dir = 1},/turf/simulated/floor,/area/crew_quarters/heads/chief) "cft" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"cfu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/command{name = "Electrical Maintenance"; req_access = list(19)},/turf/simulated/floor/plating,/area/maintenance/substation/command) +"cfu" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) "cfv" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/rnd/test_area) "cfw" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/construction) "cfx" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/construction) "cfy" = (/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/random/tech_supply,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/construction) "cfz" = (/obj/structure/table,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/construction) "cfA" = (/obj/structure/table,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/construction) -"cfB" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"cfC" = (/obj/item/clothing/mask/smokable/cigarette,/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"cfD" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"cfE" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"cfF" = (/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor,/area/engineering/engine_eva) -"cfG" = (/obj/structure/sign/pods,/turf/simulated/wall/r_wall,/area/engineering/engine_eva) -"cfH" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access = list(12)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"cfI" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_eva) -"cfJ" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/locker) -"cfK" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/engineering/foyer) -"cfL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engine_eva) -"cfM" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/foyer) -"cfN" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/foyer) -"cfO" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"cfP" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cfQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cfR" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/flora/pottedplant{icon_state = "plant-20"; tag = "icon-plant-22"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cfB" = (/obj/item/clothing/mask/smokable/cigarette,/turf/simulated/floor/plating/airless,/area/rnd/test_area) +"cfC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"cfD" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"cfE" = (/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor,/area/engineering/engine_eva) +"cfF" = (/obj/structure/sign/pods,/turf/simulated/wall/r_wall,/area/engineering/engine_eva) +"cfG" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Break Room"; req_one_access = list(10,24,5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/break_room) +"cfH" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_eva) +"cfI" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Washroom"; req_one_access = list(10,24,5)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/break_room) +"cfJ" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/engineering/foyer) +"cfK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engine_eva) +"cfL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "Medbay Surgery Observation"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/surgeryobs) +"cfM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Observation Room"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) +"cfN" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) +"cfO" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cfP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cfQ" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/flora/pottedplant{icon_state = "plant-20"; tag = "icon-plant-22"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cfR" = (/obj/machinery/door/airlock/glass_medical{name = "Patient Ward"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "cfS" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "cfT" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cfU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"cfU" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) "cfV" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/medical/surgeryobs) "cfW" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/surgeryobs) "cfX" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/surgeryobs) "cfY" = (/turf/simulated/wall,/area/medical/surgeryprep) -"cfZ" = (/obj/machinery/door_control{desc = "A remote control-switch for Surgery."; id = "Surgery"; name = "Surgery"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/surgeryprep) +"cfZ" = (/obj/machinery/button/remote/airlock{desc = "A remote control-switch for Surgery."; id = "Surgery"; name = "Surgery"; pixel_x = -24; pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/surgeryprep) "cga" = (/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/medical/surgeryprep) "cgb" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{dir = 10; icon_state = "whitered"},/area/medical/ward) "cgc" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{dir = 7; icon_state = "whitered"},/area/medical/ward) "cgd" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 7; icon_state = "whitered"},/area/medical/ward) -"cge" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/camera{c_tag = "Medbay Recovery Ward"; dir = 1; network = list("SS13")},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/ward) -"cgf" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/camera{c_tag = "Medbay Mental Health Room"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "bcarpet04"},/area/medical/psych) -"cgg" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cge" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) +"cgf" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cgg" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) "cgh" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/medical/patient_wing) -"cgi" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cgi" = (/obj/structure/bed/chair/comfy/brown,/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor{icon_state = "bcarpet06"},/area/medical/psych) "cgj" = (/obj/structure/table,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/medical/patient_wing) "cgk" = (/obj/item/weapon/storage/toolbox/emergency,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) "cgl" = (/obj/structure/table/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) -"cgm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"cgm" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "toxin_test_airlock"; name = "interior access button"; pixel_x = 20; pixel_y = 20; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/research_starboard) "cgn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"cgo" = (/obj/structure/bed/chair/comfy/brown,/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor{icon_state = "bcarpet06"},/area/medical/psych) -"cgp" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/camera/autoname{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) +"cgo" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "toxin_test_pump"; tag_exterior_door = "toxin_test_outer"; frequency = 1379; id_tag = "toxin_test_airlock"; tag_interior_door = "toxin_test_inner"; pixel_x = 0; pixel_y = 25; req_access = list(13); tag_chamber_sensor = "toxin_test_sensor"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/research_starboard) +"cgp" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cgq" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) -"cgr" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cgr" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cgs" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/engineering) -"cgt" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cgu" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Isolation to Waste"},/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora) +"cgt" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Isolation to Waste"},/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora) +"cgu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) "cgv" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/medical/virology) "cgw" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area/rnd/xenobiology) -"cgx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) +"cgx" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cgy" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) "cgz" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) "cgA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/rnd/xenobiology) -"cgB" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cgC" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/medical{name = "Examination room"; req_access = list(5)},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/exam_room) -"cgD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"cgE" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cgF" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engineering/atmos) +"cgB" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "toxin_test_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = -20; req_access = list(13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/space) +"cgC" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cgD" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"cgE" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engineering/atmos) +"cgF" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) "cgG" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cgH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"cgH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) "cgI" = (/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cgJ" = (/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora) -"cgK" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"cgK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_eva) "cgL" = (/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cgM" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cgN" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) -"cgO" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"cgO" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/rnd/test_area) "cgP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "cgQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"cgR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_eva) +"cgR" = (/obj/machinery/light,/obj/machinery/camera/network/research{c_tag = "Research - Toxins Test Chamber South"; dir = 1; network = list("Research","Toxins Test Area")},/turf/simulated/floor/airless,/area/rnd/test_area) "cgS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/construction) "cgT" = (/turf/simulated/floor/plating,/area/construction) "cgU" = (/turf/simulated/floor,/area/construction) "cgV" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/item/clothing/gloves/black,/obj/item/device/multitool{pixel_x = 5},/obj/random/tech_supply,/turf/simulated/floor,/area/construction) -"cgW" = (/turf/space,/area/skipjack_station/southeast_solars) -"cgX" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_eva) -"cgY" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/engine_eva) -"cgZ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/engine_eva) -"cha" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/engine_eva) -"chb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) -"chc" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering/engine_monitoring) -"chd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) -"che" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) -"chf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"chg" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) -"chh" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/foyer) -"chi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) -"chj" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 8; network = list("SS13")},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"chk" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/foyer) -"chl" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor{icon_state = "bcarpet08"},/area/medical/psych) -"chm" = (/obj/structure/bed/psych,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor{icon_state = "bcarpet09"},/area/medical/psych) -"chn" = (/obj/structure/table,/obj/item/weapon/gun/launcher/syringe,/obj/item/weapon/storage/box/syringegun,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) -"cho" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_outer"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"chp" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"chq" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_outer"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cgW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_eva) +"cgX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/engine_eva) +"cgY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_eva) +"cgZ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_eva) +"cha" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/red,/turf/simulated/floor,/area/engineering/foyer) +"chb" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) +"chc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) +"chd" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering EVA Storage"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/engine_eva) +"che" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) +"chf" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) +"chg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/foyer) +"chh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) +"chi" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized,/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) +"chj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/foyer) +"chk" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor{icon_state = "bcarpet08"},/area/medical/psych) +"chl" = (/obj/structure/bed/psych,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor{icon_state = "bcarpet09"},/area/medical/psych) +"chm" = (/obj/structure/table,/obj/item/weapon/gun/launcher/syringe,/obj/item/weapon/storage/box/syringegun,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) +"chn" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) +"cho" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"chp" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) +"chq" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/holosign/surgery,/obj/machinery/door/airlock/glass_medical{id_tag = "Surgery"; name = "Pre-Op Prep Room"; req_access = list(5)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "chr" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/item/weapon/storage/box/masks,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/surgeryprep) "chs" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/medical/surgeryprep) "cht" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/surgeryprep) -"chu" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -8; req_one_access = list(13,11,24)},/turf/space,/area/space) +"chu" = (/obj/machinery/door/firedoor,/obj/machinery/holosign/surgery,/obj/machinery/door/airlock/glass_medical{id_tag = "Surgery"; name = "Pre-Op Prep Room"; req_access = list(5)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) "chv" = (/obj/structure/table,/obj/item/weapon/tape_roll,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "chw" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virologyaccess) "chx" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/medical/virology) "chy" = (/obj/structure/bedsheetbin,/obj/structure/table,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) -"chz" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1379; icon_state = "door_closed"; id_tag = "engine_airlock_exterior"; locked = 0; name = "Engine Airlock Exterior"; req_access = list(10)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/engineering/engine_airlock) +"chz" = (/obj/structure/closet/secure_closet{name = "Psychiatrist's Locker"; req_access = list(64)},/obj/item/clothing/suit/straight_jacket{layer = 3},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/methylphenidate,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor{icon_state = "bcarpet04"},/area/medical/psych) "chA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/research_port) "chB" = (/turf/simulated/floor/plating,/area/maintenance/research_port) "chC" = (/obj/machinery/door/airlock/medical{autoclose = 0; icon_state = "door_open"; id_tag = "cubicle1"; name = "Cubicle 1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) @@ -5807,27 +5807,27 @@ "chI" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) "chJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) "chK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) -"chL" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) +"chL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Science Substation"; req_one_access = list(11,24,47)},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/substation/research) "chM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "chN" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) "chO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"chP" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) +"chP" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access = list(47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "chQ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "chR" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) -"chS" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) +"chS" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "chT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) "chU" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) "chV" = (/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/table/reinforced{icon_state = "table"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/engineering/engine_eva) "chW" = (/turf/simulated/wall/r_wall,/area/engineering/engine_eva) "chX" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/engine_eva) -"chY" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engineering/engine_eva) +"chY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/foyer) "chZ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cia" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cib" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Engineering Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "cic" = (/turf/simulated/floor,/area/engineering/engine_eva) "cid" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/engine_eva) "cie" = (/turf/simulated/floor,/area/engineering/foyer) -"cif" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/constructionsite/station) +"cif" = (/obj/machinery/vending/hydronutrients{categories = 3},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cig" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor,/area/engineering/foyer) "cih" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/foyer) "cii" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/construction) @@ -5846,11 +5846,11 @@ "civ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "ciw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cix" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"ciy" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/constructionsite/station) +"ciy" = (/obj/machinery/seed_storage/xenobotany,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "ciz" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/maintenance/engineering) "ciA" = (/turf/simulated/wall,/area/maintenance/substation/engineering) "ciB" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/medbay) -"ciC" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"ciC" = (/obj/machinery/botany/editor,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "ciD" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/engineering) "ciE" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/engineering) "ciF" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/engi_engine) @@ -5858,23 +5858,23 @@ "ciH" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "ciI" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "ciJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"ciK" = (/obj/machinery/door_control{id = "surgeryobs"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/surgery) -"ciL" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"ciK" = (/obj/machinery/button/remote/blast_door{id = "surgeryobs"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/surgery) +"ciL" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/generic,/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Aft Starboard Access"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/research_starboard) "ciM" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) "ciN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/surgeryprep) "ciO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) -"ciP" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/constructionsite/station) -"ciQ" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/surgery2) +"ciP" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/machinery/light{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/southleft{name = "Engineering Hardsuits"; req_access = list(11)},/obj/item/clothing/suit/space/void/engineering,/turf/simulated/floor,/area/engineering/engine_eva) +"ciQ" = (/obj/machinery/button/remote/blast_door{id = "surgeryobs2"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/surgery2) "ciR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "ciS" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "ciT" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "ciU" = (/turf/simulated/wall,/area/medical/surgery2) -"ciV" = (/obj/machinery/camera{c_tag = "Virology Access Fore"; dir = 4; network = list("SS13","Research")},/turf/simulated/floor,/area/medical/virologyaccess) +"ciV" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/machinery/door/window/southleft{name = "Engineering Hardsuits"; req_access = list(11)},/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/suit/space/void/engineering,/turf/simulated/floor,/area/engineering/engine_eva) "ciW" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "ciX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/medical/surgeryprep) "ciY" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) "ciZ" = (/obj/machinery/shower{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"cja" = (/obj/item/weapon/stool,/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cja" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/foyer) "cjb" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) "cjc" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) "cjd" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) @@ -5885,30 +5885,30 @@ "cji" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_eva) "cjj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/light,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) "cjk" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cjl" = (/obj/machinery/camera{c_tag = "Engineering EVA Storage"; dir = 1; network = list("SS13")},/obj/machinery/suit_cycler/engineering,/turf/simulated/floor,/area/engineering/engine_eva) +"cjl" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/foyer) "cjm" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cjn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/light,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) "cjo" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjp" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor,/area/engineering/engine_eva) -"cjq" = (/obj/structure/table/reinforced,/obj/machinery/door_control{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = 0; pixel_y = -3; req_access = list(10)},/obj/machinery/door_control{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/door_control{desc = "A remote control-switch for the engine emitter."; id = "EngineEmitter"; name = "Engine Emitter"; normaldoorcontrol = 2; pixel_x = 6; pixel_y = 7; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) +"cjp" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor,/area/engineering/engine_eva) +"cjq" = (/obj/machinery/light,/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) "cjr" = (/obj/structure/table,/obj/item/clothing/gloves/latex,/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cjs" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjt" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/constructionsite/station) +"cjt" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/camera/network/medbay{c_tag = "Medbay Recovery Ward"; dir = 1},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/ward) "cju" = (/obj/structure/table,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjv" = (/obj/machinery/power/terminal{dir = 8},/obj/machinery/light,/obj/machinery/door_control{id = "engine_electrical_maintenance"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 5; pixel_y = -25; req_access = list(10); specialfunctions = 4},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engineering/engine_smes) +"cjv" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/camera/network/medbay{c_tag = "Medbay Mental Health Room"; dir = 1},/turf/simulated/floor{icon_state = "bcarpet04"},/area/medical/psych) "cjw" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cjx" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cjy" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor,/area/engineering/foyer) "cjz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_eva) "cjA" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/item/weapon/folder/yellow,/turf/simulated/floor,/area/engineering/foyer) "cjB" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/construction) -"cjC" = (/turf/simulated/shuttle/wall,/area/shuttle/constructionsite/station) +"cjC" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/research_port) "cjD" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor,/area/engineering/foyer) "cjE" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor,/area/engineering/foyer) "cjF" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/foyer) "cjG" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) "cjH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/locker_room) -"cjI" = (/turf/simulated/shuttle/wall{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/area/shuttle/constructionsite/station) +"cjI" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/closet/crate/hydroponics/prespawned,/obj/machinery/camera/network/research{c_tag = "Xenoflora Storage"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) "cjJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/locker_room) "cjK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/locker_room) "cjL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/engineering/locker_room) @@ -5939,8 +5939,8 @@ "ckk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "ckl" = (/obj/machinery/computer/operating,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "ckm" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/item/weapon/surgicaldrill,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"ckn" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) -"cko" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"ckn" = (/obj/item/weapon/stool,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"cko" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "ckp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance,/obj/structure/disposalpipe/segment,/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/virologyaccess) "ckq" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/medical/virologyaccess) "ckr" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1443; icon_state = "map_vent_in"; id_tag = "air_out"; internal_pressure_bound = 2000; internal_pressure_bound_default = 2000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) @@ -5954,10 +5954,10 @@ "ckz" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1441; icon_state = "map_injector"; id = "o2_in"; use_power = 1},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) "ckA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) "ckB" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) -"ckC" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"ckC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering EVA Storage"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/engineering/engine_eva) "ckD" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) "ckE" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/rnd/xenobiology) -"ckF" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "engineering_shuttle"; pixel_x = 0; pixel_y = 25; req_one_access = list(13,11,24); tag_door = "engineering_shuttle_hatch"},/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"ckF" = (/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor,/area/engineering/engine_eva) "ckG" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/rnd/xenobiology/xenoflora) "ckH" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/rnd/xenobiology/xenoflora) "ckI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) @@ -5965,10 +5965,10 @@ "ckK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "ckL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "ckM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"ckN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"ckN" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/engineering{c_tag = "Engineering Foyer"; dir = 8},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) "ckO" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor{tag = "icon-whitegreen_v (NORTHEAST)"; icon_state = "whitegreen_v"; dir = 5},/area/rnd/xenobiology/xenoflora) "ckP" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/starboardsolar) -"ckQ" = (/obj/machinery/computer/shuttle_control/engineering,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"ckQ" = (/obj/structure/window/basic{dir = 8},/obj/machinery/shower{dir = 1},/obj/machinery/door/window/northright{name = "Shower"; req_access = list()},/obj/structure/curtain/open/shower/engineering,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "ckR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/starboardsolar) "ckS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/starboard) "ckT" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/engineering/foyer) @@ -5983,8 +5983,8 @@ "clc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) "cld" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer) "cle" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/engineering/locker_room) -"clf" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) -"clg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) +"clf" = (/obj/structure/window/basic{dir = 4},/obj/machinery/shower{dir = 1},/obj/machinery/door/window/northleft{name = "Shower"; req_access = list()},/obj/structure/curtain/open/shower/engineering,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"clg" = (/obj/machinery/button/remote/airlock{id = "engineering_cubicle"; name = "Door Bolt Control"; pixel_x = -25; pixel_y = 8; specialfunctions = 4},/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) "clh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/locker_room) "cli" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/locker_room) "clj" = (/turf/simulated/floor,/area/engineering/locker_room) @@ -5993,12 +5993,12 @@ "clm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/virologyaccess) "cln" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/medical/virologyaccess) "clo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/green,/turf/simulated/floor/plating,/area/rnd/xenobiology) -"clp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"clp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Virology Access"; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/medical/virologyaccess) "clq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/rnd/xenobiology) "clr" = (/obj/structure/table,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/storage/art) "cls" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/green,/turf/simulated/floor/plating,/area/rnd/xenobiology) "clt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/research_port) -"clu" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1379; icon_state = "door_closed"; id_tag = "engine_airlock_interior"; locked = 0; name = "Engine Airlock Interior"; req_access = list(10)},/turf/simulated/floor/plating,/area/engineering/engine_room) +"clu" = (/obj/machinery/door/airlock/research{name = "Xenoflora Storage"; req_access = list(55)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "clv" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "clw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/substation/engineering) "clx" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engineering) @@ -6006,11 +6006,11 @@ "clz" = (/obj/machinery/optable,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "clA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "clB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/surgery) -"clC" = (/obj/machinery/door/airlock/maintenance{name = "Drone Fabrication/Engine Waste Handling"; req_one_access = list(10,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"clC" = (/obj/machinery/door/airlock/research{name = "Xenoflora Research"; req_access = list(55)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "clD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) "clE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/medical/surgeryprep) "clF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) -"clG" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_electrical_maintenance"; locked = 1; name = "Electrical Maintenance"; req_access = list(10)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"clG" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "clH" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/surgery2) "clI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "clJ" = (/obj/machinery/optable,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) @@ -6025,7 +6025,7 @@ "clS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/research_port) "clT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/research_port) "clU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/rnd/xenobiology) -"clV" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"; dir = 2},/area/shuttle/constructionsite/station) +"clV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "clW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/rnd/xenobiology) "clX" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/engineering/atmos) "clY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) @@ -6036,33 +6036,33 @@ "cmd" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) "cme" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/rnd/xenobiology) "cmf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cmg" = (/obj/structure/closet/emcloset,/obj/machinery/camera/xray{c_tag = "Xenobiology Access"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/xenobiology) +"cmg" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Air"},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) "cmh" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cmi" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cmj" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/engineering/atmos) -"cmk" = (/obj/machinery/biogenerator,/obj/machinery/camera/autoname{dir = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"cmk" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Oxygen"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) "cml" = (/obj/machinery/seed_extractor,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cmm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/atmos) "cmn" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) "cmo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cmp" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/machinery/alarm/nobreach{dir = 2; pixel_y = 22},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) +"cmp" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Nitrogen"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) "cmq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cms" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/wall/r_wall,/area/engineering/atmos) +"cms" = (/obj/machinery/door/airlock/maintenance{name = "Engineering EVA Storage Maintainance"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor,/area/engineering/engine_eva) "cmt" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/wall/r_wall,/area/engineering/atmos) "cmu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "cmv" = (/obj/structure/sign/securearea{pixel_x = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"cmw" = (/obj/machinery/door_control{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineEmitterPortWest"; name = "Engine Room Blast Doors"; pixel_x = 0; pixel_y = 25; req_access = list(10)},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_room) +"cmw" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering EVA Storage"; req_one_access = list(11,24)},/turf/simulated/floor,/area/engineering/engine_eva) "cmx" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{icon_state = "bot"},/area/engineering/foyer) "cmy" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/light,/turf/simulated/floor,/area/engineering/foyer) "cmz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/construction) "cmA" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/construction) -"cmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/engineering/foyer) +"cmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/engineering/foyer) "cmC" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/engineering/foyer) "cmD" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor,/area/engineering/foyer) "cmE" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/computer/guestpass{pixel_y = -28},/turf/simulated/floor,/area/engineering/foyer) "cmF" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/engineering/foyer) -"cmG" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access = list(10)},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cmG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1"; req_access = list(45)},/turf/simulated/floor,/area/medical/surgeryprep) "cmH" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/foyer) "cmI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) "cmJ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) @@ -6071,25 +6071,25 @@ "cmM" = (/obj/structure/closet/secure_closet/atmos_personal,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/engineering/locker_room) "cmN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/locker_room) "cmO" = (/obj/structure/table,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/engineering/locker_room) -"cmP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table,/obj/machinery/camera{c_tag = "Engineering Locker Room"; dir = 1; network = list("SS13")},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/engineering/locker_room) -"cmQ" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) -"cmR" = (/obj/machinery/camera{c_tag = "Medbay Operating Theatre 1"; dir = 8; network = list("SS13")},/obj/machinery/button/holosign{pixel_x = 24; pixel_y = 2},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/medical/surgery) +"cmP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2"; req_access = list(45)},/turf/simulated/floor,/area/medical/surgeryprep) +"cmQ" = (/obj/machinery/camera/network/medbay{c_tag = "Virology Access Fore"},/turf/simulated/floor,/area/medical/virologyaccess) +"cmR" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cmS" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) "cmT" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard) "cmU" = (/obj/machinery/door/blast/regular{dir = 4; id = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "cmV" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/port) "cmW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) -"cmX" = (/obj/machinery/button/holosign{pixel_x = -24; pixel_y = 2},/obj/machinery/camera{c_tag = "Medbay Operating Theatre 2"; dir = 4; network = list("SS13")},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/surgery2) +"cmX" = (/obj/item/weapon/stool,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Aft Starboard"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmY" = (/obj/machinery/door/blast/regular{desc = "By gods, release the hounds!"; id = "xenobioout6"; name = "Containment Release"},/turf/simulated/floor/engine,/area/rnd/xenobiology) "cmZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard) "cna" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/starboard) "cnb" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cnc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cnd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cne" = (/obj/structure/cable,/obj/machinery/power/smes/buildable/power_shuttle,/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) -"cnf" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) -"cng" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/constructionsite/station) -"cnh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/constructionsite/station) +"cne" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/engineering{name = "Construction Area"; req_access = list(32)},/turf/simulated/floor/plating,/area/construction) +"cnf" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/camera/network/engineering{c_tag = "Engineering EVA"; dir = 1},/turf/simulated/floor,/area/engineering/engine_eva) +"cng" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/atmos,/obj/machinery/door/window/northright{name = "Atmospherics Hardsuits"; req_access = list(24)},/turf/simulated/floor,/area/engineering/engine_eva) +"cnh" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/atmos,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northleft{name = "Atmospherics Hardsuits"; req_access = list(24)},/turf/simulated/floor,/area/engineering/engine_eva) "cni" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "cnj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) "cnk" = (/obj/structure/table,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) @@ -6102,9 +6102,9 @@ "cnr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) "cns" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) "cnt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) -"cnu" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_one_access = list(10,24)},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) +"cnu" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Locker Room"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/locker_room) "cnv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cnw" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_one_access = list(10,24)},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) +"cnw" = (/obj/machinery/door/airlock/engineering{name = "Engineering Substation"; req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "cnx" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/lattice,/turf/space,/area/space) "cny" = (/turf/simulated/wall/r_wall,/area/engineering/atmos) "cnz" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/monitoring) @@ -6112,19 +6112,19 @@ "cnB" = (/obj/item/device/flashlight,/turf/simulated/floor,/area/construction) "cnC" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/construction) "cnD" = (/turf/simulated/wall/r_wall,/area/construction) -"cnE" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_one_access = list(10,24)},/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) -"cnF" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor,/area/engineering/workshop) +"cnE" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cnF" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay) "cnG" = (/turf/simulated/wall/r_wall,/area/engineering/engineering_monitoring) "cnH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) -"cnI" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/turf/simulated/floor,/area/engineering/atmos/storage) +"cnI" = (/obj/machinery/door/window/northright{name = "Xenoflora Containment"; req_access = list(47)},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) "cnJ" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engineering/engineering_monitoring) -"cnK" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/engineering/atmos) -"cnL" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cnK" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(55)},/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access = list(55)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cnL" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10,13)},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar) "cnM" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engineering/workshop) -"cnN" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cnN" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space) "cnO" = (/turf/simulated/wall/r_wall,/area/engineering/workshop) -"cnP" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cnQ" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cnP" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Locker Room"; req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/locker_room) +"cnQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1"; req_access = list(45)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/medical/surgeryprep) "cnR" = (/turf/simulated/wall/r_wall,/area/engineering/locker_room) "cnS" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engineering) "cnT" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/machinery/light,/obj/item/weapon/cautery,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) @@ -6145,33 +6145,33 @@ "coi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/rnd/xenobiology) "coj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/xenobiology) "cok" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"col" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"col" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2"; req_access = list(45)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/medical/surgeryprep) "com" = (/turf/simulated/wall,/area/rnd/xenobiology) -"con" = (/obj/machinery/camera{c_tag = "Xenobiology Module South"; dir = 4; network = list("SS13","Research"); pixel_x = 0},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) +"con" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay) "coo" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/rnd/xenobiology) "cop" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"coq" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virologyq_airlock_interior"; locked = 1; name = "Virology Quarantine Airlock"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cor" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "virology_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/medbay) +"coq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cor" = (/obj/structure/closet/emcloset,/obj/machinery/camera/xray/research{c_tag = "Xenobiology Access"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/xenobiology) "cos" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cot" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(12,24)},/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cot" = (/obj/machinery/biogenerator,/obj/machinery/camera/network/research{c_tag = "Xenoflora"; dir = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) "cou" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/engineering/atmos) "cov" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) "cow" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) "cox" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/engineering/atmos) -"coy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/engineering/atmos) +"coy" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor,/area/engineering/atmos) "coz" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/port) -"coA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/turf/simulated/floor/plating,/area/engineering/atmos) -"coB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/engineering/atmos) -"coC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/turf/simulated/floor/plating,/area/engineering/atmos) +"coA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) +"coB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/engineering/atmos) +"coC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/atmos) "coD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/engineering/atmos) "coE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) -"coF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/engineering/atmos) +"coF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/turf/simulated/floor/plating,/area/engineering/atmos) "coG" = (/obj/machinery/meter{frequency = 1443; id = "dloop_atm_meter"; name = "Distribution Loop"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/visible/supply{dir = 8},/turf/simulated/floor,/area/engineering/atmos) "coH" = (/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor,/area/engineering/atmos) "coI" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter,/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor,/area/engineering/atmos) -"coJ" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/turf/simulated/floor,/area/engineering/atmos) +"coJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor/plating,/area/engineering/atmos) "coK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) -"coL" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor,/area/engineering/atmos) +"coL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/turf/simulated/floor/plating,/area/engineering/atmos) "coM" = (/obj/machinery/firealarm{pixel_x = 32; pixel_y = 24},/turf/simulated/floor,/area/engineering/atmos/monitoring) "coN" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Engine Waste")},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos/monitoring) "coO" = (/obj/machinery/computer/atmoscontrol,/turf/simulated/floor,/area/engineering/atmos/monitoring) @@ -6189,10 +6189,10 @@ "cpa" = (/turf/simulated/floor,/area/engineering/workshop) "cpb" = (/obj/machinery/shield_gen/external,/turf/simulated/floor/plating,/area/engineering/storage) "cpc" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/surgery) -"cpd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cpd" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cpe" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/closet/wardrobe/medic_white,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) -"cpf" = (/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera{c_tag = "Medbay Surgery Prep"; dir = 8; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) -"cpg" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "virology_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "virology_pump"; tag_exterior_door = "virology_outer"; frequency = 1379; id_tag = "virology_airlock"; tag_interior_door = "virology_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "virology_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/medbay) +"cpf" = (/obj/machinery/door/window/eastright{name = "Engineering Delivery"; req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor{icon_state = "delivery"},/area/engineering/foyer) +"cpg" = (/obj/machinery/door/window/eastright{name = "Engineering Reception Desk"; req_one_access = list(10,24)},/obj/machinery/light,/turf/simulated/floor,/area/engineering/foyer) "cph" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/surgery2) "cpi" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/medbay) "cpj" = (/turf/simulated/wall/r_wall,/area/engineering/storage) @@ -6200,50 +6200,50 @@ "cpl" = (/turf/simulated/floor/engine,/area/rnd/xenobiology) "cpm" = (/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/rnd/xenobiology) "cpn" = (/obj/machinery/power/rad_collector,/turf/simulated/floor/plating,/area/engineering/storage) -"cpo" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "virologyq_airlock_control"; name = "Virology Quarantine Access Button"; pixel_x = -8; pixel_y = 28; req_access = list(39)},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cpo" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/camera/network/engineering{c_tag = "Engineering Locker Room"; dir = 1},/turf/simulated/floor,/area/engineering/locker_room) "cpp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cpq" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cpr" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) +"cpr" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "cps" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "virologyquar"; name = "Virology Emergency Quarantine Blast Doors"; opacity = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "delivery"},/area/medical/virologyaccess) "cpt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos) "cpu" = (/obj/machinery/atmospherics/valve/digital/open{name = "Mixed Air Outlet Valve"},/turf/simulated/floor{dir = 9; icon_state = "arrival"},/area/engineering/atmos) "cpv" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) "cpw" = (/obj/machinery/atmospherics/valve/digital/open{name = "Mixed Air Inlet Valve"},/turf/simulated/floor{icon_state = "arrival"; dir = 5},/area/engineering/atmos) "cpx" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "air_in"; name = "Mixed Air Supply Control"; output_tag = "air_out"; pressure_setting = 2000; sensors = list("air_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/engineering/atmos) -"cpy" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engineering/atmos) +"cpy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor/plating,/area/engineering/atmos) "cpz" = (/obj/machinery/atmospherics/valve/digital/open{name = "Oxygen Outlet Valve"},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/engineering/atmos) -"cpA" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/machinery/camera{c_tag = "Atmospherics North West"; dir = 2},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/atmos) -"cpB" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/engineering/atmos) -"cpC" = (/obj/machinery/atmospherics/binary/pump,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cpA" = (/obj/machinery/button/holosign{pixel_x = 24; pixel_y = 2},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera/network/medbay{c_tag = "Medbay Operating Theatre 1"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/medical/surgery) +"cpB" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cpC" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) "cpD" = (/obj/machinery/atmospherics/valve/digital/open{name = "Nitrogen Outlet Valve"},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/engineering/atmos) -"cpE" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/engineering/atmos) -"cpF" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/engineering/atmos) -"cpG" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space) -"cpH" = (/turf/simulated/floor,/area/engineering/atmos) -"cpI" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/space,/area/space) -"cpJ" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor,/area/engineering/atmos) +"cpE" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/engineering/atmos) +"cpF" = (/turf/simulated/floor,/area/engineering/atmos) +"cpG" = (/obj/machinery/atmospherics/binary/pump{name = "Air Mix to Connector"},/turf/simulated/floor,/area/engineering/atmos) +"cpH" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engineering/atmos) +"cpI" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/engineering/atmos) +"cpJ" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/turf/simulated/floor,/area/engineering/atmos) "cpK" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry/aft) -"cpL" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/turf/simulated/floor,/area/engineering/atmos) -"cpM" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cpN" = (/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/engineering/atmos) -"cpO" = (/obj/structure/dispenser,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cpP" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/space,/area/space) -"cpQ" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/machinery/camera{c_tag = "Atmospherics North East"; dir = 6},/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = 32},/obj/machinery/cell_charger,/turf/simulated/floor,/area/engineering/atmos) -"cpR" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/space,/area/space) +"cpL" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cpM" = (/obj/structure/table,/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/engineering/atmos) +"cpN" = (/obj/machinery/atmospherics/binary/pump{name = "O2 to Connector"},/turf/simulated/floor,/area/engineering/atmos) +"cpO" = (/obj/machinery/button/holosign{pixel_x = -24; pixel_y = 2},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/camera/network/medbay{c_tag = "Medbay Operating Theatre 2"; dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/surgery2) +"cpP" = (/obj/machinery/atmospherics/binary/pump{name = "N2 to Connector"},/turf/simulated/floor,/area/engineering/atmos) +"cpQ" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cpR" = (/obj/structure/dispenser,/turf/simulated/floor,/area/engineering/atmos) "cpS" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/hallway/secondary/entry/port) -"cpT" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cpU" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cpV" = (/obj/structure/table,/obj/machinery/newscaster{pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/turf/simulated/floor,/area/engineering/atmos) -"cpW" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) -"cpX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) -"cpY" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cpZ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) -"cqa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) -"cqb" = (/obj/machinery/atmospherics/binary/pump/on,/turf/simulated/floor,/area/engineering/atmos) -"cqc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cqd" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cqe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) -"cqf" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/autoname{dir = 8},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"cpT" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cpU" = (/obj/structure/table,/obj/machinery/newscaster{pixel_y = 30},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/turf/simulated/floor,/area/engineering/atmos) +"cpV" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) +"cpW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) +"cpX" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Ports"},/turf/simulated/floor,/area/engineering/atmos) +"cpY" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) +"cpZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) +"cqa" = (/obj/machinery/atmospherics/binary/pump/on{name = "Ports to Waste"},/turf/simulated/floor,/area/engineering/atmos) +"cqb" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"cqc" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/engineering/atmos/monitoring) +"cqd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) +"cqe" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Virology Access"; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/virologyaccess) +"cqf" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/engineering/engineering_monitoring) "cqg" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/engineering) "cqh" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) "cqi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) @@ -6255,67 +6255,67 @@ "cqo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "cqp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "cqq" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) -"cqr" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/turf/simulated/floor,/area/engineering) -"cqs" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "incinerator_airlock_exterior"; id_tag = "incinerator_access_control"; tag_interior_door = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = -6; pixel_y = -26; req_access = list(12)},/obj/machinery/button/ignition{id = "Incinerator"; pixel_x = 6; pixel_y = -24},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator) -"cqt" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/engineering/engineering_monitoring) +"cqr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) +"cqs" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cqt" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor,/area/maintenance/atmos_control) "cqu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "greencorner"},/area/medical/virologyaccess) "cqv" = (/turf/simulated/wall/r_wall,/area/medical/virology) "cqw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) "cqx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) "cqy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) -"cqz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/camera/autoname{dir = 4},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"cqA" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/machinery/door_control{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_one_access = list(12,5)},/turf/simulated/floor{dir = 1; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator) +"cqz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) +"cqA" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor,/area/maintenance/atmos_control) "cqB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cqD" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/camera{c_tag = "Xenobiology Module North"; dir = 2; network = list("SS13","Research"); pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cqD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor,/area/engineering/atmos) "cqE" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "xeno_airlock_exterior"; id_tag = "xeno_airlock_control"; tag_interior_door = "xeno_airlock_interior"; name = "Xenobiology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/rnd/xenobiology) "cqF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology) "cqG" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/rnd/xenobiology) "cqH" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cqI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) -"cqJ" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) -"cqK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering) -"cqL" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/lattice,/turf/space,/area/space) -"cqM" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/engineering) -"cqN" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/space,/area/space) -"cqO" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio5"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) -"cqP" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) -"cqQ" = (/obj/machinery/shield_capacitor,/turf/simulated/floor/plating,/area/engineering/storage) -"cqR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "green"},/area/medical/virologyaccess) -"cqS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos) +"cqI" = (/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/atmos/monitoring) +"cqJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering) +"cqK" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/engineering) +"cqL" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/turf/simulated/floor,/area/engineering/atmos) +"cqM" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) +"cqN" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cqO" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Monitoring Room"; req_access = list(11)},/turf/simulated/floor,/area/engineering/engineering_monitoring) +"cqP" = (/obj/machinery/shield_capacitor,/turf/simulated/floor/plating,/area/engineering/storage) +"cqQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "green"},/area/medical/virologyaccess) +"cqR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos) +"cqS" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) "cqT" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/security/prison) -"cqU" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cqV" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cqW" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor,/area/engineering/atmos) -"cqX" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor,/area/engineering/atmos) -"cqY" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) -"cqZ" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cra" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor,/area/engineering/atmos) -"crb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/engineering/atmos) +"cqU" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"cqV" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Air Tank Bypass Pump"},/turf/simulated/floor,/area/engineering/atmos) +"cqW" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) +"cqX" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) +"cqY" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cqZ" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor,/area/engineering/atmos) +"cra" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor,/area/engineering/atmos) +"crb" = (/obj/machinery/atmospherics/binary/pump/on{name = "Scrubber to Waste"},/turf/simulated/floor,/area/engineering/atmos) "crc" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/engineering/atmos) -"crd" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cre" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"crf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) -"crg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"crh" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"cri" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"crj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) -"crk" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/engineering/engineering_monitoring) -"crl" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/engineering) -"crm" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/engineering/workshop) -"crn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/workshop) -"cro" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) -"crp" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/engineering/storage) +"crd" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Supply"},/turf/simulated/floor,/area/engineering/atmos) +"cre" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"crf" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"crg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) +"crh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"cri" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/engineering/engineering_monitoring) +"crj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/engineering/engineering_monitoring) +"crk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) +"crl" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/engineering/engineering_monitoring) +"crm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/engineering) +"crn" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/engineering/workshop) +"cro" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/workshop) +"crp" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) "crq" = (/obj/structure/closet,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/engineering) "crr" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) "crs" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) "crt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) "cru" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"crv" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio4"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) +"crv" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering) "crw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/medical/surgeryprep) "crx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/surgeryprep) "cry" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/surgeryprep) -"crz" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/machinery/door_control{desc = "A remote control-switch for a door to space."; id = "xenobioout6"; name = "Containment Release Switch"; pixel_x = 24; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/xenobiology) +"crz" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/turf/simulated/floor,/area/engineering) "crA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "crB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "crC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) @@ -6324,266 +6324,266 @@ "crF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/medbay) "crG" = (/turf/simulated/wall,/area/maintenance/medbay) "crH" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/virology) -"crI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/engineering/storage) -"crJ" = (/turf/simulated/floor/plating,/area/engineering/storage) -"crK" = (/obj/structure/closet/crate/solar,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/engineering/storage) -"crL" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering) +"crI" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/engineering/storage) +"crJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/engineering/storage) +"crK" = (/turf/simulated/floor/plating,/area/engineering/storage) +"crL" = (/obj/structure/closet/crate/solar,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/engineering/storage) "crM" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) "crN" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "crO" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "crP" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"crQ" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/virology) -"crR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/bed,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/virology) -"crS" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/virology) -"crT" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"crU" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"crV" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"crW" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"crX" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/engineering/atmos) +"crQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/turf/simulated/floor,/area/engineering) +"crR" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/virology) +"crS" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/bed,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/virology) +"crT" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/virology) +"crU" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos) +"crV" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"crW" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"crX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) "crY" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/engineering) -"crZ" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"csa" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"csb" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"csc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/turf/simulated/floor/plating,/area/engineering) -"csd" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1379; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cse" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "virology_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/maintenance/medbay) -"csf" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virologyq_airlock_exterior"; locked = 1; name = "Virology Quarantine Airlock"; req_access = list(39)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virologyq_airlock_control"; name = "Virology Quarantine Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"csg" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"csh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"csi" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"csj" = (/obj/structure/table/reinforced,/obj/machinery/light,/obj/item/device/flashlight,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"csk" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engineering_monitoring) +"crZ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"csa" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) +"csb" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"csc" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos) +"csd" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Workshop"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) +"cse" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Workshop"; req_one_access = list(11,24)},/turf/simulated/floor,/area/engineering/workshop) +"csf" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"csg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = 8; pixel_y = -28; req_access = list(55)},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/rnd/xenobiology) +"csh" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"csi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/space) +"csj" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"csk" = (/obj/structure/table/reinforced,/obj/machinery/light,/obj/item/device/flashlight,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/engineering_monitoring) "csl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/rnd/xenobiology) -"csm" = (/obj/machinery/computer/power_monitor,/turf/simulated/floor,/area/engineering/engineering_monitoring) -"csn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering) -"cso" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor,/area/engineering) -"csp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/workshop) -"csq" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering) -"csr" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor,/area/engineering/workshop) -"css" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) -"cst" = (/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/workshop) -"csu" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor,/area/engineering/workshop) -"csv" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) -"csw" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/engineering/storage) -"csx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/storage) -"csy" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/phoron{amount = 25},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor/plating,/area/engineering/storage) +"csm" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engineering_monitoring) +"csn" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cso" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering) +"csp" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor,/area/engineering) +"csq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/workshop) +"csr" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering) +"css" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor,/area/engineering/workshop) +"cst" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) +"csu" = (/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/workshop) +"csv" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor,/area/engineering/workshop) +"csw" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) +"csx" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/engineering/storage) +"csy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/storage) "csz" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) "csA" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) "csB" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) "csC" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"csD" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"csD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/engineering) "csE" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "csF" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "csG" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "csH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) "csI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/medbay) "csJ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/medical/virology) -"csK" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"csL" = (/obj/structure/closet/wardrobe/virology_white,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera/xray{c_tag = "Virology Access Aft"; dir = 2; network = list("SS13","Medical")},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/medical/virology) -"csM" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"csN" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/atmos) -"csO" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/engineering/atmos) +"csK" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/phoron{amount = 25},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor/plating,/area/engineering/storage) +"csL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"csM" = (/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/medbay{c_tag = "Medbay Surgery Prep"; dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) +"csN" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"csO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/atmos) "csP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"csQ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/engineering/atmos) +"csQ" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) "csR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) "csS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"csT" = (/obj/machinery/atmospherics/omni/mixer{active_power_usage = 7500; use_power = 1; tag_east = 1; tag_east_con = 0.79; tag_north = 1; tag_north_con = 0.21; tag_west = 2},/turf/simulated/floor,/area/engineering/atmos) -"csU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"csV" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"csW" = (/obj/machinery/atmospherics/pipe/manifold/visible/green,/turf/simulated/floor,/area/engineering/atmos) -"csX" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"csY" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"csZ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cta" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"ctb" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/engi_shuttle) -"ctc" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) -"ctd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) -"cte" = (/obj/structure/disposalpipe/segment,/obj/machinery/pipedispenser/disposal,/obj/structure/window/reinforced,/turf/simulated/floor,/area/engineering/atmos) -"ctf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = -25; req_one_access = list(13,11,24)},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle) -"ctg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) -"cth" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cti" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering) -"ctj" = (/obj/machinery/camera{c_tag = "Engineering Hallway North"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering) -"ctk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/workshop) -"ctl" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) -"ctm" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/rods{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/cell/high,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) -"ctn" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) -"cto" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/mineral/plastic{amount = 10},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) +"csT" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/engineering/atmos) +"csU" = (/obj/machinery/atmospherics/omni/mixer{active_power_usage = 7500; use_power = 1; tag_east = 1; tag_east_con = 0.79; tag_north = 1; tag_north_con = 0.21; tag_west = 2},/turf/simulated/floor,/area/engineering/atmos) +"csV" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"csW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/blue{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"csX" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) +"csY" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) +"csZ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Port to Supply"},/turf/simulated/floor,/area/engineering/atmos) +"cta" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Supply to Waste"},/turf/simulated/floor,/area/engineering/atmos) +"ctb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) +"ctc" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) +"ctd" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cte" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"ctf" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) +"ctg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) +"cth" = (/obj/structure/disposalpipe/segment,/obj/machinery/pipedispenser/disposal,/obj/structure/window/reinforced,/turf/simulated/floor,/area/engineering/atmos) +"cti" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"ctj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) +"ctk" = (/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Xenobiology Internal Airlock"; req_access = list(55)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"ctl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering) +"ctm" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard) +"ctn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/workshop) +"cto" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) "ctp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs) "ctq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs) "ctr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs) "cts" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"ctt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/camera{c_tag = "Engineering Workshop"; dir = 8; network = list("SS13"); pixel_y = -23},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) -"ctu" = (/obj/machinery/light_switch{pixel_x = -27; pixel_y = 0},/obj/machinery/camera{c_tag = "Engineering Hard Storage"; dir = 4; network = list("SS13")},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/storage) +"ctt" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/rods{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/cell/high,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) +"ctu" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) "ctv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/engineering) "ctw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/engineering) -"ctx" = (/obj/machinery/door/airlock/maintenance{name = "Drone Fabrication"; req_one_access = list(10,24)},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cty" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock"; name = "exterior access button"; pixel_x = 20; pixel_y = 20; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/maintenance/medbay) +"ctx" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Northwest"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/atmos) +"cty" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/mineral/plastic{amount = 10},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop) "ctz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay) "ctA" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/cigbutt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay) -"ctB" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_smes) +"ctB" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = 32},/obj/machinery/cell_charger,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Northeast"},/turf/simulated/floor,/area/engineering/atmos) "ctC" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/medical/virology) "ctD" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ctE" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/medical/virology) "ctF" = (/turf/simulated/wall,/area/medical/virology) "ctG" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ctH" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 26},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"ctI" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_airlock) +"ctI" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Monitoring Room"; dir = 8},/turf/simulated/floor,/area/engineering/atmos/monitoring) "ctJ" = (/obj/machinery/disease2/incubator,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ctK" = (/obj/machinery/light{dir = 1},/obj/machinery/computer/centrifuge,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ctL" = (/obj/machinery/disease2/isolator,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ctM" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ctN" = (/obj/item/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"ctO" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"ctO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Engineering Monitoring Room"; dir = 4},/turf/simulated/floor,/area/engineering/engineering_monitoring) "ctP" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "ctQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "surgeryobs2"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryprep) "ctR" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"ctS" = (/obj/machinery/camera{c_tag = "Virology Monkey Pen"; dir = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/bed/chair,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"ctT" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"ctS" = (/obj/machinery/computer/security/engineering{network = list("Engineering","Engineering Outpost","Power Alarms","Atmosphere Alarms","Fire Alarms")},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/engineering/engineering_monitoring) +"ctT" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/medbay) "ctU" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"ctV" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"ctV" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = 0; pixel_y = -28; req_access = list(5)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/medical/virologyaccess) "ctW" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "ctX" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/starboard) "ctY" = (/turf/space,/area/syndicate_station/southwest) -"ctZ" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Xenobiologist"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cua" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/engineering/atmos) +"ctZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cua" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/xenobiology) "cub" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery) -"cuc" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cud" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) -"cue" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cuf" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/atmos) -"cug" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/atmos) -"cuh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering) -"cui" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engine Monitoring Room"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) -"cuj" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cuk" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/engineering) -"cul" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cum" = (/obj/machinery/newscaster{pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cun" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering) -"cuo" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_inner"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cup" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; sortType = "Engineering"; name = "Engineering"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cuq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/workshop) -"cur" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop) -"cus" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/engineering/workshop) -"cut" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop) -"cuu" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage) -"cuv" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_inner"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cuw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/engineering/storage) -"cux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage) -"cuy" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engineering/storage) -"cuz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cuA" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cuB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cuc" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cud" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Xenobiologist"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cue" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/engineering/atmos) +"cuf" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/engineering/atmos) +"cug" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) +"cuh" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"cui" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/atmos) +"cuj" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/atmos) +"cuk" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering) +"cul" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/camera/network/research{c_tag = "Xenobiology North"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cum" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cun" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/engineering) +"cuo" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cup" = (/obj/machinery/newscaster{pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cuq" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering) +"cur" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cus" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; sortType = "Engineering"; name = "Engineering"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cut" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/workshop) +"cuu" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop) +"cuv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/engineering/workshop) +"cuw" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop) +"cux" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage) +"cuy" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre 1 Storage"; req_access = list(45)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgeryprep) +"cuz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/engineering/storage) +"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage) +"cuB" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engineering/storage) "cuC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/engineering) "cuD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) -"cuE" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1379; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cuE" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre 2 Storage"; req_access = list(45)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgeryprep) "cuF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay) "cuG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/fire{pixel_y = -32},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/medbay) "cuH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/medbay) "cuI" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/medbay) "cuJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay) "cuK" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay) -"cuL" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "engineering_dock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "engineering_dock_airlock"; pixel_x = -25; pixel_y = 0; req_one_access = list(13,11,24); tag_airpump = "engineering_dock_pump"; tag_chamber_sensor = "engineering_dock_sensor"; tag_exterior_door = "engineering_dock_outer"; tag_interior_door = "engineering_dock_inner"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/engi_shuttle) +"cuL" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access = list(39)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cuM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cuN" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/medical/virology) "cuO" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/white,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cuP" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cuP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cuQ" = (/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cuR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cuR" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cuS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) "cuT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/virology) -"cuU" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/light_switch{pixel_x = -27; pixel_y = 0},/obj/machinery/airlock_sensor/airlock_exterior{id_tag = "eng_al_ext_snsr"; layer = 3.3; master_tag = "engine_room_airlock"; pixel_y = -22; req_access = list(10)},/obj/structure/table,/obj/item/weapon/book/manual/supermatter_engine,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/engineering/engine_airlock) +"cuU" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) "cuV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) "cuW" = (/obj/structure/extinguisher_cabinet,/turf/simulated/wall/r_wall,/area/medical/virology) "cuX" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cuY" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "engineering_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "engineering_dock_sensor"; pixel_x = -25; pixel_y = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/engi_shuttle) +"cuY" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) "cuZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cva" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cva" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cvb" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/gloves/latex,/obj/item/device/slime_scanner,/obj/item/device/slime_scanner,/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cvc" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cvd" = (/obj/structure/bed/chair{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cvd" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cve" = (/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/rnd/xenobiology) "cvf" = (/obj/machinery/optable{name = "Xenobiology Operating Table"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/rnd/xenobiology) "cvg" = (/obj/machinery/computer/operating{name = "Xenobiology Operating Computer"},/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/rnd/xenobiology) -"cvh" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cvi" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cvj" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cvk" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cvl" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access = list(39)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cvh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cvi" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cvj" = (/obj/structure/bed/chair{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cvk" = (/obj/machinery/atmospherics/pipe/cap/visible,/turf/simulated/floor,/area/engineering/atmos) +"cvl" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) "cvm" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "virologyquar"; name = "Virology Emergency Quarantine Blast Doors"; opacity = 0},/turf/simulated/floor{icon_state = "delivery"},/area/medical/virologyaccess) -"cvn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cvo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engineering/atmos) -"cvp" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor,/area/engineering/atmos) -"cvq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engineering) -"cvr" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre 1 Storage"; req_access = list(45)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgeryprep) -"cvs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/engineering) -"cvt" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre 2 Storage"; req_access = list(45)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgeryprep) -"cvu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engineering) -"cvv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/engineering) -"cvw" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) -"cvx" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/engineering) -"cvy" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/workshop) -"cvz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/workshop) -"cvA" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/workshop) -"cvB" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) -"cvC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/storage) -"cvD" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/medbay) -"cvE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/medical/virology) -"cvG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhitecorner"},/area/medical/virology) -"cvH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warnwhitecorner"},/area/medical/virology) -"cvJ" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Xenobiologist"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cvK" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) -"cvL" = (/obj/machinery/atmospherics/pipe/cap/visible{color = "#ffcc00"},/turf/simulated/floor,/area/engineering/atmos) +"cvn" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cvo" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cvp" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cvq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cvr" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engineering/atmos) +"cvs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cvt" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/pipedispenser,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) +"cvu" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engineering) +"cvv" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor,/area/engineering/atmos/monitoring) +"cvw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/engineering) +"cvx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engineering) +"cvy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/engineering) +"cvz" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) +"cvA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/engineering) +"cvB" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/workshop) +"cvC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/workshop) +"cvD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/workshop) +"cvE" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor,/area/engineering/engineering_monitoring) +"cvF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/storage) +"cvG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Pre-Op Prep Room Maintenance Access"; req_access = list(45)},/turf/simulated/floor/plating,/area/medical/surgeryprep) +"cvH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cvI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/medical/virology) +"cvJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhitecorner"},/area/medical/virology) +"cvK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cvL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warnwhitecorner"},/area/medical/virology) "cvM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) "cvN" = (/turf/simulated/wall,/area/maintenance/incinerator) -"cvO" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light,/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = 0; pixel_y = -28; req_access = list(5)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/medical/virologyaccess) +"cvO" = (/obj/structure/closet/wardrobe/virology_white,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/xray/medbay{c_tag = "Virology Access Aft"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/medical/virology) "cvP" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/plating,/area/maintenance/medbay) -"cvQ" = (/obj/machinery/power/apc/super{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/atmos) -"cvR" = (/obj/structure/table,/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Virology Port"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/masks,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cvQ" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Xenobiologist"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cvR" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor,/area/engineering/atmos) "cvS" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cvT" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cvU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cvV" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvW" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos) -"cvX" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cvY" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/engineering) -"cvZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cwa" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/xenobiology) +"cvW" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) +"cvX" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) +"cvY" = (/obj/machinery/power/apc/super{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/atmos) +"cvZ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos) +"cwa" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) "cwb" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cwc" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cwd" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) "cwe" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cwf" = (/obj/structure/table,/obj/item/stack/sheet/mineral/phoron{amount = 5; layer = 2.9},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cwg" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/engineering) +"cwg" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) "cwh" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/rnd/xenobiology) "cwi" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "whitehall"; dir = 8},/area/rnd/xenobiology) "cwj" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/starboard) -"cwk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/engineering) +"cwk" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/engineering) "cwl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/rnd/xenobiology) -"cwm" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/engineering/workshop) +"cwm" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Waste"},/turf/simulated/floor,/area/engineering/atmos) "cwn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cwo" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor,/area/engineering/workshop) -"cwp" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 3},/turf/simulated/floor,/area/engineering/workshop) -"cwq" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/plating,/area/engineering/storage) +"cwo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/engineering) +"cwp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/engineering) +"cwq" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/engineering/workshop) "cwr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cws" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/engineering/storage) -"cwt" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engineering/storage) -"cwu" = (/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/engineering/storage) -"cwv" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/medical/virology) -"cww" = (/obj/machinery/computer/security/engineering{network = list("Engineering","Engineering Outpost","Power Alarms","Atmosphere Alarms","Fire Alarms")},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/engineering/engineering_monitoring) -"cwx" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/medical/virology) -"cwy" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwz" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology) -"cwA" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/vials,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwB" = (/obj/structure/table,/obj/item/weapon/storage/fancy/vials,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwD" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwE" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/tvalve/bypass,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SIPHON VALVE'."; name = "\improper SIPHON VALVE"; pixel_y = -32},/turf/simulated/floor/plating,/area/medical/virology) -"cwF" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/medical/virology) -"cwG" = (/obj/machinery/camera{c_tag = "Virology Starboard"; dir = 8; network = list("RD"); pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwH" = (/obj/machinery/door/window/southright{dir = 1; name = "Virology Isolation Room One"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/virology) +"cws" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor,/area/engineering/workshop) +"cwt" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 3},/turf/simulated/floor,/area/engineering/workshop) +"cwu" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/plating,/area/engineering/storage) +"cwv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/engineering/storage) +"cww" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engineering/storage) +"cwx" = (/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/engineering/storage) +"cwy" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/medical/virology) +"cwz" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"cwA" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/medical/virology) +"cwB" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cwC" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology) +"cwD" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/vials,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cwE" = (/obj/structure/table,/obj/item/weapon/storage/fancy/vials,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cwF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cwG" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cwH" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos/monitoring) "cwI" = (/obj/machinery/atmospherics/pipe/tank/phoron{dir = 2; volume = 3200},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cwJ" = (/obj/machinery/atmospherics/pipe/tank/oxygen{dir = 2; volume = 3200},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cwK" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) @@ -6594,18 +6594,18 @@ "cwP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/medbay) "cwQ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay) "cwR" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "virology_airlock_exterior"; id_tag = "virology_airlock_control"; tag_interior_door = "virology_airlock_interior"; name = "Virology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "greencorner"},/area/medical/virology) -"cwS" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/medical/virology) -"cwT" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cwU" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cwV" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) -"cwW" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cwX" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) -"cwY" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cwZ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cxa" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cxb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cxc" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos/storage) -"cxd" = (/obj/machinery/smartfridge/secure/virology,/obj/structure/sign/deathsposal{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cwS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/tvalve/bypass,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SIPHON VALVE'."; name = "\improper SIPHON VALVE"; pixel_y = -32},/turf/simulated/floor/plating,/area/medical/virology) +"cwT" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/medical/virology) +"cwU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Monitoring Room"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engineering_monitoring) +"cwV" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/medical/virology) +"cwW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway North"; dir = 4},/turf/simulated/floor,/area/engineering) +"cwX" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor,/area/engineering/atmos) +"cwY" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor,/area/engineering/atmos) +"cwZ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/engineering{c_tag = "Engineering Workshop"; dir = 8},/turf/simulated/floor,/area/engineering/workshop) +"cxa" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cxb" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) +"cxc" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"cxd" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos) "cxe" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cxf" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/port) "cxg" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) @@ -6613,31 +6613,31 @@ "cxi" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cxj" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cxk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cxl" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/floor,/area/engineering/atmos/storage) +"cxl" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor,/area/engineering/atmos) "cxm" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/rnd/xenobiology) "cxn" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/rnd/xenobiology) -"cxo" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/portable_atmospherics/powered/pump,/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/engineering/atmos/storage) -"cxp" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow,/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cxq" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) -"cxr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/workshop) -"cxs" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor,/area/engineering/workshop) -"cxt" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/workshop) -"cxu" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/engineering/workshop) -"cxv" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating,/area/engineering/storage) -"cxw" = (/obj/structure/dispenser{oxygentanks = 0},/obj/machinery/light,/turf/simulated/floor/plating,/area/engineering/storage) +"cxo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cxp" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos/storage) +"cxq" = (/obj/machinery/light_switch{pixel_x = -27; pixel_y = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/engineering{c_tag = "Engineering Storage"; dir = 4},/turf/simulated/floor/plating,/area/engineering/storage) +"cxr" = (/obj/structure/closet/crate,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/smes_coil,/obj/item/weapon/smes_coil,/obj/item/weapon/smes_coil/super_capacity,/obj/item/weapon/smes_coil/super_capacity,/obj/item/weapon/smes_coil/super_io,/obj/item/weapon/smes_coil/super_io,/turf/simulated/floor/plating,/area/engineering/storage) +"cxs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Operating Theatre 1 Maintenance Access"; req_access = list(45)},/turf/simulated/floor/plating,/area/medical/surgery) +"cxt" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos/storage) +"cxu" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) +"cxv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/workshop) +"cxw" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor,/area/engineering/workshop) "cxx" = (/turf/simulated/floor/plating/airless,/area/solar/port) "cxy" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/port) "cxz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cxA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology) -"cxB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Operating Theatre 1 Maintenance Access"; req_access = list(45)},/turf/simulated/floor/plating,/area/medical/surgery) -"cxC" = (/obj/machinery/atmospherics/omni/filter{use_power = 1; tag_east = 1; tag_north = 3; tag_south = 6; tag_west = 2},/turf/simulated/floor,/area/engineering/atmos) -"cxD" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cxE" = (/obj/machinery/atmospherics/omni/filter{use_power = 1; tag_east = 1; tag_north = 4; tag_south = 7; tag_west = 2},/turf/simulated/floor,/area/engineering/atmos) +"cxA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/workshop) +"cxB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/engineering/workshop) +"cxC" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating,/area/engineering/storage) +"cxD" = (/obj/structure/dispenser{oxygentanks = 0},/obj/machinery/light,/turf/simulated/floor/plating,/area/engineering/storage) +"cxE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology) "cxF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Operating Theatre 2 Maintenance Access"; req_access = list(45)},/turf/simulated/floor/plating,/area/medical/surgery2) -"cxG" = (/obj/structure/closet/crate,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/smes_coil,/obj/item/weapon/smes_coil,/obj/item/weapon/smes_coil/super_capacity,/obj/item/weapon/smes_coil/super_capacity,/obj/item/weapon/smes_coil/super_io,/obj/item/weapon/smes_coil/super_io,/turf/simulated/floor/plating,/area/engineering/storage) -"cxH" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cxI" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Monitoring Room"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engineering_monitoring) -"cxJ" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor,/area/engineering/atmos) +"cxG" = (/obj/machinery/atmospherics/omni/filter{use_power = 1; tag_east = 1; tag_north = 3; tag_south = 6; tag_west = 2},/turf/simulated/floor,/area/engineering/atmos) +"cxH" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos/storage) +"cxI" = (/obj/machinery/atmospherics/omni/filter{use_power = 1; tag_east = 1; tag_north = 4; tag_south = 7; tag_west = 2},/turf/simulated/floor,/area/engineering/atmos) +"cxJ" = (/obj/machinery/smartfridge/secure/virology,/obj/structure/sign/deathsposal{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cxK" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cxL" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cxM" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) @@ -6645,106 +6645,106 @@ "cxO" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cxP" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cxQ" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/medbay) -"cxR" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) +"cxR" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "virology_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access = list(13)},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/medbay) "cxS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/medical/virology) "cxT" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "green"},/area/medical/virology) "cxU" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{id_tag = "virologyq_airlock_control"; name = "Virology Quarantine Access Console"; pixel_x = -8; pixel_y = -22; tag_exterior_door = "virologyq_airlock_exterior"; tag_interior_door = "virologyq_airlock_interior"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/medical/virology) -"cxV" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) +"cxV" = (/obj/machinery/door/window/southright{dir = 1; name = "Virology Isolation Room One"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cxW" = (/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cxX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cxY" = (/obj/structure/table,/obj/machinery/computer/med_data/laptop,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cxZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) -"cya" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Pre-Op Prep Room Maintenance Access"; req_access = list(45)},/turf/simulated/floor/plating,/area/medical/surgeryprep) -"cyb" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cyc" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor,/area/engineering/atmos) +"cya" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/bed/chair,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/camera/network/medbay{c_tag = "Virology Monkey Pen"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cyb" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cyc" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/glass_jar,/obj/item/glass_jar,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cyd" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/port) "cye" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cyf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cyg" = (/obj/machinery/camera{c_tag = "Xenobiology South"; dir = 8; network = list("SS13","Research"); pixel_y = -22},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cyh" = (/obj/machinery/computer/security/engineering{network = list("Engineering","Engineering Outpost","Power Alarms","Atmosphere Alarms","Fire Alarms","Atmospherics")},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cyi" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/camera{c_tag = "Atmospherics South East"; dir = 1},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cyj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"cyk" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/engineering/atmos) -"cyl" = (/turf/simulated/floor,/area/engineering/atmos/storage) -"cym" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cyn" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor,/area/engineering/atmos/storage) -"cyo" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/engineering) -"cyp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cyq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cyr" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/engineering) -"cys" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/engineering/workshop) -"cyt" = (/obj/structure/bed/chair,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engineering/workshop) -"cyu" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor,/area/engineering/workshop) -"cyv" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/pipedispenser,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) -"cyw" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cyx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology) -"cyy" = (/obj/machinery/atmospherics/binary/passive_gate,/turf/simulated/floor,/area/engineering/atmos) -"cyz" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/atmos) -"cyA" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor,/area/engineering/atmos) -"cyB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/atmos) -"cyC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"cyD" = (/obj/machinery/space_heater,/turf/simulated/floor,/area/engineering/atmos/storage) -"cyE" = (/obj/machinery/space_heater,/obj/machinery/light/small,/turf/simulated/floor,/area/engineering/atmos/storage) -"cyF" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cyG" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/engineering/workshop) -"cyH" = (/obj/structure/table,/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/engineering/workshop) -"cyI" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engineering/workshop) -"cyJ" = (/obj/structure/table,/obj/machinery/light,/obj/item/weapon/wrench,/obj/item/device/flashlight,/obj/machinery/cell_charger,/turf/simulated/floor,/area/engineering/workshop) -"cyK" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor,/area/engineering/workshop) -"cyL" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cyg" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/atmos) +"cyh" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cyi" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/atmos) +"cyj" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor,/area/engineering/atmos) +"cyk" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cyl" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor,/area/engineering/atmos) +"cym" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Workshop"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/workshop) +"cyn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/engineering/atmos) +"cyo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/engineering/atmos) +"cyp" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Hard Storage"; req_access = list(11)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/storage) +"cyq" = (/turf/simulated/floor,/area/engineering/atmos/storage) +"cyr" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Engineering\\Medbay Maintenance"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cys" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor,/area/engineering/atmos/storage) +"cyt" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/engineering) +"cyu" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos/storage) +"cyv" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/engineering) +"cyw" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/engineering/workshop) +"cyx" = (/obj/structure/bed/chair,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engineering/workshop) +"cyy" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor,/area/engineering/workshop) +"cyz" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = 8; pixel_y = -28; req_access = list(39)},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/medical/virology) +"cyA" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cyB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology) +"cyC" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Transit to Waste"},/turf/simulated/floor,/area/engineering/atmos) +"cyD" = (/obj/machinery/atmospherics/binary/passive_gate{name = "Waste to Space"},/turf/simulated/floor,/area/engineering/atmos) +"cyE" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) +"cyF" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cyG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/atmos) +"cyH" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) +"cyI" = (/obj/machinery/space_heater,/turf/simulated/floor,/area/engineering/atmos/storage) +"cyJ" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cyK" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) +"cyL" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor,/area/engineering/workshop) "cyM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cyN" = (/obj/machinery/atmospherics/trinary/mixer,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cyO" = (/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cyP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cyQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/maintenance/medbay) -"cyR" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cyS" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_one_access = list(5,12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cyR" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/atmos) +"cyS" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor,/area/engineering/atmos) "cyT" = (/obj/structure/table,/obj/item/device/antibody_scanner,/obj/machinery/requests_console{department = "Virology"; name = "Virology Requests Console"; pixel_x = -32},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cyU" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cyU" = (/obj/structure/table,/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/engineering/workshop) "cyV" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 8},/obj/structure/disposalpipe/segment,/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 7; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Virology Emergency Phone"; pixel_x = -6; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology) -"cyX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cyX" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engineering/workshop) "cyY" = (/obj/item/roller,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cyZ" = (/obj/machinery/door/window/southright{dir = 4; name = "Primate Pen"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/virology) +"cyZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/turf/simulated/floor,/area/engineering/atmos) "cza" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "czb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "czc" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "czd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/xenobiology) -"cze" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) -"czf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos) -"czg" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"czh" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"cze" = (/obj/structure/table,/obj/machinery/light,/obj/item/weapon/wrench,/obj/item/device/flashlight,/obj/machinery/cell_charger,/turf/simulated/floor,/area/engineering/workshop) +"czf" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor,/area/engineering/workshop) +"czg" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"czh" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "czi" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/port) -"czj" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/green,/turf/simulated/floor,/area/engineering/atmos) -"czk" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"czl" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"czm" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czn" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czo" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czp" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czq" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czr" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czs" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = 32},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 2e+006; RCon_tag = "Substation - Atmospherics"},/turf/simulated/floor/plating,/area/engineering/atmos/storage) -"czt" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/sensor{name = "Powernet Sensor - Atmospherics Subgrid"; name_tag = "Atmospherics Subgrid"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/structure/cable/cyan,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/atmos/storage) -"czu" = (/turf/simulated/wall/r_wall,/area/engineering) -"czv" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Workshop"; req_one_access = list(11,24)},/turf/simulated/floor,/area/engineering/workshop) -"czw" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"czx" = (/obj/structure/bed/chair{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"czy" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Hard Storage"; req_access = list(11)},/turf/simulated/floor,/area/engineering/storage) -"czz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/medical/virology) -"czA" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) -"czB" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) +"czj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"czk" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) +"czl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos) +"czm" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) +"czn" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/atmos) +"czo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) +"czp" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"czq" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor,/area/engineering/atmos) +"czr" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) +"czs" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"czt" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"czu" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"czv" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"czw" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"czx" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"czy" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = 32},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 2e+006; RCon_tag = "Substation - Atmospherics"},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"czz" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/sensor{name = "Powernet Sensor - Atmospherics Subgrid"; name_tag = "Atmospherics Subgrid"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/structure/cable/cyan,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/atmos/storage) +"czA" = (/turf/simulated/wall/r_wall,/area/engineering) +"czB" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Hard Storage"; req_access = list(11)},/turf/simulated/floor,/area/engineering/storage) "czC" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/port) -"czD" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) -"czE" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos) -"czF" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"czG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/portable_atmospherics/canister/phoron,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"czI" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"czD" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"czE" = (/obj/structure/bed/chair{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"czF" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_one_access = list(5,12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"czG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/medical/virology) +"czH" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) +"czI" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) "czJ" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"czK" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"czL" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/autoname,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"czM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/turf/simulated/floor,/area/engineering/atmos) +"czK" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) +"czL" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"czM" = (/obj/structure/table,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/masks,/obj/machinery/camera/network/medbay{c_tag = "Virology Port"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "czN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engineering) "czO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) "czP" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) @@ -6753,19 +6753,19 @@ "czS" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/incinerator) "czT" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/incinerator) "czU" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/medbay) -"czV" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Engineering\\Medbay Maintenance"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) +"czV" = (/obj/machinery/door/window/southright{dir = 4; name = "Primate Pen"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/medical/virology) "czW" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"czX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = 8; pixel_y = -28; req_access = list(39)},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/medical/virology) +"czX" = (/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/remains/robot,/turf/simulated/floor/plating,/area/maintenance/engineering) "czY" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "czZ" = (/obj/machinery/computer/diseasesplicer,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cAa" = (/obj/machinery/disease2/diseaseanalyser,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cAb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cAc" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cAd" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cAd" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/atmos) "cAe" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cAf" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/rnd/xenobiology) "cAg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/rnd/xenobiology) -"cAh" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cAh" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Mixing to Port"},/turf/simulated/floor,/area/engineering/atmos) "cAi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cAj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cAk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) @@ -6777,34 +6777,34 @@ "cAq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) "cAr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/xenobiology) "cAs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) -"cAt" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cAu" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/atmos/storage) -"cAv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Atmospherics Substation"; dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engineering/atmos/storage) -"cAw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cAx" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) -"cAy" = (/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/engineering) -"cAz" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cAA" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cAB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/engineering) -"cAC" = (/obj/machinery/firealarm{pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cAD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering) -"cAE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cAF" = (/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/engineering) +"cAt" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cAu" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/turf/simulated/floor,/area/engineering/atmos) +"cAv" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos) +"cAw" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Phoron to Mixing"},/turf/simulated/floor,/area/engineering/atmos) +"cAx" = (/obj/machinery/atmospherics/binary/pump{name = "Mixing to Mix Tank"},/turf/simulated/floor,/area/engineering/atmos) +"cAy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/portable_atmospherics/canister/phoron,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cAz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/atmos) +"cAA" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix Tank to Port"},/turf/simulated/floor,/area/engineering/atmos) +"cAB" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cAC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cAD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cAE" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cAF" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/atmos/storage) "cAG" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.1; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = 10; pixel_y = -22},/obj/structure/sign/fire{pixel_x = -32; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cAH" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/engineering) -"cAI" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) -"cAJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology) -"cAK" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor{dir = 10; icon_state = "yellow"},/area/engineering/atmos) -"cAL" = (/obj/machinery/light,/turf/simulated/floor,/area/engineering/atmos) -"cAM" = (/obj/machinery/atmospherics/valve/digital{name = "CO2 Outlet Valve"},/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/engineering/atmos) +"cAH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "delivery"},/area/medical/virology) +"cAI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/medbay{c_tag = "Virology Starboard"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cAK" = (/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/engineering) +"cAL" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cAM" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) "cAN" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cAO" = (/turf/simulated/wall,/area/maintenance/engi_shuttle) "cAP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) "cAQ" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/incinerator) "cAR" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cAS" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "yellow"},/area/engineering/atmos) +"cAS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/engineering) "cAT" = (/turf/simulated/floor{dir = 2; icon_state = "floorgrimecaution"},/area/maintenance/incinerator) -"cAU" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/atmos) +"cAU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -7; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 7; pixel_y = -32},/turf/simulated/floor,/area/rnd/xenobiology) "cAV" = (/turf/simulated/floor/plating,/area/maintenance/incinerator) "cAW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/incinerator) "cAX" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/medbay) @@ -6815,48 +6815,48 @@ "cBc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/virology) "cBd" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) "cBe" = (/obj/machinery/light,/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) -"cBf" = (/obj/machinery/camera{c_tag = "Atmospherics South West"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engineering/atmos) -"cBg" = (/obj/machinery/light,/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cBh" = (/obj/machinery/atmospherics/valve/digital{name = "Phoron Outlet Valve"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engineering/atmos) -"cBi" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Phoron Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light,/turf/simulated/floor{icon_state = "warning"},/area/engineering/atmos) -"cBj" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor{dir = 10; icon_state = "escape"},/area/engineering/atmos) -"cBk" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/machinery/light,/turf/simulated/floor,/area/engineering/atmos) +"cBf" = (/obj/machinery/firealarm{pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cBg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering) +"cBh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) +"cBi" = (/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/engineering) +"cBj" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/engineering) +"cBk" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/floor,/area/engineering/atmos) "cBl" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology) -"cBm" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/atmos) -"cBn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Workshop"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/workshop) +"cBm" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) +"cBn" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) "cBo" = (/obj/machinery/light,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) "cBp" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) -"cBq" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Hard Storage"; req_access = list(11)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/storage) +"cBq" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 10; icon_state = "yellow"},/area/engineering/atmos) "cBr" = (/obj/machinery/light,/obj/structure/closet,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) -"cBs" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cBt" = (/obj/machinery/atmospherics/valve/digital{name = "N2O Outlet Valve"},/turf/simulated/floor{icon_state = "escape"; dir = 6},/area/engineering/atmos) -"cBu" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light,/turf/simulated/floor{dir = 7; icon_state = "escape"},/area/engineering/atmos) -"cBv" = (/obj/machinery/atmospherics/valve/digital{name = "Gas Mix Inlet Valve"},/obj/machinery/camera{c_tag = "Atmospherics South"; dir = 1},/turf/simulated/floor{dir = 10; icon_state = "green"},/area/engineering/atmos) +"cBs" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/turf/simulated/floor{icon_state = "delivery"},/area/medical/virology) +"cBt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology) +"cBu" = (/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Southwest"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engineering/atmos) +"cBv" = (/obj/machinery/light,/turf/simulated/floor,/area/engineering/atmos) "cBw" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = -8; pixel_y = 24},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cBx" = (/obj/machinery/atmospherics/valve/digital{name = "Gas Mix Outlet Valve"},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/engineering/atmos) -"cBy" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "waste_in"; name = "Gas Mix Tank Control"; output_tag = "waste_out"; sensors = list("waste_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "green"},/area/engineering/atmos) -"cBz" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/atmos) -"cBA" = (/turf/simulated/wall/r_wall,/area/engineering/drone_fabrication) -"cBB" = (/obj/machinery/door/window/southright{name = "Virology Isolation Room Three"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) -"cBC" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering) -"cBD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) -"cBE" = (/obj/machinery/camera{c_tag = "Engineering Hallway South West"; dir = 1; pixel_x = 22},/turf/simulated/floor,/area/engineering) -"cBF" = (/obj/machinery/camera{c_tag = "Engineering Hallway South East"; dir = 1},/turf/simulated/floor,/area/engineering) -"cBG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering) -"cBH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/engineering) -"cBI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering) -"cBJ" = (/obj/structure/sign/securearea,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering) -"cBK" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"cBL" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area/space) -"cBM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area/maintenance/medbay) -"cBN" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cBO" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating/airless,/area/medical/virology) -"cBP" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating/airless,/area/medical/virology) -"cBQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/medical/virology) -"cBR" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/structure/lattice,/turf/space,/area/space) -"cBS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/engineering/atmos) -"cBT" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) -"cBU" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) +"cBx" = (/obj/machinery/atmospherics/valve/digital{name = "CO2 Outlet Valve"},/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/engineering/atmos) +"cBy" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "yellow"},/area/engineering/atmos) +"cBz" = (/obj/machinery/door/window/southright{name = "Virology Isolation Room Two"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"cBA" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Connector"},/turf/simulated/floor,/area/engineering/atmos) +"cBB" = (/obj/machinery/atmospherics/valve/digital{name = "Phoron Outlet Valve"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engineering/atmos) +"cBC" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "tox_in"; name = "Phoron Supply Control"; output_tag = "tox_out"; sensors = list("tox_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light,/turf/simulated/floor{icon_state = "warning"},/area/engineering/atmos) +"cBD" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 10; icon_state = "escape"},/area/engineering/atmos) +"cBE" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Phoron to Connector"},/turf/simulated/floor,/area/engineering/atmos) +"cBF" = (/obj/machinery/atmospherics/valve/digital{name = "N2O Outlet Valve"},/turf/simulated/floor{icon_state = "escape"; dir = 6},/area/engineering/atmos) +"cBG" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; sensors = list("n2o_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light,/turf/simulated/floor{dir = 7; icon_state = "escape"},/area/engineering/atmos) +"cBH" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Connector"},/turf/simulated/floor,/area/engineering/atmos) +"cBI" = (/obj/machinery/door/window/southright{name = "Virology Isolation Room Three"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"cBJ" = (/obj/machinery/atmospherics/valve/digital{name = "Gas Mix Outlet Valve"},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/engineering/atmos) +"cBK" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "waste_in"; name = "Gas Mix Tank Control"; output_tag = "waste_out"; sensors = list("waste_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 2; icon_state = "green"},/area/engineering/atmos) +"cBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cBM" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix Tank to Connector"},/obj/machinery/light,/turf/simulated/floor,/area/engineering/atmos) +"cBN" = (/turf/simulated/wall/r_wall,/area/engineering/drone_fabrication) +"cBO" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cBP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering) +"cBQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) +"cBR" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/research{c_tag = "Xenobiology Southeast"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cBS" = (/turf/space,/area/skipjack_station/southeast_solars) +"cBT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering) +"cBU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/engineering) "cBV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cBW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cBX" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) @@ -6864,469 +6864,516 @@ "cBZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/engineering) "cCa" = (/turf/simulated/wall/r_wall,/area/maintenance/incinerator) "cCb" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall/r_wall,/area/maintenance/incinerator) -"cCc" = (/obj/machinery/door/window/southright{name = "Virology Isolation Room Two"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"cCc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) "cCd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cCe" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/turf/simulated/floor{icon_state = "delivery"},/area/medical/virology) -"cCf" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "virology_airlock"; name = "interior access button"; pixel_x = -20; pixel_y = -20; req_access = list(10,13)},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/medbay) +"cCe" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/atmos) +"cCf" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) "cCg" = (/obj/structure/table,/obj/item/weapon/storage/box/cups,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cCh" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cCi" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/turf/simulated/floor,/area/engineering/atmos/storage) +"cCi" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/engineering/atmos) "cCj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) "cCk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/status_display,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) -"cCl" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/plating/airless,/area/space) +"cCl" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/atmos) "cCm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) -"cCn" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/floor,/area/engineering/atmos) +"cCn" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Southeast"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) "cCo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) -"cCp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) +"cCp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering) "cCq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/computer/reconstitutor/animal,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology) -"cCr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/engineering/atmos) -"cCs" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) -"cCt" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) -"cCu" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/atmos) -"cCv" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) -"cCw" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) -"cCx" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/purple{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/engineering/atmos) -"cCy" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cCz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cCA" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication) -"cCB" = (/obj/machinery/light{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/drone_fabrication) -"cCC" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/drone_fabrication) -"cCD" = (/obj/structure/bed/chair,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication) -"cCE" = (/obj/machinery/recharge_station,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cCF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cCG" = (/turf/simulated/wall/r_wall,/area/engineering/engine_smes) -"cCH" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_smes) -"cCI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -7; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 7; pixel_y = -32},/turf/simulated/floor,/area/rnd/xenobiology) -"cCJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engine_monitoring) -"cCK" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) -"cCL" = (/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/remains/robot,/turf/simulated/floor/plating,/area/maintenance/engineering) -"cCM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engine_monitoring) -"cCN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "delivery"},/area/medical/virology) -"cCO" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering EVA Storage"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/engine_eva) +"cCr" = (/obj/structure/sign/securearea,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering) +"cCs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) +"cCt" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area/space) +"cCu" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area/maintenance/medbay) +"cCv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cCw" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating/airless,/area/medical/virology) +"cCx" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating/airless,/area/medical/virology) +"cCy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/medical/virology) +"cCz" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/engineering/atmos) +"cCA" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/engineering/atmos) +"cCB" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engineering/atmos) +"cCC" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) +"cCD" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) +"cCE" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/engineering/atmos) +"cCF" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/plating,/area/engineering/atmos) +"cCG" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) +"cCH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/atmos) +"cCI" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos) +"cCJ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating/airless,/area/space) +"cCK" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/space,/area/space) +"cCL" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cCM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cCN" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/turf/simulated/floor,/area/engineering/atmos/storage) +"cCO" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor,/area/engineering/workshop) "cCP" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle) -"cCQ" = (/obj/machinery/computer/shuttle_control/engineering,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cCQ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "virology_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/medbay) "cCR" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/engineering) "cCS" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/engineering) "cCT" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) -"cCU" = (/turf/simulated/wall/r_wall,/area/engineering/engine_airlock) -"cCV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_airlock) -"cCW" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering EVA Storage"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/engineering/engine_eva) +"cCU" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication) +"cCV" = (/obj/machinery/light{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/drone_fabrication) +"cCW" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/drone_fabrication) "cCX" = (/turf/simulated/floor/plating/airless,/area/maintenance/medbay) -"cCY" = (/obj/machinery/door_control{id = "engineering_cubicle"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 8; specialfunctions = 4},/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cCZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator) -"cDa" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Virology Break/Access"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cCY" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virologyq_airlock_interior"; locked = 1; name = "Virology Quarantine Airlock"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cCZ" = (/obj/structure/bed/chair,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication) +"cDa" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/research{c_tag = "Xenobiology Southwest"; dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) "cDb" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDc" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDd" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) "cDf" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/space) -"cDg" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HOT EXHAUST'."; name = "\improper HOT EXHAUST"; pixel_x = -32},/turf/simulated/floor/plating/airless,/area/space) +"cDg" = (/obj/machinery/recharge_station,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cDh" = (/obj/machinery/clonepod,/turf/simulated/floor/engine,/area/rnd/xenobiology) "cDi" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cDj" = (/obj/item/weapon/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cDk" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDm" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDn" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) -"cDo" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) -"cDp" = (/obj/machinery/computer/security/engineering{name = "Drone Monitoring Cameras"; network = list("Engineering")},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDq" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDr" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/multitool{pixel_x = 5},/obj/item/clothing/gloves/yellow,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/engineering/engine_smes) -"cDs" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/engine_smes) -"cDt" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/engineering/engine_smes) -"cDu" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -2; pixel_y = 5},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cDv" = (/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) -"cDw" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) -"cDx" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cDy" = (/obj/structure/closet/radiation,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cDz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cDA" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_airlock) -"cDB" = (/obj/structure/closet/radiation,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/machinery/camera{c_tag = "Engine Room Airlock"; dir = 2; network = list("SS13","Supermatter")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/engineering/engine_airlock) -"cDC" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_airlock) -"cDD" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cDE" = (/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cDF" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/wall/r_wall,/area/engineering/atmos) -"cDG" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engineering/atmos) -"cDH" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engineering/atmos) -"cDI" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes,/obj/machinery/light/small{dir = 8},/obj/item/weapon/deck,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDJ" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDK" = (/obj/effect/decal/remains/robot,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) -"cDL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) -"cDM" = (/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDN" = (/obj/structure/window/basic{dir = 4},/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower{color = "#FFA500"; layer = 3.3},/obj/machinery/door/window/northleft{name = "Shower"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cDO" = (/obj/structure/window/basic{dir = 8},/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower{color = "#FFA500"; layer = 3.3},/obj/machinery/door/window/northright{name = "Shower"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"cDj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDk" = (/turf/simulated/wall/r_wall,/area/engineering/engine_smes) +"cDl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_smes) +"cDm" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(12,24)},/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cDn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engine_monitoring) +"cDo" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) +"cDp" = (/obj/machinery/space_heater,/obj/machinery/light/small,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/engineering/atmos/storage) +"cDq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/engineering/engine_monitoring) +"cDr" = (/turf/simulated/wall/r_wall,/area/engineering/engine_airlock) +"cDs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_airlock) +"cDt" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cDu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator) +"cDv" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HOT EXHAUST'."; name = "\improper HOT EXHAUST"; pixel_x = -32},/turf/simulated/floor/plating/airless,/area/space) +"cDw" = (/obj/item/weapon/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cDx" = (/obj/structure/grille,/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/space,/area/space) +"cDy" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDA" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDB" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) +"cDC" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) +"cDD" = (/obj/machinery/computer/security/engineering{name = "Drone Monitoring Cameras"; network = list("Engineering")},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDE" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDF" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/multitool{pixel_x = 5},/obj/item/clothing/gloves/yellow,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/engineering/engine_smes) +"cDG" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/engine_smes) +"cDH" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/engineering/engine_smes) +"cDI" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -2; pixel_y = 5},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cDJ" = (/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) +"cDK" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) +"cDL" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cDM" = (/obj/structure/closet/radiation,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cDN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cDO" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "virology_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "virology_pump"; tag_exterior_door = "virology_outer"; frequency = 1379; id_tag = "virology_airlock"; tag_interior_door = "virology_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "virology_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/medbay) "cDP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cDQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cDR" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/engineering) "cDS" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/engineering) "cDT" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/engineering) -"cDU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Virology Access"; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/medical/virologyaccess) +"cDU" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "virologyq_airlock_control"; name = "Virology Quarantine Access Button"; pixel_x = -8; pixel_y = 28; req_access = list(39)},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDV" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cDW" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/turf/simulated/floor,/area/engineering/engine_monitoring) "cDX" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDY" = (/obj/machinery/washing_machine,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cDZ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/rnd/xenobiology) "cEa" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cEb" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEc" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/turf/simulated/floor,/area/engineering/engine_smes) -"cEd" = (/turf/simulated/floor,/area/engineering/engine_smes) -"cEe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/engine_smes) -"cEf" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEg" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEh" = (/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEi" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEj" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEk" = (/obj/machinery/door/airlock/research{name = "Xenoflora Storage"; req_access = list(55)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cEl" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/engine_airlock) -"cEm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/engineering/engine_airlock) -"cEn" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cEo" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "co2_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cEp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cEq" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cEr" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "tox_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) -"cEs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "tox_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) -"cEt" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) -"cEu" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "n2o_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cEv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cEw" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cEx" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "waste_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cEy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cEz" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cEA" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEB" = (/obj/machinery/door/airlock/research{name = "Xenoflora Research"; req_access = list(55)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cEb" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_airlock) +"cEc" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering) +"cEd" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_airlock) +"cEe" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cEf" = (/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cEg" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/wall/r_wall,/area/engineering/atmos) +"cEh" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engineering/atmos) +"cEi" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/space,/area/space) +"cEj" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes,/obj/machinery/light/small{dir = 8},/obj/item/weapon/deck,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEk" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEl" = (/obj/effect/decal/remains/robot,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) +"cEm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) +"cEn" = (/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEo" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEp" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEq" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/turf/simulated/floor,/area/engineering/engine_smes) +"cEr" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "incinerator_airlock_exterior"; id_tag = "incinerator_access_control"; tag_interior_door = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = -6; pixel_y = -26; req_access = list(12)},/obj/machinery/button/ignition{id = "Incinerator"; pixel_x = 6; pixel_y = -24},/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator) +"cEs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/engine_smes) +"cEt" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cEu" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) +"cEv" = (/turf/simulated/floor,/area/engineering/engine_monitoring) +"cEw" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cEx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cEy" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/machinery/button/remote/blast_door{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_one_access = list(12,5)},/turf/simulated/floor{dir = 1; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator) +"cEz" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/engine_airlock) +"cEA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/engineering/engine_airlock) +"cEB" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio4"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) "cEC" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/engi_shuttle) "cED" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cEE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) +"cEE" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEF" = (/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"cEG" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/electrical,/obj/machinery/camera{c_tag = "Drone Fabrication"; dir = 8; network = list("SS13")},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering/engine_smes) +"cEG" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "co2_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cEH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cEI" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) "cEJ" = (/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEK" = (/obj/machinery/computer/arcade,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cEL" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cEM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_smes) -"cEN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering/engine_smes) -"cEO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/engine_smes) -"cEP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cER" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cES" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cET" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/newscaster{pixel_x = 28; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/engineering/engine_airlock) -"cEW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) -"cEX" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/engineering/engine_airlock) -"cEY" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cEZ" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cFa" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cFb" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) -"cFc" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) -"cFd" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cFe" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller,/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cFf" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cFg" = (/obj/machinery/light,/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cEM" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "tox_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cEN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "tox_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cEO" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cEP" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "n2o_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cEQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cER" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cES" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "waste_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cET" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cEU" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cEV" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) +"cEX" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) +"cEY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cEZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering/engine_smes) +"cFa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_smes) +"cFb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering/engine_smes) +"cFc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/engine_smes) +"cFd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cFe" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio5"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) +"cFf" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cFg" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for a door to space."; id = "xenobioout6"; name = "Containment Release Switch"; pixel_x = 24; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/xenobiology) "cFh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/engi_shuttle) "cFi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cFj" = (/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) -"cFk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cFl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_smes) -"cFm" = (/obj/machinery/camera{c_tag = "SMES"; dir = 8; network = list("SS13","Supermatter")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/engineering/engine_smes) +"cFj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cFk" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/newscaster{pixel_x = 28; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cFl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cFm" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/engineering/engine_airlock) "cFn" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cFo" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/secure_closet/personal/patient,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/under/color/white,/obj/item/clothing/shoes/white,/obj/item/clothing/shoes/white,/obj/item/clothing/shoes/white,/obj/item/clothing/shoes/white,/obj/item/clothing/shoes/white,/obj/item/clothing/shoes/white,/obj/item/clothing/shoes/white,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cFp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/engineering/engine_smes) -"cFq" = (/obj/structure/table/reinforced,/obj/machinery/camera{c_tag = "Engine Monitoring Room"; dir = 4; network = list("SS13","Supermatter")},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cFr" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/machinery/door/window/southleft{name = "Engineering Hardsuits"; req_access = list(11)},/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/suit/space/void/engineering,/turf/simulated/floor,/area/engineering/engine_eva) -"cFs" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cFt" = (/obj/structure/table/reinforced,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cFu" = (/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller{id_tag = "engine_room_airlock"; name = "Engine Room Airlock"; pixel_x = -24; tag_airpump = "engine_airlock_pump"; tag_chamber_sensor = "eng_al_c_snsr"; tag_exterior_door = "engine_airlock_exterior"; tag_exterior_sensor = "eng_al_ext_snsr"; tag_interior_door = "engine_airlock_interior"; tag_interior_sensor = "eng_al_int_snsr"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/engine_airlock) -"cFv" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/engine_airlock) -"cFw" = (/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume{dir = 8; frequency = 1379; id = "engine_airlock_pump"},/turf/simulated/floor/plating,/area/engineering/engine_airlock) -"cFx" = (/obj/machinery/light/small,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cFy" = (/obj/machinery/light/small,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) -"cFz" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cFA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cFB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cFC" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) -"cFD" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator{output_dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/drone_fabrication) -"cFE" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/drone_fabrication) -"cFF" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) -"cFG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cFH" = (/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 500000; RCon_tag = "Engine - Main"},/obj/structure/cable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engineering/engine_smes) -"cFI" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_smes) +"cFp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) +"cFq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/engineering/engine_airlock) +"cFr" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Maintenance"; dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engineering/atmos/storage) +"cFs" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cFt" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cFu" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cFv" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cFw" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFx" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller,/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFy" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFz" = (/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) +"cFA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cFB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_smes) +"cFC" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering) +"cFD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/engineering/engine_smes) +"cFE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/turf/simulated/floor/plating,/area/engineering) +"cFF" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1379; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cFG" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cFH" = (/obj/structure/table/reinforced,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/engineering/engine_monitoring) +"cFI" = (/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller{id_tag = "engine_room_airlock"; name = "Engine Room Airlock"; pixel_x = -24; tag_airpump = "engine_airlock_pump"; tag_chamber_sensor = "eng_al_c_snsr"; tag_exterior_door = "engine_airlock_exterior"; tag_exterior_sensor = "eng_al_ext_snsr"; tag_interior_door = "engine_airlock_interior"; tag_interior_sensor = "eng_al_int_snsr"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/engine_airlock) "cFJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/engi_shuttle) -"cFK" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/machinery/light{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/southleft{name = "Engineering Hardsuits"; req_access = list(11)},/obj/item/clothing/suit/space/void/engineering,/turf/simulated/floor,/area/engineering/engine_eva) -"cFL" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cFK" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "virology_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/maintenance/medbay) +"cFL" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virologyq_airlock_exterior"; locked = 1; name = "Virology Quarantine Airlock"; req_access = list(39)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virologyq_airlock_control"; name = "Virology Quarantine Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cFM" = (/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/maintenance/engineering) "cFN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engineering) "cFO" = (/obj/structure/sign/fire{pixel_y = 32},/obj/structure/lattice,/turf/space,/area/space) "cFP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) "cFQ" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cFR" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cFS" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/research_port) -"cFT" = (/obj/machinery/computer/general_air_control/supermatter_core{frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cFU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/power_monitor,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cFV" = (/obj/machinery/computer/rcon,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cFW" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cFX" = (/obj/machinery/computer/security/engineering{network = list("Engineering","Power Alarms","Atmosphere Alarms","Fire Alarms","Supermatter")},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cFY" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_al_c_snsr"; pixel_x = -25; pixel_y = 0},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_airlock) -"cFZ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_airlock) -"cGa" = (/turf/simulated/floor/plating,/area/engineering/engine_airlock) -"cGb" = (/obj/structure/grille,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engineering/atmos) -"cGc" = (/turf/simulated/wall/r_wall,/area/engineering/engine_room) -"cGd" = (/obj/item/weapon/stool,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cGe" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/atmos,/obj/machinery/door/window/northright{name = "Atmospherics Hardsuits"; req_access = list(24)},/turf/simulated/floor,/area/engineering/engine_eva) -"cGf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGg" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/atmos,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northleft{name = "Atmospherics Hardsuits"; req_access = list(24)},/turf/simulated/floor,/area/engineering/engine_eva) -"cGh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cFS" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/engine_airlock) +"cFT" = (/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume{dir = 8; frequency = 1379; id = "engine_airlock_pump"},/turf/simulated/floor/plating,/area/engineering/engine_airlock) +"cFU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cFV" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cFW" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cFX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cFY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cFZ" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) +"cGa" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator{output_dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/drone_fabrication) +"cGb" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/drone_fabrication) +"cGc" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) +"cGd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cGe" = (/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 500000; RCon_tag = "Engine - Main"},/obj/structure/cable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engineering/engine_smes) +"cGf" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_smes) +"cGg" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cGh" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/space,/area/space) +"cGi" = (/obj/machinery/computer/general_air_control/supermatter_core{frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) "cGj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/engineering) -"cGk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/power_monitor,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) "cGl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/virology) -"cGm" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/engineering{name = "Construction Area"; req_access = list(32)},/turf/simulated/floor/plating,/area/construction) -"cGn" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/engineering/engine_waste) -"cGo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cGp" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cGq" = (/obj/machinery/camera/autoname{dir = 2; network = list("SS13","Supermatter","Atmospherics")},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engineering/engine_waste) -"cGr" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cGs" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_room) -"cGt" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_waste) -"cGu" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGv" = (/obj/machinery/door/airlock/engineering{name = "Engineering Substation"; req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) -"cGw" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow,/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Output"; name_tag = "Engine Output"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) -"cGx" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Locker Room"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/locker_room) -"cGy" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) -"cGz" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 2e+006; input_attempt = 1; input_level = 100000; output_level = 200000; RCon_tag = "Engine - Core"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) -"cGA" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGB" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGC" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGD" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGE" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebotc"},/area/engineering/engine_room) +"cGm" = (/obj/machinery/computer/rcon,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) +"cGn" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) +"cGo" = (/obj/machinery/atmospherics/valve/digital{name = "Gas Mix Inlet Valve"},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics South"; dir = 1},/turf/simulated/floor{dir = 10; icon_state = "green"},/area/engineering/atmos) +"cGp" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_al_c_snsr"; pixel_x = -25; pixel_y = 0},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_airlock) +"cGq" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_airlock) +"cGr" = (/turf/simulated/floor/plating,/area/engineering/engine_airlock) +"cGs" = (/obj/structure/grille,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engineering/atmos) +"cGt" = (/turf/simulated/wall/r_wall,/area/engineering/engine_room) +"cGu" = (/obj/machinery/door/airlock/maintenance{name = "Drone Fabrication"; req_one_access = list(10,24)},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cGv" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southwest"; dir = 1},/turf/simulated/floor,/area/engineering) +"cGw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGA" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southeast"; dir = 1},/turf/simulated/floor,/area/engineering) +"cGB" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/engineering/engine_waste) +"cGC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cGD" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cGE" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cGF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/maintenance/engineering) "cGG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) "cGH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) -"cGI" = (/obj/machinery/light_switch{pixel_x = 12; pixel_y = 25},/obj/machinery/power/apc/super{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGJ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10,13)},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar) -"cGK" = (/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGL" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) -"cGM" = (/obj/structure/grille,/obj/structure/grille,/turf/space,/area/space) -"cGN" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cGO" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cGP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) +"cGI" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cGJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_room) +"cGK" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_waste) +"cGL" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/engi_shuttle) +"cGN" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow,/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Output"; name_tag = "Engine Output"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) +"cGO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = -25; req_one_access = list(13,11,24)},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle) +"cGP" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) "cGQ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space) "cGR" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) "cGS" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 8},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"cGT" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cGU" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGV" = (/obj/machinery/door/window/northright{name = "Xenoflora Containment"; req_access = list(47)},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"cGW" = (/obj/machinery/atmospherics/omni/filter{use_power = 0; tag_east = 1; tag_north = 0; tag_south = 4; tag_west = 2},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cGX" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) -"cGY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) -"cGZ" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cHa" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cHb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) -"cHc" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHd" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHe" = (/obj/machinery/atmospherics/binary/pump,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHf" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHg" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHh" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) -"cHi" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/engine_waste) -"cHj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) -"cHk" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/engine_waste) -"cHl" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(55)},/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access = list(55)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cHm" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGT" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 2e+006; input_attempt = 1; input_level = 100000; output_level = 200000; RCon_tag = "Engine - Core"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) +"cGU" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGV" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGW" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGX" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGY" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebotc"},/area/engineering/engine_room) +"cGZ" = (/obj/machinery/light_switch{pixel_x = 12; pixel_y = 25},/obj/machinery/power/apc/super{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHa" = (/obj/machinery/computer/shuttle_control/engineering,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/engineering{c_tag = "Engineering Shuttle Access"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cHb" = (/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) +"cHd" = (/obj/structure/grille,/obj/structure/grille,/turf/space,/area/space) +"cHe" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHf" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) +"cHh" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHi" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHj" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock"; name = "exterior access button"; pixel_x = 20; pixel_y = 20; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/maintenance/medbay) +"cHk" = (/obj/machinery/atmospherics/omni/filter{use_power = 0; tag_east = 1; tag_north = 0; tag_south = 4; tag_west = 2},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHl" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cHm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) "cHn" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) -"cHo" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cHo" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engineering/engine_room) "cHp" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) "cHq" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space) -"cHr" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHs" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) -"cHt" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cHu" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cHv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHw" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 1"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHx" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHy" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_x = -32; pixel_y = 0},/turf/space,/area/space) -"cHz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/space) -"cHA" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) -"cHB" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_waste) -"cHC" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cHD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/purple,/obj/machinery/meter{id = "wloop_atm_meter"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) -"cHE" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_waste) -"cHF" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHG" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay) -"cHH" = (/obj/machinery/atmospherics/omni/filter{use_power = 0; tag_east = 1; tag_north = 4; tag_south = 0; tag_west = 2},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHI" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) -"cHJ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cHs" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_room) +"cHt" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHv" = (/obj/machinery/atmospherics/binary/pump,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHw" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHx" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHy" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) +"cHz" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/engine_waste) +"cHA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) +"cHB" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/engine_waste) +"cHC" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera/network/medbay{c_tag = "Virology Break/Access"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cHD" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHE" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cHF" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHG" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) +"cHH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cHI" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cHJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) "cHK" = (/obj/item/stack/rods{amount = 10},/turf/space,/area/space) -"cHL" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHM" = (/obj/machinery/power/emitter{anchored = 1; id = "EngineEmitter"; state = 2},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHN" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) -"cHO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) -"cHP" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHR" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHS" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHT" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHV" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cHW" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) -"cHX" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space) -"cHY" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) -"cHZ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space) -"cIa" = (/turf/simulated/wall/r_wall,/area/engineering/engine_waste) -"cIb" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHL" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 1"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHM" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_x = -32; pixel_y = 0},/turf/space,/area/space) +"cHO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/space) +"cHP" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) +"cHQ" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_waste) +"cHR" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/purple,/obj/machinery/meter{id = "wloop_atm_meter"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) +"cHT" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_waste) +"cHU" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHV" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_smes) +"cHW" = (/obj/machinery/atmospherics/omni/filter{use_power = 0; tag_east = 1; tag_north = 4; tag_south = 0; tag_west = 2},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHX" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cHY" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHZ" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIa" = (/obj/machinery/power/emitter{anchored = 1; id = "EngineEmitter"; state = 2},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIb" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) "cIc" = (/obj/item/stack/cable_coil,/turf/space,/area/space) -"cId" = (/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cIe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engineering/engine_waste) -"cIf" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cIg" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_waste) -"cIh" = (/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cIi" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) -"cIj" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cIk" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) -"cIl" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_room) -"cIm" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/medbay) -"cIn" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_room) -"cIo" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIp" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cIq" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIr" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIs" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIt" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIv" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIw" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) -"cIx" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space) -"cIy" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIz" = (/obj/machinery/camera{c_tag = "Engineering Core West"; dir = 8; network = list("SS13","Supermatter")},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) -"cIA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{dir = 8; icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIB" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering EVA Storage"; req_one_access = list(11,24)},/turf/simulated/floor,/area/engineering/engine_eva) -"cIC" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cID" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIE" = (/obj/machinery/camera{c_tag = "Engineering Core East"; dir = 4; network = list("SS13","Supermatter")},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/meter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) -"cIF" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIG" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIH" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cII" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2"; req_access = list(45)},/turf/simulated/floor,/area/medical/surgeryprep) +"cId" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cIe" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIg" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIh" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIi" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIk" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIl" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) +"cIm" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space) +"cIn" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) +"cIo" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space) +"cIp" = (/turf/simulated/wall/r_wall,/area/engineering/engine_waste) +"cIq" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cIr" = (/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cIs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engineering/engine_waste) +"cIt" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cIu" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_waste) +"cIv" = (/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cIw" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) +"cIx" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cIy" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) +"cIz" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_room) +"cIA" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engine Monitoring Room"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) +"cIB" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_room) +"cIC" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cID" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cIE" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIF" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIG" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIH" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cII" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) "cIJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cIK" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar) "cIL" = (/turf/simulated/wall/r_wall,/area/maintenance/engi_engine) -"cIM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1"; req_access = list(45)},/turf/simulated/floor,/area/medical/surgeryprep) -"cIN" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area/space) -"cIO" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Aft Port"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cIP" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIQ" = (/obj/machinery/door/window/eastright{name = "Engineering Delivery"; req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor{icon_state = "delivery"},/area/engineering/foyer) -"cIR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIS" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) -"cIT" = (/obj/machinery/air_sensor{frequency = 1438; id_tag = "engine_sensor"; output = 63},/turf/simulated/floor/engine/nitrogen{icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) +"cIM" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_airlock) +"cIN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIO" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) +"cIP" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space) +"cIQ" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIR" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_inner"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cIS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{dir = 8; icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIT" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_inner"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cIU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cIV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cIW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cIX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/portsolar) "cIY" = (/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cIZ" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1438; icon_state = "map_injector"; id = "cooling_in"; name = "Coolant Injector"; pixel_y = 1; power_rating = 30000; use_power = 1; volume_rate = 700},/turf/simulated/floor/engine/nitrogen{icon_state = "warnplatecorner"; name = "plating"},/area/engineering/engine_room) +"cIZ" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1379; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Mixing Room Exterior Airlock"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cJa" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/portsolar) "cJb" = (/obj/structure/closet/wardrobe/black,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engi_engine) "cJc" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cJd" = (/obj/machinery/atmospherics/unary/vent_pump/engine{dir = 1; external_pressure_bound = 100; external_pressure_bound_default = 0; frequency = 1438; icon_state = "map_vent_in"; id_tag = "cooling_out"; initialize_directions = 1; use_power = 1; pressure_checks = 1; pressure_checks_default = 1; pump_direction = 0},/turf/simulated/floor/engine/nitrogen{dir = 1; icon_state = "warnplatecorner"; name = "plating"},/area/engineering/engine_room) +"cJd" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) "cJe" = (/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJf" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cJh" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJi" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) -"cJj" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJk" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJl" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJm" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_room) -"cJn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJo" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/engine/nitrogen{icon_state = "gcircuit"; name = "floor"},/area/engineering/engine_room) -"cJp" = (/turf/simulated/floor/engine/nitrogen{dir = 4; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) -"cJq" = (/turf/simulated/floor/engine/nitrogen{dir = 8; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) -"cJr" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJs" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJu" = (/turf/simulated/floor/engine/nitrogen,/area/engineering/engine_room) -"cJv" = (/obj/machinery/camera{c_tag = "Engineering Core South"; dir = 1; network = list("SS13","Supermatter")},/turf/simulated/floor/engine/nitrogen{dir = 8; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) -"cJw" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJx" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) -"cJy" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 2"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJz" = (/obj/machinery/door/window/eastright{name = "Engineering Reception Desk"; req_one_access = list(10,24)},/obj/machinery/light,/turf/simulated/floor,/area/engineering/foyer) -"cJA" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(10,24)},/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) -"cJB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Virology Access"; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/virologyaccess) -"cJC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) +"cJh" = (/obj/structure/closet/radiation,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/engine{c_tag = "Engine Airlock"},/turf/simulated/floor,/area/engineering/engine_airlock) +"cJi" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJj" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJk" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJl" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "engineering_dock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "engineering_dock_airlock"; pixel_x = -25; pixel_y = 0; req_one_access = list(13,11,24); tag_airpump = "engineering_dock_pump"; tag_chamber_sensor = "engineering_dock_sensor"; tag_exterior_door = "engineering_dock_outer"; tag_interior_door = "engineering_dock_inner"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/engi_shuttle) +"cJm" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area/space) +"cJn" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Aft Port"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cJo" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJp" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = -10},/turf/simulated/floor,/area/engineering/engine_smes) +"cJq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJr" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) +"cJs" = (/obj/machinery/air_sensor{frequency = 1438; id_tag = "engine_sensor"; output = 63},/turf/simulated/floor/engine/nitrogen{icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) +"cJt" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1438; icon_state = "map_injector"; id = "cooling_in"; name = "Coolant Injector"; pixel_y = 1; power_rating = 30000; use_power = 1; volume_rate = 700},/turf/simulated/floor/engine/nitrogen{icon_state = "warnplatecorner"; name = "plating"},/area/engineering/engine_room) +"cJu" = (/obj/machinery/atmospherics/unary/vent_pump/engine{dir = 1; external_pressure_bound = 100; external_pressure_bound_default = 0; frequency = 1438; icon_state = "map_vent_in"; id_tag = "cooling_out"; initialize_directions = 1; use_power = 1; pressure_checks = 1; pressure_checks_default = 1; pump_direction = 0},/turf/simulated/floor/engine/nitrogen{dir = 1; icon_state = "warnplatecorner"; name = "plating"},/area/engineering/engine_room) +"cJv" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJw" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cJx" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJy" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJz" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/light_switch{pixel_x = -27; pixel_y = 0},/obj/machinery/airlock_sensor/airlock_exterior{id_tag = "eng_al_ext_snsr"; layer = 3.3; master_tag = "engine_room_airlock"; pixel_y = -22; req_access = list(10)},/obj/structure/table,/obj/item/weapon/book/manual/supermatter_engine,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/engineering/engine_airlock) +"cJA" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "engineering_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "engineering_dock_sensor"; pixel_x = -25; pixel_y = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/engi_shuttle) +"cJB" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/electrical,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/camera/network/engineering{c_tag = "Engineering Drone Fabrication"; dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cJC" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering/engine_monitoring) "cJD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cJE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cJF" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access = list(13); tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cJF" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1379; icon_state = "door_closed"; id_tag = "engine_airlock_exterior"; locked = 0; name = "Engine Airlock Exterior"; req_access = list(10)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/engineering/engine_airlock) "cJG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/engi_engine) "cJH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cJL" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJM" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJN" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJO" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJP" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineVent"; name = "Reactor Vent"; p_open = 0},/turf/simulated/floor/engine,/area/engineering/engine_room) -"cJQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EJECTION/VENTING PORT'."; name = "\improper EJECTION/VENTING PORT"; pixel_y = 32},/turf/space,/area/space) +"cJL" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJM" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_room) +"cJN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJO" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/engine/nitrogen{icon_state = "gcircuit"; name = "floor"},/area/engineering/engine_room) +"cJP" = (/turf/simulated/floor/engine/nitrogen{dir = 4; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) +"cJQ" = (/turf/simulated/floor/engine/nitrogen{dir = 8; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) "cJR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cJS" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/portsolar) "cJT" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cJU" = (/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cJV" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engi_engine) +"cJU" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_outer"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"cJV" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_outer"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cJW" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJX" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJY" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cJZ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) -"cKa" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area/space) -"cKb" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/space,/area/space) -"cKc" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Locker Room"; req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/locker_room) -"cKd" = (/obj/machinery/door/airlock/maintenance{name = "Engineering EVA Storage Maintainance"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/engine_eva) -"cKe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay) +"cJZ" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKa" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKc" = (/turf/simulated/floor/engine/nitrogen,/area/engineering/engine_room) +"cKd" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -8; req_one_access = list(13,11,24)},/turf/space,/area/space) +"cKe" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) "cKf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) "cKg" = (/turf/simulated/wall,/area/maintenance/engi_engine) "cKh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cKi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cKj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cKk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cKk" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) "cKl" = (/turf/space,/area/syndicate_station/southeast) -"cKm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1"; req_access = list(45)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/medical/surgeryprep) +"cKm" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 2"},/turf/simulated/floor/plating,/area/engineering/engine_room) "cKn" = (/turf/space,/area/syndicate_station/south) -"cKo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2"; req_access = list(45)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/medical/surgeryprep) -"cKp" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cKq" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cKo" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/engineering) +"cKp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/engine{c_tag = "Engineering SMES"; dir = 8},/turf/simulated/floor,/area/engineering/engine_smes) +"cKq" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera/network/engine{c_tag = "Engine Monitoring Room"; dir = 4},/turf/simulated/floor,/area/engineering/engine_monitoring) "cKr" = (/obj/machinery/power/solar{id = "auxsolarnorth"; name = "Fore Solar Array"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/fore) -"cKs" = (/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Xenobiology Internal Airlock"; req_access = list(55)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cKt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"cKu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cKv" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cKw" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering) -"cKx" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10,24)},/turf/simulated/floor,/area/engineering) -"cKy" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Workshop"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) -"cKz" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor,/area/maintenance/atmos_control) +"cKs" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKt" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKu" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKv" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKw" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineVent"; name = "Reactor Vent"; p_open = 0},/turf/simulated/floor/engine,/area/engineering/engine_room) +"cKx" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EJECTION/VENTING PORT'."; name = "\improper EJECTION/VENTING PORT"; pixel_y = 32},/turf/space,/area/space) +"cKy" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) +"cKz" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area/space) "cKA" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/space,/area/space) -"cKB" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/space,/area/space) -"cKC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor,/area/maintenance/atmos_control) -"cKD" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor,/area/engineering/atmos) -"cKE" = (/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cKF" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Monitoring Room"; req_access = list(11)},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"cKG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/plating/airless,/area/space) -"cKH" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cKI" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = 8; pixel_y = -28; req_access = list(55)},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/rnd/xenobiology) -"cKJ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cKK" = (/turf/space,/area/skipjack_station/southwest_solars) -"cKL" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access = list(10)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cKM" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/portsolar) -"cKN" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cKO" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cKP" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cKQ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cKR" = (/obj/machinery/door_control{id = "EngineVent"; name = "Reactor Ventillatory Control"; pixel_x = -25; pixel_y = 0; req_access = list(10)},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Engine Waste Handling"; req_one_access = list(10,24)},/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cKT" = (/obj/machinery/door_control{desc = "A remote control-switch for the engine radiator viewport shutters."; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutters"; pixel_x = 25; pixel_y = 0; req_access = list(10)},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKU" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKV" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKW" = (/obj/machinery/door_control{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = 5; pixel_y = -25; req_access = list(10)},/obj/machinery/door_control{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -5; pixel_y = -25; req_access = list(10)},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) +"cKB" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) +"cKC" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area/space) +"cKD" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = 0; pixel_y = -3; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -6; pixel_y = 7; req_access = list(10)},/obj/machinery/button/remote/emitter{desc = "A remote control-switch for the engine emitter."; id = "EngineEmitter"; name = "Engine Emitter"; pixel_x = 6; pixel_y = 7; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_monitoring) +"cKE" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/constructionsite/station) +"cKF" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/constructionsite/station) +"cKG" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cKH" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cKI" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/constructionsite/station) +"cKJ" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Carbon Dioxide"; dir = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cKK" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Phoron"; dir = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cKL" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Nitrous Oxide"; dir = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cKM" = (/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Gas Mixing"; dir = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cKN" = (/obj/machinery/power/terminal{dir = 8},/obj/machinery/light,/obj/machinery/button/remote/airlock{id = "engine_electrical_maintenance"; name = "Door Bolt Control"; pixel_x = 5; pixel_y = -25; req_access = list(10); specialfunctions = 4},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engineering/engine_smes) +"cKO" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) +"cKP" = (/turf/simulated/shuttle/wall,/area/shuttle/constructionsite/station) +"cKQ" = (/turf/simulated/shuttle/wall{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/area/shuttle/constructionsite/station) +"cKR" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) +"cKS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cKT" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"cKU" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "engineering_shuttle"; pixel_x = 0; pixel_y = 25; req_one_access = list(13,11,24); tag_door = "engineering_shuttle_hatch"},/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"cKV" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/constructionsite/station) +"cKW" = (/obj/machinery/door/airlock/maintenance{name = "Drone Fabrication/Engine Waste Handling"; req_one_access = list(10,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cKX" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_electrical_maintenance"; locked = 1; name = "Electrical Maintenance"; req_access = list(10)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKY" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1379; icon_state = "door_closed"; id_tag = "engine_airlock_interior"; locked = 0; name = "Engine Airlock Interior"; req_access = list(10)},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKZ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) +"cLa" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cLb" = (/obj/machinery/computer/shuttle_control/engineering,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"cLc" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"cLd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cLe" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/camera/network/engine{c_tag = "Engine Waste Handling"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engineering/engine_waste) +"cLf" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineEmitterPortWest"; name = "Engine Room Blast Doors"; pixel_x = 0; pixel_y = 25; req_access = list(10)},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_room) +"cLg" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/machinery/alarm/nobreach{dir = 2; pixel_y = 22},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) +"cLh" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access = list(10)},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cLi" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) +"cLj" = (/obj/structure/cable,/obj/machinery/power/smes/buildable/power_shuttle,/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cLk" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) +"cLl" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"; dir = 2},/area/shuttle/constructionsite/station) +"cLm" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_one_access = list(10,24)},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) +"cLn" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/constructionsite/station) +"cLo" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/constructionsite/station) +"cLp" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_one_access = list(10,24)},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) +"cLq" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_one_access = list(10,24)},/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) +"cLr" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = 5; pixel_y = -25; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -5; pixel_y = -25; req_access = list(10)},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) +"cLs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Engine Waste Handling"; req_one_access = list(10,24)},/turf/simulated/floor/plating,/area/maintenance/engi_engine) +"cLt" = (/obj/machinery/camera/network/engine{c_tag = "Engine Core West"; dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) +"cLu" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cLv" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cLw" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/meter,/obj/machinery/camera/network/engine{c_tag = "Engine Core East"; dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cLx" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine radiator viewport shutters."; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutters"; pixel_x = 25; pixel_y = 0; req_access = list(10)},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cLy" = (/obj/machinery/button/remote/blast_door{id = "EngineVent"; name = "Reactor Ventillatory Control"; pixel_x = -25; pixel_y = 0; req_access = list(10)},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cLz" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cLA" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port) +"cLB" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cLC" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "robotics_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "robotics_solar_pump"; tag_exterior_door = "robotics_solar_outer"; frequency = 1379; id_tag = "robotics_solar_airlock"; tag_interior_door = "robotics_solar_inner"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "robotics_solar_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "robotics_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cLD" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; layer = 3.3; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/portsolar) +"cLE" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access = list(10)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cLF" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Aft Port"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cLG" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Aft Port Access"; dir = 1},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engi_engine) +"cLH" = (/obj/machinery/camera/network/engine{c_tag = "Engine Core South"; dir = 1},/turf/simulated/floor/engine/nitrogen{dir = 8; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) +"cLI" = (/turf/space,/area/skipjack_station/southwest_solars) +"cLJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cLK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cLL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cLM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cLN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cLO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cLP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cLQ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) +"cLR" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/porta_turret,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7392,165 +7439,165 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaaaaaaaauaaaaaaaaaaauaaaaaaaaaaaaaaaaauaaaaaaaaaaauaaaaaaaauaaaaaaaaaaaaaaaaamaaacKraawaavaaacKraawaavaaacKraawaavaafaafaamaaaaaaaaaaaaaaaaafaafaahaaxaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaayaayaayaayaayaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaauaauaauaauaaaaaaaaaaacaaaaamaaacKraazaavaaacKraazaavaaacKraazaavaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaAaaBaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaaCaaDaaEaaDaaEaaDaaFaayaayaaGaaHaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaaIaafcKraazaavaaacKraazaavaafcKraazaavaafaaaaaaaafaafaaJaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaKaaLaafaayaaMaaNaaNaaNaaNaaNaaOaaPaaQaaRaaSaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaacKraazaavaafcKraazaavaaacKraazaavaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaabhabhabhabhabhabhabhaafaaaaayaaUaaVaofaaVaaEaaVaaWaaXaaYaaZabaaayabbabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaaacKraazaavaafcKraazaavaaacKraazaavaafaaaaaaaacaaaaafaafabcabdabdabdabdabeabfaaaaaaabhabvabvaojabvabvabhaaaaafaayabiabjaaXabjaaXabjaaXaayablaaZaosaayabnaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafapsaafaafaafapsaafaaaaafapsaafaaaaaaaaaaaaaaaabqabrabsabtabuabzabwabxabfaafaaaabhabBabAaceabCacfabhaaaaaaabDabEabFabGabHaaEabFaaEabIabJabKabLamxabNabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaIaafaqMaqbapTaqTaqTaqTaqTaqTaqTaqTaqTaqTaqTaqTaqTarBaqbaqbaoeamMamHamWamUacaacbamyacdaaTaaTaaTabhabhacgankacAabhabhachaciacjackaclacmacnacmacoackackackanPacqacracsactaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaaLaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafapjaafaaaaafapjaafaaaaafapjaafaaaaaaaaaaaaaaaabqabracvacwacxacyabdaczaaTaaTalPalxamtalZacEacFaaTaaTacGacHacIadnacKacLacMacNacOacPacQacQacRacSacracsabbabbabbabbabbabbaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaafcKrapgaavaaacKrapgaavaaacKrapgaavaafaaaaaaaaaaaaaafaafacUabdabdabdabdacVaaTamuacXacXacXacXacEacXacYaoZadaacQadbadcaddadeacMadqacQacQacQacQadgadhackadiadjabbadkadladmabbaaLaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaacKrapgaavaafcKrapgaavaaacKrapgaavaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabfacVaaTalnadoadpadFadzadsadtaduaoZadaacQadvadcaddadwadxadyacQadMadMadMaddadAacradBadlalaadladladlalaaaLaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaaacKrapgaavaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadDadEaaTalqacXacXacXacXacEacXalvaoZadaacQadvadHadIadJalradLadUadNadNadNadVadPacradQadlabbadRadSadlabbaaLaaLaafaaaaafaaaaaLaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaafcKrapgaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadEaaTaaTarSarPadWadXacEadXaaTaaTasnacQadbacQaddadZaeaadyadUadNaebadNaetaedacradQaeeabbabbabbabbabbaaLaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafcKrarDaavaaacKrarDaavaaacKrarDaavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegaaTaaTaaTaaTaaTaaTasOaaTaaTaaTaeiaejaekaelaemaenasBaepaeMaeraesaerafAaeuacradBaevabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEaexaeyarzaaTaeAaeBaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLafBaeLaeNaeOarCaeQaeRabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauabgaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaeTaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadEaeUaeVaeWaaTaeAaeAaeXaeYaeZaeFafaafbafcafdaddarOaffafgacQacQafhacQafiafjacrafkaflabbafmafnafoafoafpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadEafqafrafsaaTaftafuafvafwafxappafzafNafOafNafCafDadxafEafFacQafhacQafGapdaqqafJafKaqJadlapHaghaqgafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUafVafWafXafYafZafZafZafZafZafZagaagbagcagbaaTageagdagfarvarnaeFagiagjagkaglagmagnagoagpagqagrarjagtaguagpagvagwaryabbadlagyafoafoagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfagAagBafZafZafZafYafYafZagCagDagDagDagDagDagDagDagDagDagDaoGaaTagFagGaoCagIagJaeFahNagLagLagLaddagMagNagOagPagQagRagQagPagSagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUagVagWagWagWagWagWagWagWagDagXagYagZagWahaahbahcahdaheahfahgahhahiahjahkahmahlahnahnahnahnaddahoahpahqahrahsahQahuahvahwagvahxahyaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkaaaaaaabkaaaaaaaaaabkaaaaaaaaaaaaaaaabkaaaaaaaaaabkaaaaaaabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRahAabfahBadEagWahCahDahEahFahGahHagDagZahIahFaezahKahLahLahMaiiahOaePacXacXacEacXaikaeoahSacQacQacQaddahTahUahVahWaeqahYahZaiaaibagvahxaicabOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkabkabkabkaaaaaaaaaabkabkabkabkabkabkabkaaaaaaaaaabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadDaidaieaifabfaigadEagWaihaimaijaipailaisagDagZahIainagWaioahLaizaiqahKahOairaiFacXaitacXacXaiuacZahSacQacQaddaiwaixaiyagPagPajeagPagPaiAagvaiBaiCactaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkabkabkabkaaaaaaabkabkabkabkabkabkabkabkabkaaaaaaabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiEakfaiGaiHaiIahFagDaiJaiKaiLagWaiMaiNaiOaiOaiPaiQaiRaiSaiTacEaiUaiVaeFaiWaiXaiYaiZakNakEajcajdakVajfajgajhagPajiagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaabkabkabkabkaaaaaaabkabkabkabkabkabkabkabkabkaaaaaaabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfadrabfabfajkajlagWagWadGagWagWadCagWagWagWadOagWagWajpajsadKantaecajuagWajvajwadYajyajqagWagWajzaehaefagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafYajFafYajGajHadfajJajKajLajMajNajOajPajQajRajSajTajUajVajWajXajUajYajWajWajZakaakaakbakcakdahOakeajbakgajzakhakiakjakkaklakmaknakoakpacWakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabQaafaaIaaaaaaaaaaaaaaaaaaaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWaksaktakuakvakwakxakyakzacDakBakCakDakXakFakwakGakwakwakHakIakJakKakLakMajaakOakPakJakQacJakSakTakUalbakWalCakYakoalIabbalOamaactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaabpaaaaaaaaaaaIaaIaamaamaamaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalcaldalealfagWalgalhahLalialjagWacTacCacTagWabVacBabUagWalpacpacualsagDaltaluaccalwabZagWabTabSabSabRagWalBamcalDalEalFalGalHakoabXanQabYanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEabyalMalMalNamsabmalQalRahKalSaljagWalTalUalValWalXalYabWabPahKambahKamNamdameameamfamgamhamiamjamkamlammakoamnamoampamqalDalDamrakoadQanQamvawKamwaaaaaaaaLaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaaoXaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamAamBamCamDagWamEalRaljamFamGagWamRamIamJalWamKamLakAakRamOamPamQanaamSamgamgamfamgamTaoWamVanfamXanhakoamZanWalDamqalDalDanbakoancandaneaocangaafaaLaafaafaaLaafaafaafakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfajBagWagWagWagWanlanmannanoanmanmanmanmanpaoPanpanraoQajAaoRanvaoSaoTaoUanzanAamgamgamfanBanCamianDanEamXanFanGanHanIanJanKanLanManNanGanOajIapqanRanSaaaaaaaafaaaaafaaLaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYanZaoaagDaobapDagWaodajoalKaogaohaoibqKaokaolaomaonaooaonaopaoqaoraonaoOaotamgamgaouaovaowamiaoxanEamXaoyanGaozaoAaoBajraoDaoEaoFanGajxanQanQanQanQaoIaoJaoHaoLajtaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalJaaaaaaaaaaafaaaaaaaaaaamaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaacaaaaaaaaaanXanXapaapbagDalMapcajjapeapfahXaphapiaoMaonaonapkaplaonapmapnaoraonapoaonaoNapEapramgamfamgamTajmamYanEamXaptanGapuapvapwapxapyapzapAanGapBaoHapCapLapGapFapPaoHaoHajnaoHaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapUapMagWalgapNalKapOapVapQapRaokapSaqmaqcaqpapWapXapYapZaqaanUaqNaqdaovaqeaovaqfahPaqhaqiaqjaqkanGaqlaqWapyaqnaqoarlaqoahRaqraqsapFaqtaquapFaqvaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWaqCalRagWalWalWalWaqDaqEapkaqFaqGaqHaonaqIahzaqKaqLanyarMaqOaqPaqQaqRaqSanxaqUaqVarQamVanGaqXaqYaqZaraarbarcardanGarearfapFaqtaqtapFargaoHarhariahJaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaabgaaaabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarkaqBagDaobarZagWarmaggalKaogaroaoiaokarparqarrarsartaonarualWagxarwarxalLagsarAagKamzagHarEarFarGarHamjanGanGarIanGanGanGanGanGanGarJarKarLasaasaapFarNaoHaoHahtaoHaoHaaaaaaakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLafLaaLaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzasbaqBagDarRapcafyarTarUafeapharWaloaonaonarYasFasyasMaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslafIafHasoasoaspaspasqasrassastastasuasvasvaswasxafMaszaqsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaabkabkabkabkabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAaSZasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCasbapbagDapUapMagWasDasEalKapOasPaoiasGasGasHasIaonasJaonasKalWasLatgaSHathatiarAasQasRasSarEasTasUasUasVaRxasVaSoaStasZasZasZasZasZasZasZasZasZasmataatbatcaoKatdateatfaaaaafatPatratjatjatjatjatQatjatjatjatjatUaafaaaaaaaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaabkabkabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatWatqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHatIatJatKatLatMatNatOatPatPatPatPatPatPatPatPatPatPatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaabkabkabkabkabkabkabkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatSatTaUjatTatSatVaUlatVatSaafatqaVfatYaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatZauaanYaubaucanXaafaafalWaudaueaufaugauhaTPaonapnaonasJaqEaujaukaulauvaunauKauparAauqaurausarEatBasZauLaySauMatCauxauyatFatGauzauAauBauCauDatMatNauEauFauGauHauIauHauJauwauOauPaxsatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaaaaafaaaaafaafaaaaaabepaaaaaaaafaaaaaaaafaaaaaIaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTavmatTauNatVavyatVauNauQauRaVIauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWavbavzaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZavAavoavJatCawravqatFatGauzauAavravsavtatMatNavuavvauGauHauHauHauJavwavQawfavVatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBaLiavDauNavEaLeavGauNavHavIaKYavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaLmaLkavSaMcaMwaLYavWavXanXaaaaaaalWalWalWavYavZawaalWawbawcawdaweawpawgaukawhawxautawyawlarAawmauraMEarEatBasZawzawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNawvawwauGauHauHauHauJawAavxawfaykatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaKXaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaaaOpaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPaLkawQawRaMwawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawBaxjawCatCaxVavnaxdaxcaxfaxeaxhaxgaxhaxiaxkaxlaxmaxnaxoaxoaxoaxnaxmavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaazoaMXazoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNaQcaxxatSauNaOsaxxatSauNaOHauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaQxaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaxGaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaQdaxPaxQaxRaQdavpasZaxSawjcfSatCaxVaxXaxXaxXaxZaxYayaawLaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaOqaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoayqayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaRrayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaQAayLayMayLayLayLarAayOayPayQarEaAiasZcfSaycaxUatCayUayTayWaxpayYayXayYaxqayTazaazbazcazdazeazdazdazfaxraxuaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaQyaBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwbhJauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEbguazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTbgMazVazWazXazYazZaAabheazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXayiayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwbhKaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGbhLaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawzaAgaAhaBbayRaBdaBeazhaBgaBhaBiaBjaBjbhNaBjatPaBlaBmaBnaBoaBpaBraxvaziazkazjatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaCvazlaDAaDBaCvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaBEaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaBOaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaCeaCfaCgaChaCfaCiaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPbhSatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaAraCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaCHaCIaAsaAFaCKbitaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbbiqayLayLayLarAaAdayPayQarEaAiasZaAtaBcauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaDnaDoaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaBaatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbiDaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaxAaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFaWoaDZaCMaEaaEbaEcaEdaEeaEfaEgaEhaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaWwaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaWFaEKaENaEOaBjaEPaEQaERaXIaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtaCpaBQaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaFhaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkaFlaFlaFmaFnaFoaFpaFqaFlaFlaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaYqavHaFuaXXaFxaCJaFzaDraYwaFJaFKaFLaFLaFLaDtaFLaFLaFNaFOaCMaaaaBYaDuaElaFQaEnaFRaBYaaaazJazOazPaFSaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYaYAazTaGaarAaGbaGcaGdarEaAiaDeaYyaDvaCoaDeaEVaDzaYxaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaGqaDpaYVbaNaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGbaPaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraGIaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPayuaBLaGPaFAaGRaGSaGTaGUaCEaFBaFDaFCaFCaFCbazbbhaFCaHcaFLaFLaFLaFLaFLaFLaFLaFNaHdaCMaafaBYaHeaHfaHgaHhaHiaBYaafazJazOazPaHjaFPaFUaHlaHmazPaHnaHoayLaHpazTaARaHqaATaHrazTaCfaFYaHsazTaHtarAaHuaHvaHwarEaGubbfaEUaGvaDwbaYaGzaGjatEaHCaHDaBjaHEaBjaHFaBjaHGaBjaHHaGpbcTaDpbcabcPaHLaHMaHMaHNaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaHQaHVaDsaDsaDsaDCaGBaGAaGCaGCaGLaGJaDCaDCbbPaDCaIdaIeaIfaIgaGFbbQaGFaIiaIjaIkaIlbinbbRaIoaIpaIqbbSaIsbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGMaGNaGOaDPaFFaIAaIAbeaaICbdQaICaIAaIAaIEaIFaFCaGQaFHaGWaHkaFCaIKaILaIMaFLaFLaHRaFLaIOaIPaIKaCMaaaaBYaBYaIQaHSaIQaBYaBYaaaazJazOazPaISaITaIUaFTaIVazPaIWaIXayLaIYazTbeMaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbbeeaCuaCuaCuaCuaCuaHUaHTaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpbfyaJtaGsaGsaDqaJvaDsaDsbeNaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHXaHWaIabfxaIraIbaIbaIbaIRaINaIgaJIaJJaJjaJkaJMaJNaIgaJOaJPaGFaJQaJAaJSaJTbinaJUaIoaJVaJBaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaIzaIHaIGaIJaAbaJZaJYaJGaKaaFCaIKaKmaKnaKoaKpaIKaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPaKxaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaKHaKIaKJaKKaKLaJeaEDaKNaKOaKPaEEaKRaaaaaaaJlaKSaJKazUaJlaKVaJnaJnaJnaKWaJnaJnaJnaBjaDpazFaDpaDpaDpaDpazBaDpaKZaLaaLbaLcaLdazpaLfaLgaLhaLfaLfaLfaLfaLfazgaLfaLfaLfaLfaLfaLfaLfaLfaJLaIgaLjaJRaLlaEFaJWaLoaIgaLpaKbaGFaLraLsaLtaJTayNaJUaIoaJVaIoaKTaLwaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkaFlaFlaFlaLAaFlaFlaLBaFlaFlaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuayzaKuaKuaLZaMaaLZaJeaJeaMbaxyaJeaJeaJeaJeaMdaMeaxCaxOaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaLnaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaMvawMaLvaMyaMfaKZaMAaMBaMCaMCaMDaLfaxwaMFaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJLaIgaMPaMgaMRaMSaMqaMUaIgaMVaMWawoaMYaMraNaaNbaGFaGGaNcaJVaIoaMxaNeaNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaMzaMzaNkaMzaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNAaNBaNzaNCaNzaNzaNzaNzaNDaNEaNFaNGaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaNPaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMTaMQaOhaOiaOjaOkaOlaOmaOnaJlaOoaCLaCDaOraOtaOtaOuaMZaOwaNdaKZaOyaOzaOAaOAaOBaLfaOCaODaOEaOEaOEaOEaOFaOGaCtaOIaOJaOKaOKaOLaOMaLfaJLaIgaONaOOaNjaOfaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaAHaQbaQbaAvaQeaQfaQgaKZaQhaMCaQiaQjaQkaLfaQlaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJLaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaBwaGFaIoaIoaJVaIoaBkaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaQEaQFaQGaGOaQCaQHaQIaBIaQJaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaQTaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaRbaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZatXaLfaRyaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJLaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaGfaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaPiaPiaNkaPiaNlaIAaSmaNnaSnaIAaLKaLKasXaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKasYaLKaNraQPaSuaSvaSwaSxaNraSyaLKaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaQqaQaaQaaQaaQaaQaaQaaSQaSRaSSaSTaSUaSVaSWaSXaSYaKZaKZasWaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJLaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDauSaNXavTavUawiaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAavRaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeaUfaUgaUhaUeaUiaLKaLKawnaLKaLKaLKaLKaUkawkaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaUxaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaUJaUKaULaUMaUNaUOaUPaUQaURaUSaUTaTfaUUaUVaRCaUXaUYaUZaVaaVbaTeaJLaIgaVcaVcaRLaRMaVdaVdaVeaIgaIgavFaIgaGGaVgaVhaViaViaViaVjaVkaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDauScmVaVravCaDPaVsaVsaVtaVsaVsaVsaVDaVsaVsaVtaVsaVsaYEaWYaVuaVvaKdaKdaKdaKdaKdaVwaVxaVyaVzaIAaTQaTQaVAaTSaVBaTUaTUaTUaTUaTUaTYaVCaTUaTUaTUaUdaUeclraVEaVFaUeaUiaVGaVHaKeaKcaVKaUmaVLaVMaVNaVOaVPaVQaMkaSzaKOaUoaaaaaaaaaaaaaUpaUpaUpaUpaVRaSlaVTaXEaVVaSDaVXaXFaVZaSOaWbaUpaUpaUpaUpaaaaaaaaaaaaaUAaSNaRqaRpaWcaSSaSPaWeaTkaSSaTsaUWaWiaVSaWkaVWaWmaWnaQbauiaWpaWqaWraWsaWtaWtaWuaWvauoaWaaWyaWdaWAaWBaWCaWDaWEaTeaJLaIgaThaONaRLaRMaONaONaONauuaWGaONaWHaGGaWIaWJaToaToaToaTqaIoaYsaGGaWfaVoaLuaWQaVoaWRaWSaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTGaGgaTHaGiaBIaBIaBIaWVaWWaWWaWWaWWaWWaWWaWWaWXaBIaBLcpSaWZaIAaXcaXbaXbaXbaYraXdaIAaIAaIAaIAaTQaXeaXfaTSaXgaTUaTUaWgaXiaXjaXkaWgaTUaTUaTUaXlaUeaXmaXnaXoaUeaUiaVGaXpaKfaXraXsaUmaXtaVPaXuaXvaXwaXxaMkaSzaKOaMmaSCaMbaXyaUpaUpaVYaXAaXzaXCaXDaXDaXEaXFaXGaXEaXFaXDaXDaXHaGxaXJaXBaUpaUpaXyaJlaXLaXMaSNaRqaRpaJlaXNaSPaXOaTkaSSaXPaXQaSSaWhaXSaTkaSSaXTaOtaXUaXVaUQaXWaHYaXYaXZaYaaYbaYcaYdaYeaWjaYgaWBaYhaWDaYiaTeaJLaIgaYjaYjaRLaRMaWlaONaONaYlaONaWzaWxaGGaIoaXRaXhaToaYfaYkaZXaWLbaOaYmaWOaZcaVoaYvaHIaGVaGHaYzaHJaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGkaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafaYCaYDcpKaYFaWPaYHaYHaYIaYJaYKaYLaYMaYNaYOaYPaYQaYRaYSaTSaYTaTUaTUaWgaXjaYUbbTaWgaTUaTUaYWaUdaUeaUeaUeaUeaUeaUiaVGaVGaVGaVGaVGaUmaYYaXvaYZaXvaXvaXxaMkaSzaKOaNSaNSaZaaZbaWNaUpaZdaYnaZfaZgaZfaZfaZfaZfaZhaZfaZfaZfaZfaZfaZfaYoaZjaUpaWMaZbaZlaZmaZnaSNaRqaRpaWcaSSaSSaSSaSSaSSaXPaZoaSSaWhaZpaTkaSSaXTaOtaZqaXVaUQaZraZsaZtaZuaYaaYpaZwaYdaYeaWjaYgaWBaYhaZxaZyaZzaGraZzaZzaZzaZBaZCaZDaYtaOOaZFaZGaZHaZIaGGaZJaYXaYGaToaZeaYGaIoaIoaXaaZiaVoaYuaVoaZNaZOaZPaZQaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaZSaZTaZUbjnaZWaSFaZYaZkbaaaZvbacbadbaebafaYObagbahbaibajaTSbakbalbambanbaobapbaqbarbarbarbasbataTSbaubavbawbaxaKgbajbnZaKhbajbaCaUmbaDbaEbaFbaGbaHbaIaMkbaJbaKaMkbaLbaMaJHbcyaKjbaQbaRbaQbaSbaTbaUbaVbaWbaXaKlbaZbbabbbbbcbaQbbdbbeaKQbeoaKMbbibbjbbkbblbbmbbnaJlaUDaSPbboaTkaSSaZAaZEbbraZKaXOaTkaSSaXTbbtaULaXVbbubbvbbwaUQaUQaYabbxbbybbzbbAbbBaYgaWBbbCaWDbbDaZzaZLbbFbbFbbGbbHbbIaRLaRLaRLaRLaRLaRLaRLaGGbbJaXRaXhaToaYfaXhaIobbKaGGbbLaVoaYuaVoaZNbbMbbNbbOaafaKUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaIIaIZaIDaInbbUaSFbaabaabaabaabaabbVbaabbWaYObbXbbYbaibbZbbZbbZbbZaIhbbZbcbaTUbccbcdbcebcebcfbcgaTSaXebchbcibcjaKiaIcblcaKkbcobcobcpbcpbcpbcpbcpbcqaMbbcrbcsbctbcubcvbcwbcxbbgaUpbczbcAbcBbaBaUpaUpaUpaUpaUpbcDaUpaUpaUpbcCbcFbcGbczaUpbbgbcxbcHbcIbcJbcKbcLaRpaWcaSSaSSaSSaSSaSSaGpbcMaSSbcNaSSbcObcObcObcOaJwbcQbcRbcSaUQaUQaUQaJsbcUaTeaZMbcWbcXaYgaWBaYhaWDbcYaZzaZZbdabdbbdcbddbdebddbddbddbddbddbdfbdgbdhbdibdjbdkbdlbdmbdnbdobdpbdqbdraVoaYubdsaZNaVobdtbbOaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaYHbabbaaaZvbdzbbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZbdHbdIbdJaTSbdKbdLbdMbdNaTSaXebdObdPbdPaDQbdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXaJeaJeaJebdYbdYbdYbdZaDxbdZbdYbebbebbebbebbebbecbebbebbebbedbedaDybedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbekbelbcObcObembenaZzaZzaZzaDYaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbeBbbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafaEvaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaDfbeObePbeQbeRaRtaYHbeTbeUaDcbdzbbVbeVbeWaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbdKbdLbdMbfdaTSaXebdObdPbfebffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctaJebfnbfobfpbfqbfrbfsbftbfubdYbebbfvbfwaSEbcZbfzbfAbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbfWbfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYOaEMaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbdKbdLbdMbfdaTSaXebdObdPbgBbgCbgDbfgbgDbdPbfibgEbgFbgGbgHbgIbgJaMbbgKbgLbctaWKbgNbgObgPbexbexbgRbgSbgTbdYbebbgUbgVbgWbgXbfvbgYbezbebbedbhabhbbhcbeCaESbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhCbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIaFZaFIaFGbhMaFEaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaafbhPaYDbhQbhRaECbhTbhTbhTbhTbhTbhUbhVbhWbhXbhYbhZbgwbbZbbZbbZbiabfabbZaTSaTSaTSaTSbdKbibbicbidaTSbiebifbdPbigbihbiibgDbijbdPbfibikbgFbgGbgGbgGbilaMbbimaSzbctaSIbiobipbfjbirbisbfBbiubivbdYbebbiwbixbiybiybiybgYbgebebbedbiAbiBbiCbgQbiEbgZbiGbiHaJibiIbiJbiKbiLbiMbiNbiObiObiPbiQbiRbiSbiSbiSbiTbiSbiSbiSbiSbiSbiUbiVbiVbiVbiWbiObiObiNbiObiObiXbiVbiVbiYbiSbiZbjabjbbiSbjcbiObiObiObiObiObiObiObiObiObiObiObiObiObjdbiTbjebiSbjfbjgbjhbjibjibjjbjkaZNaWRbjlaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbZCbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZbjubjvbjuaTSaTSaTSaTSbZLaTSbjxbdObdPbjybjzbgDbjAbjBbdPbfibfmbjCbgGbgGbgGbjDaMbbjEaSzbctcdNcbjbgObhdbjIbjJbhfbjLbjMbdYbjNcaWbjPbiycaxbiybgVcacbjSbedbjTbjUbizbjWbjWbjWbjXbjYaJibjZbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkkbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktbkubkvbewbkpbkwbkxbkybhFbewbewbkzbewbewbkAbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGcbkbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObYabXwbZcbZibkObgrbkPbkQbkRbkRbkSbkTbkUbYobYwbYwbYHbYTbbZbbZbbZbeZbkZbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbllbfmblmbgGblnbgGbloblpblqaSzbctaJeblrblsbltblublvblwblxblybdYbebblzblAbZrbZsblDblAbiFbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbZuaZzaZzaZzaZzaZzaZzbZzaZzbewbewblVblWbjHblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbZBaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbWkbmjbmkbmkbUwbbZbdDbmmbeZbmnbbZbmobmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbXcbfgbmybmzblfbmAbfmbmBbgGbgGbjKbmDbWVblqaSzbmFbmGbmGbmGbmGbmGbmGbmGbWMbmGbdYbebbmIbmJbmKbmLbmKbmMbjQbebbedbedbmObWmbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTbXqbmVbmWbmXbmYbmZbnablBbjVbndbnebjVblEbmCbnhbnibnjbmPbmNbnmbnnbnobnpbnqbnrbnsbntbntbnubYfaVJblOblObXpblObZMbZMblObnzbnAbnBblObZtbXebZtblOblXblYbmbblObZnbXfbZnblObnGbnHbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaabUobnObnPbeQbnQbgrbnRbjpbURbnTbnUbnVbjpbUPbUqbnYbnZbUwbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbohbVmbojbgGbgGbgGbokblpblqaSzbVkbmGbombonbncbcEbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbWhboPboQboRboRboSboTboUboUboVbnlboXboYboZbpabpbbnnbpcbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbpmbpnbnybppbnCbnDbpqbpsbptboobVyblOaZzbVvbpxblObpyboqbpAbpBbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKcfBbgrbpMbpNboAbpPbpQbpRcfHcfJcfUcfUcfUcgmbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPbpZbqabqbbqcbqdbqebqfcfibqhbqibqjbqkbmAbqlbojbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborcfubxsbotaafbebbebbebbebcfjbebbebbebbebaafbedbqzboCbqAcfmbqCbqDbqEaJibqFaRqaRpaJibqGbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPcgCboYbqRbqSboNbnnbqUbqVbqWbpfbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbcgObrdbrdbrdbrebrdbrfboObrhbribrjbrkbnIbrlbpCbrmbrnbrocgDbnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtcefcescembrxbrxbrybrzbrAbgrcedbrCbpPbrDbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPcdpbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrOcdFbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabsebscbotbosbotaafbsicdYbskbslbsmbsnbskcdZbsiaafbedbspcecbspbedbedbedcebaJibssaRqaRpbXHboJbngbstbsuceCbqLbswbqNbsxceHbszbsAceKbsCbqObsDbnibsEbsFbsGceIbnnbsIbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNbsObsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabtbbtcbtdbnIbrqbpFbtebnMaaaaaaaaaaaaaafaafaafaafaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgccJbtibtibtibtjbtibtibgrbtkbtlbtmbpPbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtuccubtwbtxbtybtzbtAbfmbfmccFbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGccrbmGaafbtJbtKbtLbtMbtNbtMbtLbtObtPaafbspbtQbtRbtSccqbtUbspbtVaJlbtWbbmbtXaJibtYbXqbtZbuabubbucbudbuebufccRbuhcdmbprbukbulbumbnibnnbunbpubupbnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbuxbplbplbsMbuybuzbuAbpvbuCbuDbuEbuFbuGbrhbuHbuIbuJbnIbuKbuLbuMbtbbpCbuNbnIbpEbpFbuObnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbnbeOcbocbobuVbpHbuWbgnbgobuXbuWbgrbuYbuZbvabvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvicblbvkbvlbvmbvnbvobfmbvpbgGbvqbpzbvsbvtbvubvvbmGbmGbmGbvxbvybvzbvAbvBbvwaafbpObvIbvHbvJbvKbvMbvNbvObpOaafbspbqMbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbvYcbBbuccdTcdUcbtbwdbwebwebwfccncdWcdVbwjbwkcccbwmbwkbwkbwkbwkcbObwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbqTbwvbwwcbrbwybnIbwzbwAbwBbwCbpCbwDbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbwGbwHbrgbwJbwJbwKbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbPvbxabgGbgGbugbxcbvtbvubxdbxebxfbPzbujbxibxjbxkbxlbvwaafbxmbqtbskbxobxpbxobskbqxbxraafbspbqwbuobuBbedbPBbspbtVaJlbxwbcLaRpaJibxxbxybxzbxAbxBbxCbORbxEbxCbxFbxGbOTbxFbwkbOUbxJbwkbwkbxKbxLbxMbxNbxObxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbyabwsbwsbwsbsSbwtbybbwwbvDbUabTQbwwbyfbygbyhbyibpCbvLbnIbrqbykbnMaaaaaaaaaaaaaaaaafbylbymbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbONbypbONbyqbyrbwQbrJbrJbrJbysbrJbwTbrKbytbdPbdPbyubgGbrNbwXbyvbywbyxbyybyybyzbyAbyBbyCbyDbvsbyEbvPbyGbxkbyHbyIbyJbvwaafbxrbxrbyKbtLbyLbskbyMbxrbxraafbyNbyNbyNbyNbyNbyNbyNbOQaJibyPblMblNaJibwbbyRbyRbySbyTbxCbNVbyVbyWbyXbyYbyZbzabwmbzbbzcbzdbzebzfbzgbzgbzhbzibzgbzjbzkbckbaAbwubclbOfbcnbOibzsbztbzubzvbzwbppbzxbpqbpqbzybsSbwtbzzbzAbzBbzCbzDbzAbzEbzFbzGbObbzIbwwbwwbOdbnMbnMbzKbzLbzLbzLbzMbzNbwGbwJbrgbwJbwJbOkbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbNQbzQbNQbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPbzVbgGbrNbwXbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbAhbxrbAibxpbAibxrbAjbAjbAjbyNbAkbAlbAmbAnbAobApbAqaJibAraRqaRpaJibxbbwYbxhbAvbAwbMlbAybAzbMhbABbACbADbAEbMpbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbMqbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbBabBbbBcbppbBdbBebBfbBgbBhbBibBjbBkbBlbBlbBmbBnbBobTHbLYbBrbBsbNdbTIbBvbBwbBwbBxbBybBzbuQbuRbNkbuRbuQbBBaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbLxbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbBGbgGbBHbBIbgGbLnbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbBNbBMbBObvwbBPbBQbBRbAhbxrbLabxrbAjbyQbBUbBVbyNbBWbzmbBYbBZbCabCabCbbKfbAraRqaRpaJibAsbCebCebySbCfbxCbCgbChbxCbCibCjbCjbCkbwkbClbCmbwkbwkbwkbwkbwkbwkbIvbwkbwkbwmbIoaXKaXKaXKaXKbHmbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbHjbCsbCtbBhbCubCvbCwbCxbCxbCxbCybCzbHlbCBbCCbCDbIUbTGbCGbCHbCGbAtbCJbzKbzLbzMbJDbzNbJVaaaaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbNQbzQbNQbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbCQbgGbrNbwXbgGbqlbCRbgGbgGbAubxcbvtbAbbCTbxcbCUbvwbCVbALbCXbAWbxlbvwbCZbDabDbbTObDdbvFbvEbUbbDhbDibDjbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbSFbDvbSVbDxbDybDzbDAbyWbDBbBKbCjbDDbwmbDEbDFbwmbDGbDHbDIbDJbDKbDLbDMbCpbDNbDObBTbDQbDRbCpbVLbVMbDUbVAbDWbDXbCxbDYbDZbEabEbbEcbEdbEebEfbEabEgbEhbCvbEibEjbEkbwwbwwbwwbwwbwwbTAbTgbEnbzKbzMbCJbEobEpbCAbSwbSubCIbEubEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbSrbExbSrbEybEzbEAbEAbEAbEAbEAbEBbECbEDbzTbEEbdPbEFbEGbEHbEIbEJbtzbEKbELbEMbfmbtCbENbAbbEObEPbyEbvwbEQbERbESbBMbETbvwbEUbEVbEWbAhbEXbvCbEYbAjbFabFbbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbVjbFjbFkbFlbFmbFnbFobFpbFqbxCbxFbxFbRWbxFbwkbFsbFtbFubFvbFwbFxbDJbFybDLbFzbFAbFBbDObFCbFDbFEbSfbVlbDXbSgbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbFQbFRbFSbCvbFTbFUbScbFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebGfbGgbGhbGibGjbRBbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbRAbGtbGvbGwbGxbGybGzbtCbvtbAbbGAbGBbtCbtGbtGbtGbtGbtGbRybtGbtGbtGbtGbtGbtGbRzbtGbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJiaJiaJibxwaRqaRpbVjbRebFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbRxbGXbGYbGZbRvbHbbHcbHdbHebHfbCpbUSbUfbwwbwwbwwbwwbwwbRabwwbwwbwwbzAbQubzAbzAbHkbBhbCubCvbFTbRdbCYbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbCJbBybCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHuaafaaaaaaaaaaaabGtbHvbHwbHxbHybGvbHzbDebHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbHMbHLbHNbHObqybHQbHRbAabHSbAabHTbAabzZbHUbHVbHWbHXbHYbHZbxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebIfbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqbIrbFDbIsbItbIubCpbPXbIwbIxbIybUdbIAbIBbICbIDbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbILbIMbINbIObIPbIQbIRbGabGbbISbEnbEnbEnbCJbCJbCJbCJaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbITbEmbIVbIWbIXbIYbIZbJabJbbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebJebJkbJlbqsbJnbJobJebJebJebJpbJgbJhbJqbJrbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbzObGHbDzbHAbFibDVbxFbzPbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbzJbJWbHPbJYbIFbJZbKabKbbKbbzAbKcbKdbKebzHbKgbKhbKibKjbKjbKkbGabGbbKlbEnbKmbKobKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbKzbKAbIVbKAbKBbKCbHBbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbKUbKVbKWbKXbcLbKYaRpaRpaRpaJlbAebGFbGFbFlbJmbAxbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbLpbLqbLrbLsbLtbCpbLubLvbIxbLwbFGbLybLzbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbLFbCvbwwbLGbLHbLIbLJbLKbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbLWbLXbwxbLVbLZbMabMbbGtbMcbMdbMebMfbMgbwnbMibMjbMjbMkbtCbtCbtCbxDbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbwZbtCaJlaJlaJlaJlbxvaJlaKSaMpbMraJlbKZbJXbxHbGFbLdbxCbDzbLDbxCbMybMzbMAbMBbwkbMCbMDbMEbMFbMGbMHbMIbMJbMKbMLbItbJObFDbFDbMMbJObCpbMNbMObMObMObMObMObMObMObMObMObMObMPbMQbMRbMRbzAbMSbMTbMUbwwbMVbMVbMVbMWbMXbMYbMVbMVbMVbMVbMVbMZbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbsBbLRbLRbNebKtbKtbLTbLTbNfbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbxIbNlbNmbNnbKAbNobNpbGvbNqbNrbNsbNtbGvbNubNvbNwbNxaaaaaaaaaaaabNybNzbNAbNBbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbNLbNMbNNbNObNPbxTbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbNZbOabyobMzbMvbMubOebyUbOgbOhbyObOjbMxbMwbOmbNhbMKbOobFDbFDbNXbJObJObOobCpbMNbMObOqbOrbOsbOtbOubOvbOwbOxbMObOybOzbOAbOAbzAbOBbOCbCvbzIbODbOEbOFbOGbOHbOIbOJbOKbOLbOMbMVbEnbzrbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbsBbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbDgbDfbKAbOSbDcbCLbKAbKAbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbPebPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNYbPobPpbPqbPrbPsbPtbPtbNSbPubCKbPwbPxbPybDtbOcbLbbEsbGFbGFbErbDzbPCbxCbPDbPEbPFbPGbwkbPHbPIbwkbOlbPKbPLbOnbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbPSbMObPTbLEbPUbPUbzAbBhbPVbPWbDwbPYbPYbPYbPYbPZbQabQabQbbQcbQdbMVbQebQfbQgbOObQhbOpbPnbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobQpbQqbQrbKAbKAbQsbQtbEwbQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbQBbQCbQDbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFbQLbQMbQNbQObQPbQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbHibGFbQVbGFbGFbPAbDzbLebRCbQZbPJbHabRcbRGbDEbIkbSpbOlbPLbPLbOnbRfbMKbRgbRhbPMbRjbRkbRlbQibRnbPObMObOsbOsbRobOsbOsbOsbOsbRpbMObRqbLEbRrbRrbzAbRsbRtbRubGWbRwbFVbGkbGkbGubGCbGkbGDbGEbFFbFrbRDbREbRFbEZbRHbRIbQjbRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabLVbRMbRNbRObLVbRPbMabMbbGtbGtbRQbRQbRQbGtbGtbNxbRRbRRbRSbRSbRSbRSbNwbQyaaabRTbRUbRVbAFbRXbRYbRZbSabSbbSbbAXbSdbSebQHbNFbPtbPtbPtbPtbPtbAAbPtbPtbShbSibSjbNUbPxbSkbSlbDtbQXbLbbQVbSmbBAbPAbSobJAbJBbSqbRbbSsbStbJzbFsbSvbIEbSxbRmbRibSAbSBbMKbRJbSDbBtbRjbSnbSGbBJbRnbPObMObMObMObRobOsbOsbOsbMObMObMObSIbSJbRrbRrbzAbSKbSLbCvbzIbSMbSNbSObSPbSQbSRbSSbBEbQabSybMVbBqbQfbSWbOObSXbSYbSzbTaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbTcbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTdbKwbTebKwbTfbBSaafaaaaaabGtbThbTibTjbGtaaabNxbTkbTlbTmbTnbTnbTnbTobQyaaabQzbTpbTqbTrbTsbPfbTtbTvbTubTwbNFbSCbTybTzbBXbTBbTBbTBbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbLfbLkbLcbDtbTJbTKbTLbJFbJEbTJbCnbLlbLmbTRbTSbTJbMKbMKbMKbMKbMKbMKbTTbTUbTVbRjbTWbTXbTYbRnbPObMObTZbQWbPQbCrbCobNWbNcbTZbUgbUhbUibIIbIJbzAbIKbSLbUjbwwbMVbMVbMVbMVbMVbUkbMVbCEbSEbVFbMVbUnbCcbUnbOObUpbCdbUrbOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUsbUsbUsbUsbUsbUsbUtbLTbUubUsbTcbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbmEbNwbUxaaabUybPcbPcbUzbUAbPfbPfbUBbPfbSHbNFbUDbSTbSUbNFbSZbSZbSZbSZbSZbSZbSZbSZbUHbUIbUJbUKbUKbUMbNUbDtbUNbTxbTMbUQbmlbwabUTbUUbTNbUWbTPbUTbUYbUZbVabVbbVcbUebVdbVebVgbVhbVibUlbmxbUmbRjbUCblCbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAblTbzAbzAbVwbCxbSLbCxbVxaafbnxbVzblSbVBbUGbVBbmdbUObUVbMVbVGbVHbVIbOObVJbVKbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbVObLUbKuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVPbVQbVQbVRbVSbNxbVTbRSbVUbNxaaaaaaaaaaaabNybVVbVWbVXbVZbVYbPfbNFbWabWbbNIbNFbSZbUXbVCbVfbVEbVDbWcbSZcaqcaqcaqcaqcaqbTFbWjbnWbWlbWdbWebWobWpbxgbWrbWsbWtbWubWtbWvbWtbWwbWxbWybWzbWAbWBbWAbWCbWDbWEbWFbWGbWfbWIbWgbWKbWLbnwbxVbMObxWbnNbzlbWSbWTbWibWSbWSbnSbWWbWXbWYbWZbCxbCxbSLbCxbFTaafbnxbXabXbbmHbXdbmUbnbbXgbXhbMVbXibVHbXjbOObOObOObOObOOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbQmbQmbQmbQmbQmbQmbXkbLTbQlbQmbXlbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmbjGbWnbjObRSbjRbXrbRSbXsbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUDbUEbXtbNFbSZbWHbWRbWJbWJbWRbWUbSZbXobXnbXnbXucaqbXBbDtbDtbXCbXDbXEbXFbXGblRbXIbXJbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbznbzpbzobAPbzqbARbAQbATbASbAVbAUbYfbYgbIwbYhbVobCqbWObWNbWPbYmbYnbjqbYpbYqbYrbYsbYtbYrbYubYvbILaafbnxbXabrBbVBbXvbVBbjwbYzbYAbMVbXjbVHbYBbYCbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbXlbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYDbVQbVQbVRbYEbYFbYGbNxbkYbNxbYIbYJbYKbYIbYIbYLbYMbYNbYObYPbXybXxbXAbXzbYjbYebYxbWRbYQbYybYSbYRbYUbkXbYWbYVbYYbYXcaqbZhbNSbkMbZjbZkbZlbZlbZmbnEbZobZpbTJbTJbZqbkNbTJbTJbkHbYZbZabVibZvbWQbZxbZybkLbZybZAbZbbkKbZbbZAbkVbYfbMNbIwbZEbXWbXVbZdbZIbZJbZKbMObMObwwbwwbwwbwwbwwboIbnFbofbwwbMVbMVbMVbMVbMVbZebMVbMVbMVbMVbMVbZObZPbZQbZRbUnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaambZSaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaabZfbZgbZgbZgbZHbZgbZgbZUbZTbYIbZYbZZbYIbZVcabbZWcadbZXcafbsycaacagcaecaicahcajbWRbYQcakcalbYRcambSZcaqcaqcaqcaqcaqcarbNSbDtcascatcaocancawbsvcaycazbTJcapcaBcaCcaDcaEcaFcaGcaHcaIbZxbWQcaubZycaKcaLbZAcaMcaNcaObZAbXXbYfbPObIwbXYbsqbXZbXYbXYbIwbIwbIwcaRcaScaTcaUcaVbwwbwwbsrbwwbwwcaXcaYcavcaJcaAcbbcaZcbacbccbdcbecbfcbgcbhbUnbUnbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbUubUsbUsbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbibwlbpScbmbwgbpTbvZcbqcbpbYIbvjcbsbYIbYIbwccbucbvcbwcbxcbzcbybXAbXzbYjcbAbuUbWRbWRcbCcbDbWRcbEbSZcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJcbJcbKbTJcbLcbMcbNbrucaEcbPcbQcbRcaIbZxbWQcbUbZycbScbTbZAcbWcbVbuTbZAccsbYfbYbbYdbYcbYiccAccBbYcbuibYkbYlcktbZDbZwbZFcktbtIbZGccDccCbtTccEccQccPbsHbthbtvbthbthbtBcctcctccvccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbsBbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafccSccSbpSccUccTbpTccVccXccWbYIccGccHccIbqgccKccLccMccNccOccZccYcdbcdacdycdebqBcdBceecdQcelcekcenbqQcdccddaJEcdfcaqbTFcbIcdgcdhcdicdjcdkcdlbpwcdncdobpocdqcdrcdscdtcaEcducdvcdwcaIbZxbWQceobZycdxcepbZAcdzcdAceqbZAcaPbYfbYfcaQbYccbYcbXcbZbYcchBccacjfcdLcdLbyFbBucdLcdOcdPcercdRcdOcdSbBpbyebydcdScdScdScdSbpLbyebydcdScdSbXjcdXboKbopceabnXbolboibycbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycboWcegcegcehbKtbKtbLTbLTceibLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejceucetbYIbYIbYIbYIbYIbYJcewcevcevcevceycexbXAbXzbYjceEbYxceSceUceTceXceWceYbSZcezaJFcfaaJFcaqbTFcbIceDcfccfccfcceFceGbTJbrwbrvbTJcbLcbNceJbrucaEbrcceLceMcaIbZxbWQceNbZyceOcePbZAbZAbZAbZAbZAccbceRbYfcaQbYcccdbsobYcbYcchBccecjfcdLceZcfbcfbcfecdOcfdbsjcffcdOcfgcfhcfhcfhbshbrIcfkcflbrPcfncfocfpcdScfqcfrcfsbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcftcfCcfvbNebKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcfwcfxcfycfzcfAcejcfEcfDcfGcfFcfIcFKcFrcFrcfLcfKcfKcfMcfNcbybXAbXzbYjcfOcajcfPcfRcfQcggcFgcgibSZaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcfZcgacfYcgbcgccgdcgecaEcgfceLcgocaIcghccfcgjbZycgkcglbZycFSbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLcgpcgycgycgzcgActscgtcgrcgxcgucgGcgGcgGcgBcgIcgIcgJcGdcgLcgEcgMcdScgNcFLcgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgFcgFcgFcgFcgFcgFcgFcgFcgFcgFcgFcgFcgFaaaaaacgScgTcgTcgTcgUcgVcejcgKcgHcCWcgRcgYcgXchacgZcCOchbchechdchgchfchichhchkchjbSZbSZbSZbSZbSZbSZbSZbSZcDNcDOcaqcCYcaqbTFcbIcbIctpctqctrcbIcbIchrchschtcfYcaEcaEcaEcaEcaEcaIchlchmcaIchwcDUchwbZychychnbZychAchBbVichCbVichDbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLchIchJchJchKcEkchMchpchOcEBchQckLckLckLckLcEYchvckLcEQckLchEchFcdSchZciachGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgFchHchLchHcgFchNchPchNcgFchRchSchRcgFaaaaaaciicgTcgTcgUcgUcijcejchUchTchWchVchYchXcidciccIBcieciecigciecbybXAcihbYjcikcimcilciocinciocipcirciqciqciAciAciAciAbTFciGciHciIciIciJciKcIMciMciXciOcIIciQciRciSciSciTciUcaIcaIcaIciVcdEckqbZybZybZybZychBchBbViciYbViciZbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjgcisciucitcjjcjkcivcjmcjncjociwcjocjocixcjrcjscgIcICcgIciWcjucdScjacjwcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgFchHcjbchHcgFchNcjcchNcgFchRcjdchRcgFaaaaaaciicgTcgUcgUcgUcjBcGmcjhcjechWcjicjpcjlcGgcGecjzcjycjDcjAcjEcbybXAcjFchkcjGcGxcjHcjJcjJcjJcjKcjMcjLcjNcGvcjOceAciAbTFciGckaciIckbckcckdcubckfckgckhctQckjckkcklciSckmciUcImcHGckpcjQcjPcdHcdGcdIcdIcdJcdIcdKbVibVibVibVibYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcGVcjRcjTcjSckEcdOcHlcdOckGckHcjXcjUcjUcjYcgIcgIckecjZcjUckickOcdSckPcGJckRcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgFckrckuckscgFckzckBckAcgFckDckJckIcgFaaaaafciiclbcgTcgUcgUcgUcejckMckKchWchWcKdchWchWchWchWckTcieckWckYcbyclackZcldclccKccleclhclhclhclicljcljclkciAcllcgqclwclxciGclyciIclzclAclBcKmclDclEclFcKoclHclIclJciSclKciUcKecKkclNclnclmclQclNclRclSclTbYfceQcdIcdIcdIcdIcdIcltbYfaaaaaaaaaaaaaaaaaaaaacdLcmacmbcmccmdcdOcmecmfcmgcdScmhcmicmicmiclvcmkcmlclPclOcmicmicmncdScmocKpcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgFclXcmmcmjcgFcmscmmcmtcgFcmscmmcmtcgFaaaaafcmzcgTcgTcgUcgUcmAcejcmvcmucmxcIQcmBcmycmCcmCcmEcmDcmCcmFcJzcbycmIcmHcmKcmJcimcmLcmLcmMcljcmNcmPcmOcmOciAcibceVcJAcqgciGcnbciIcnccndcmRciGcmSciNcmWcfYcmXcnicnjciScnkciUclLclMclNcnlcJBcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnocnpcnqcdScdScnrcnscntcdScdScdScdScJCcnscntcdScdScnvcJFcnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZSaafaafaafaaaaafcnxaafcnxaafcKBaafcKAaafcKBaafcKAaafaafaaacejcnAcnBcgUcgUcnCcnDcKCcKzcnycnmcKDcnzcnzcKEcnzcnGcKFcnHcnGcnJcqrcKwcKxcnMcnOcnOcnOcnOczvcKycnRcnRcnRcgscgscgscgscnSciGcnTcnUcnccnVcnWciGcmSciNcnXciUcnYcnZcnjcoacobciUclLclMclNcoccodcoeclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcofcogcohcwlcojcokcKHcomcKIcopcoocdOaaLaafaafaafaafaaaaaaaaacKGaaaaaaaaaaafcoscKJcosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoucowcovcoxcovcowcoycoxcoAcoBcoycoDcoCcoFcoEcnycnycnycnycnycnycnycnycoHcoGcoJcoIcoLcoKcoNcoMcoOcnGcoQcoPcoRcnGcoTcoScoUcnOcoWcoVcoYcoXcpacoZcpjcpbcpbcpkcpncpncpjbTFciGciGcpccKuciGciGciGcpeciNcpfciUciUciUcKtcphciUciUclLcpiclNcvmcpscvmclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcplcpmcplcKqcwVcppcpqcomcomcKscomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacKvaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcpvcpucpxcpwcpvcpycpAcpzcpCcpBcpFcpDcpJcpHcpMcpLcpOcpNcpTcpQcpVcpUcpXcpWcpZcpYcqbcqacqdcqccqfcqecqzcqtcwwcqIcoTcqKcqMcnOcpacpacpacpacpacqPcpjcqQcqQcqQcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcqmciUcqncqocqpcqqciUcvDclLcpiclNcvOcqRcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoicwacqBcqCcqDcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcqScpHcqUcqWcqVcpHcqXcpHcqYcqZcqXcpHcqYcqZcpHcpHcpHcpHcpHcracpHcpHcpHcqbcrbcpYcrccvBcqacrecrdcrgcrfcricrhcrkcrjcoTcqKcrlcnOcrmcpacpacrncpacrocpjcrpcrJcrIcrJcrKcpjbTFcrqciGcrrcrscrtcrucvrcrwcrxcrycvtcrAcrBcrCcrDciUcrEcrFcrGcrHcqvcvlcqvcrHaaaaaaaafaaaaaaaaacqvcrQcrScrRcqvaafaafaaaaaaaaacdOcomcomcomcomcrMcppcrNcrNcrNcnpcrNcrOcdOaaaaaaaaaaaaaaacrPcrPcrPbZSaafaafaafaafcnaaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpHcrccpHcrccpHcqXcpHcrTcrVcrUcrVcrWcrVcrVcrZcrXcpHcpHcyCcnPcnPcnPcnLcymcypcypcyvcqacyhcsgcsicnGcskcsjcsmcnGcsocsncsqcspcsscsrcsucstcpacsvcpjcswcrJcsxcrJcsycpjbTFcizciGcszcsAcsBcsCciGcfYcyacfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsKcsLcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpHcrccpHcsNcsQcsOcsUcsTcsVcrUcrVcsWcrVcrVcrZcsXcxRcrZcxVcqWctacsZcsZctccrccrcctectdctgcxHcnzcnGcxIcnGcnGcnGctjcticsqctkctmctlctoctncpacttcpjctucrJcsxcrJcxGcpjctvctwciGciGcxBciGciGciGciBctzctAciUciUciUcxFciUciUcsIcrGaaacqvctCctOctEctFctGctHcxdctJctKctLcqvcuVcwHcuVcqvctSctPcqvaafaafcdOcplcplcplcwTcwVctRctVctTctUctZcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpHcsNcsQcsQcsQcsOcsQcsQcsQcsOcsQcsQcsQcsQcsQcuacAUcsQcAIcsQcuccsQcsQcsQcuecudcufcpvcpHcugcBmcuhcukcujcumculcujcuncupcBncurcuqcuqcuscuqcutcBqcuucuxcuwcuycuycpjcuCcuDczVcuFcuFcuGcuHcuIcuJcuJcuJcuJcuJcuJcuJcuJcuKcrFcrGaaactFczXcuzcuNctFcuOcuAcuQcuQcuPcuBcuQcuQcuRcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcAxcuZcvacvbcvccvdcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpHcpHcpHcpHcpHcqXcpHcpHcpHcqXcpHcpHcpHcpHcpHcqYcpHcpHcvBcpHcvhcpHcpHcvicvkcvjcvocvncvpcvnczMcvqcvucvscvvcvqcvqcvwcvxczvcvycpacvAcvzcpacpaczycrJcrJcvCcuycuycpjbPxcAscvNcvNcvNcvNcyScvNcvNcvNcvNclMcvPcrGcrGcrGcrGcrGcrGaaactFctFcyRctFctFcvRcvScvTcvUcvVcvEcvGcvFcvIcvHcyZcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvacwecwfcvJcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaabZSaaaaaaaaaaaacptcpHcpHcpHcpHcpHcqXcpHcpHcpHcqXcpHcpHcpHcpHcpHcqYcpHcpHcvBcpHcvKcpHcpHcvKcvKcvLcpHcpHcvWcvQcvXcvXcvXcvXcvZcvYcoTcwgcwkcspcwmcpacwocvzcpacwpcpjcwqcrJcwscwucwtcpjcCLcvMcvNcwIcwJcwKcwLcwMcwNcwOcvNcwPcwQcrGaaaaaaaaaaaaaaaaaacqvcwRcwvcwxcCNcwzcwycwBcwAcwDcwCcwFcwEcwScwGcuWcuQcxecqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkcCIcxmcxncdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpHcpHcpHcpHcpHcwUcpHcpHcpHcwUcpHcpHcpHcpHcpHcqYcpHcpHcCncqWcwXcwWcwWcwXcwYcwXcxacwZcxbcwWcCicxccxocxlcxpcvYcoTcxqcoTcxrcxscpacpacxtcpacxucpjcxvcxvcxwcwucwtcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcCfcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUcCecxWcxXcxYcxZcuTcCccuScxAcuTcBBcqvcqvcqvcqvaaaaaacdOcplcpmcplcBscwVcppcrNcrNcyecyfcrNcygcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacgWaaaaaacgWaaaaaaaaacgWaaaaaaaaaaaaaaacgWaaaaaaaaacgWaaaaaacgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpHcsbcsacsacxDcxCcnPcolcnPcxEcolcnPcnPcnPcnPcnQcnPcnNcnLcnKcvKcpHcpHcxJcyccybcyjcyicykcpHcnIcylcyncyncyqcyocoTcxqcyrcnOcyscpacytcpacnFcyucpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcyMcyNcxLcyOcxLcxNcyPcvNcyQcorcrGaaaaaaaaaaaaaaaaaacqvcuVcoqctFctFcyTcywcyVcyWctMctDctNcyxctMcuRcyYcqvaaaaaaaaaaaacdOcplcplcplckXconczacrNcrNcrNcyfcrNczbcrNczccrNczdaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacgWcgWcgWcgWaaaaaaaaacgWcgWcgWcgWcgWcgWcgWaaaaaaaaacgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpHcqXcpHcpHcpHcwUcpHcpHcpHcwUcpHcpHcpHcpHcpHcqYcpHcybcpHcyycvKcpHcpHcyzcwYcyAcyBcvXcotcvXcvXcylcyEcyDcyFcyocoTcxqcoTcnOcyHcyGcyJcyIcyKcpacnOcyLczJczJcyUczLcpdczNczOcvNcxNczPczQcxNczRczSczTcvNczUcpgcrGaaaaaaaaaaaaaaaaaacqvczWcuMcpocuVczYczZcAactFcAbcAccsPcyxczWcyXcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgczecAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaacgWcgWcgWcgWaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaacgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaaczfcpHcqXcpHczgcrVcrUcrVczhcrVcrUcrVczhcrVcrVcrVczjczkczjcrZczlcyAczmczocznczqczpczrcvXcztczscvXcvXcvXcvXcvXczucqrcprcqrcnOcnOcnOcnOcnOcnOcnOcnOczwczJczJczxcANcAObPxcAPcvNcAQcARcqscATcqAcAVcAWcvNcAXcAYcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBeczAczzczBcBeczDcqvaafaafaaaaaaaaaaaabquaaacdOcBlcqJcrvcBocBpcqJcqOcBrcBpcqJcrzcdOaaaaaabZSaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaacgWcgWcgWcgWaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaacgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZSaaaaaaaaaaaIaaaaaaczEcpHcqXcpHcybcyccqXcpHcybcyccqXcpHcybcyccpHcpHcxJcpHcybcycczFczHczGczKczIcAhcAdcAtcvXcAvcAucrLcAwcAycujcAAcAzcujcABcujcACculcADcAFcAEcAEcAHcsccBVcBWcBWcBXcBYcAObPxcBZcvNcvNcCacCbcsdcCbcCacCdcvNcrGcsecrGaaaaaaaaaaaaaaaaaacqvctFcsfcuVctFcCgcChcshctFcCjcCkcqycgvcAJcCkcCocrHaaaaaaaaaaaaaaaaaacgwaafcdOcCqcsMclUcomclscsDclqcomclocsYclWcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaaIaafaafczEcALcAKcAScAMcBgcBfcBicBhcBkcBjcBucBtcBgcpHcALcBvcBycBxcBkcBzcnycnycnycnycnycnycnycnyctxcBAczucBCcBDcoTcBEcoTcoTcxqcoTcoTcBFcoTcBDcBGcBIcBHcBJcthctfctbcCPcCQcAObPwcCRcCScCTcCacAGcAVcBwcCacBLcBKcBMctycCXaaaaaaaaaaaaaaaaaacqvcBNctDcuQcDacDbcuQcDccDdcDeaafaaachxcBPcBOcBQaaaaaaaaaaacaaaaaaaaaaaaaaacdOcDhcplcplcomcDicplcplcomcDicplcplcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcpEaaaaaaaaIaaaaaacBScBUcBTcCrcCpcCtcCscCucCpcCtcCscCucCpcCtcCvcCvcCwcCucCpcCtcCxcnyaaacCzcCycCBcCAcCDcCCcCFcCEcCGcCGctBcCHcCKcCJcCMcuicCJcCMcCKcCUctIcCVcCUczuczucAOcuvcuocDPcDQcAObNUcDRcDScDTcCacCbcuEcCbcCacDgcCZcDfaafaaaaaaaaaaaaaaaaaaaaacqvcBNcDVcDjcDXcDXcDjcsPcDYcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDZcplcplcomcEacplcplcomcEacplcplcdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaaacrPaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcClcqLcpIcBRcpIcpIcqLcpIcpPcpIcpGcpIcpPcpIcpGcpIcpPcpIcpGcpIcqLcpIcpRcpIcpGcpIcqNaafaaacDlcDkcDncDmcDpcDocCFcDqcCGcDrcDtcDscDvcDucDxcDwcDzcDycDvcDAcDCcDBcCUaaaaafcAOcuLcECcEDaafaaabNUbPxbPxbSkcCaclZcEFclYcCaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcDDcuXcDEcEJcEJcDEcuQcEKcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcplcplcplcomcELcplcplcomcELcplcplcdOaacaaacrPaaaaaaaafaafaafaaaaaacmTaafaaaaaaaafaafaaaaaacrPaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaqaaaaaaaafcgFcmscmmcDFcgFcmscmmcDFcgFcmscmmcDGcgFaaacgFcDHcmmcDGcgFaaaaafaaacDlcDIcDKcDJcDMcDLcEbcDWcCGcEccEecEdcDvcEfcEhcEgcEjcEicDvcuUcEmcElcCUaaaaaacAOcuYcFhcFiaaaaaabNUbPxbPxbNUcCacmUcmUcmUcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcEncFncuQcuQcuQcuQcuQcFocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcmYcmYcmYckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacmZaaaaaaaaacrPcrPcrPbZScrPaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaIaaaaaaaafcgFcEocEqcEpcgFcErcEtcEscgFcEucEwcEvcgFaafcgFcExcEzcEycgFaaaaafaaacDlcEAcDncDMcDMcEEcEHcEGcEMcEIcEOcENchccEPcEScERcEUcETcEWcEVchzcEXcCUaafaaacFJchqchocAOchuaaabNUcFMbPxcFNcFOaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcFPcFQcDEcDEcDEcFRcFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqpbqpbqpaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcfTaafcrPaaaaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaafaafcgFcEZcFacEZcgFcFbcFccFbcgFcFdcFecFdcgFaaacgFcFdcFdcFfcgFaaaaafaaacDlcCycFjcDJcDMcDocFkcDqcCGcFlcFpcFmcDvcFqcFscjqcFscFtcDvcFucFwcFvcCUaaLciPciyciLciCciyciycifbNUciEciDcGjaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGlcEJcEJcEJcEJcEJcGlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaaacrPaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgFcEZcFxcEZcgFcFbcFycFbcgFcFdcFzcFdcgFaafcgFcFdcFdcFdcgFaafaafaafcFBcFAcFDcFCcFFcFEcFGcDqcCGcFHcjvcFIcDvcFTcFVcFUcFXcFWcDvcFYcGacFZcCUaaacjIcjCckocknckFckCcjtcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCmcqxcqxcqxcCocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZSaaaaaacgFcgFcgFcgFcgFcgFcgFcgFcgFcgFcgFcgFcgFaaacGbcgFcgFcgFcgFaaaaaaaaaaaacBAcBAcBAcBAcBAclCcGccGccGccGcclGcGccGfcGicGhcGicGkcGccGcclucGccGccGccjIcjCclpclgclfckQckNaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScGncGpcGocGrcGqcGtcGscmwcGucmpcGwcGzcGycGBcGAcGDcGCcGIcGEcGKcmGcGEcGccjIcjCcnecmQclfcnfclVaafaaacGQcGLcGQcGLcGQcGLaafcGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGncGOcGNcGTcGPcnucGUcGXcGWcGZcGYcHbcHacHdcHccHdcHdcHdcHecHdcHfcHgcGccnhciyciyciyciyciycngaafaafcHhcHhcHhcHhcHhcHhaafcGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaabgaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGncGOcHicHkcHjcnwcGUcHocHmcHrcGKcGKcGKcHtcHscHucGKcGKcHmcHwcHvcHxcGccGccGccHyaaaaaaaaaaaacHzaaacHAcHAcHAcHAcHAcHAaafcGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGncHCcHBcHEcHDcnEcHFcHIcHHcHLcHJcHJcHJcHNcHMcHOcHJcHJcHPcHRcHQcHTcHScHVcHUcHXcHWcHWcHWcHWcHWcHWcHYcHZcHYcHZcHYcHhaafcGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIacIdcIbcIfcIecIgcGscIhcGKcGKcGKcIjcIicIlcIkcIncKWcIpcIocIrcIqcItcIscIvcIucHXcIwcIxcIwcIxcIwcIxcIwcIxcIwcIxcIwcHhaafcGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaafaaaaaaaaaaaaaafaafcIJcIKcIKcIKcIKcILcILcILcILcILcKScILcGccIycGKcGKcGKcIzcGccKUcIAcKVcGccIEcIDcIFcHQcIHcIGcKTcGcaaacHAcHAcHAcHAcINcHAcHAcHAcHAcHAcHAcHAaafcGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgWcgWcgWcgWcgWcgWcgWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafczCaafaafaafczCaafaaaaafczCaafaaaaaaaaaaaaaaacIUcIVcIWcIXcIYcIOcJacJbcJcciFcJecJfcJgcJecGccKRcIPcGKcGKcIScIRcIZcITcJdcIRcJicJhcHRcHQcJkcJjcJlcGcaafcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcydcxzcxycxxcxxcxxcxxcxxcxxcxxcxxcxxcxxcxxczicxzcxzcxzcKPcKQcKNcKOcKMcJDcJEcKLcJGcJHcJHcJHcJIcJJcJKcGccJmcJmcGKcGKcIScJncJpcJocJqcJncJicGKcIrcJrcItcGKcJscGcaafcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhaafcGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcxfaafaaaaafcxfaafaaaaafcxfaafaaaaaaaaaaaaaaacIUcIVcJRcJScJTcJUcIKcJVcJWcJecJecJXcJXcJYcGccJmcJmcGKcGKcIScJtcJpcJucJvcJtcJxcJwcJLcJycJNcJMcJOcGcaaacHAcHAcHAcHAcINcHAcHAcHAcHAcHAcHAcHAaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaafcHncwrcHpaaacHncwrcHpaaacHncwrcHpaafaaaaaaaaaaaaaafaafcKfcIKcIKcIKcIKcKgcKhcKicKicKjcKgcKgcGccGccGscGccGccGccGccGccJPcGccGccGccGccGccGscGccGccGccGcaafcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhcHhaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHncwrcHpaafcHncwrcHpaaacHncwrcHpaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacJQaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaacHqcJZcHqcJZcKacJZcHqcJZcHqcJZcHqcJZaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaacKraazaavaafcKraazaavaaacKraazaavaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaabhabhabhabhabhabhabhaafaaaaayaaUaaVabkaaVaaEaaVaaWaaXaaYaaZabaaayabbabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaaacKraazaavaafcKraazaavaaacKraazaavaafaaaaaaaacaaaaafaafabcabdabdabdabdabeabfaaaaaaabhabvabvabmabvabvabhaaaaafaayabiabjaaXabjaaXabjaaXaayablaaZabyaayabnaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafapsaafaafaafapsaafaaaaafapsaafaaaaaaaaaaaaaaaabqabrabsabtabuabzabwabxabfaafaaaabhabBabAaceabCacfabhaaaaaaabDabEabFabGabHaaEabFaaEabIabJabKabLabPabNabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaIaafaqMaqbapTaqTaqTaqTaqTaqTaqTaqTaqTaqTaqTaqTaqTarBaqbaqbabWabYabXaccabZacaacbacpacdacuacuacuabhabhacgacyacAabhabhachaciacjackaclacmacnacmacoackackackaczacqacracsactaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaaLaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafapjaafaaaaafapjaafaaaaafapjaafaaaaaaaaaaaaaaaabqabracvacwacxacBabdacCacuacuacFacDacWacJadfacYacuacuacGacHacIadnacKacLacMacNacOacPadoacQacRacSacracsabbabbabbabbabbabbaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaafcKrapgaavaaacKrapgaavaaacKrapgaavaafaaaaaaaaaaaaaafaafacUabdabdabdabdacVacuadpadradradradradfadradtadsadaacQadbadcaddadeacMadqacQacQacQacQadgadhackadiadjabbadkageaflabbaaLaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaacKrapgaavaafcKrapgaavaaacKrapgaavaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabfacVacuaduadCadzadGadFadOadKadWadsadaacQadvadcaddadwadxadyacQadMadMadMaddadAacradBadladXadladlaicadXaaLaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaaacKrapgaavaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadDadEacuadYadradradradradfadraecadsadaacQadvadHadIadJaefadLadUadNadNadNadVadPacradQadlabbadRadSaicabbaaLaaLaafaaaaafaaaaaLaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaafcKrapgaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadEacuacuaeoaehaeuaeqaezaevacuacuaeBacQadbaebaddadZaeaadyadUadNaebadNaetaedacradQaeeabbabbabbabbabbaaLaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafcKrarDaavaaacKrarDaavaaacKrarDaavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegacuacuacuacuacuacuaePacuacuacuaeiaejaekaelaemaenaeRaepaeMaeraesaerafAafaacradBafeabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEaexaeyafmaaTaeAafyaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLafBaeLaeNaeOafHaeQafIabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauabgaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaeTaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadEaeUaeVaeWaaTaeAaeAaeXaeYaeZaeFafLafbafcafdaddafMaffafgacQacQafhacQafiafjacrafkajkabbaNGafnafoafoafpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadEafqafrafsaaTaftafuafvafwafxaggafzafNafOafNafCafDadxafEafFacQafhacQafGagqagrafJafKagsadlagtaghaguafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUafVafWafXafYafZafZafZafZafZafZagaagbagcagbaaTagxagdagfagHagKaeFagiagjagkaglagmagnagoagpahpahiahzahtahGagpagvagwahJabbadlagyafoafoagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfagAagBafZafZafZafYafYafZagCagDagDagDagDagDagDagDagDagDagDahPaaTagFagGahRagIagJaeFahNagLagLagLaddagMagNagOagPagQagRagQagPagSagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUagVagWagWagWagWagWagWagWagDagXagYagZagWahaahbahcahdaheahfahgahhahUahjahkahmahlahnahnahnahnaddahoahXahqahrahsahQahuahvahwagvahxahyaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaigaaaaaaaigaaaaaaaaaaigaaaaaaaaaaaaaaaaigaaaaaaaaaaigaaaaaaaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRahAabfahBadEagWahCahDahEahFaihahHagDagZahIahFaioahKahLahLahMaiiahOaixacXacXacEacXaikaiLahSacQacQaebaddahTaiWahVahWajaahYahZaiaaibagvahxaicabOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaigaigaigaigaaaaaaaaaaigaigaigaigaigaigaigaaaaaaaaaaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadDaidaieaifabfajdadEagWajeaimaijaipailaisagDagZahIainagWajjahLaizaiqahKahOairaiFacXaitacXacXaiuacZahSacQacQaddaiwajmaiyagPagPajnagPagPaiAagvaiBaiCactaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaigaigaigaigaaaaaaaigaigaigaigaigaigaigaigaigaaaaaaaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiEakfaiGaiHaiIahFagDaiJaiKajoagWaiMaiNaiOajraiPaiQaiRaiSaiTacEaiUaiVaeFajtaiXaiYaiZakNakEajcajxakVajfajgajhagPajiagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaigaigaigaigaaaaaaaigaigaigaigaigaigaigaigaigaaaaaaaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfajAabfabfadmajlagWagWajBagWagWajIagWagWagWakkagWagWajpajsakAantakFajuagWajvajwakRajyajqagWagWajzalealaagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafYajFafYajGajHalfajJajKajLajMajNajOajPajQajRajSajTajUajVajWajXajUajYajWajWajZakaakaakbakcakdahOakeajbakgajzakhakiakjalnaklakmaknakoakpalqakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabQaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWaksaktakuakvakwakxakyakzalrakBakCakDakXalvakwakGakwakwakHakIakJakKakLakMalxakOakPakJakQalNakSakTakUalbakWalCakYakoalIabbalOamaactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaabpaaaaaaaaaaaIaaIaamaamaamaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalcaldalQalPagWalgalhahLalialjagWacTalZacTagWabVamsabUagWalpamuamtalsagDaltaluamxalwamyagWabTabSabSabRagWalBamcalDalEalFalGalHakoamAanQamDanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEamEalMalMamHamFamMamJalRahKalSaljagWalTalUalValWalXalYamOamPahKambahKamNamdameameamfamgamhamiamjamkamlammakoamnamoampamqalDalDamrakoadQanQamvawKamwaaaaaaaaLaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaaoXaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamUamBamCamWagWamZalRaljankamGagWamRamIanlalWamKamLanmanoannanpamQanaamSamgamgamfamgamTaoWamVanfamXanhakoanPanWalDamqalDalDanbakoancandaneaocangaafaaLaafaafaaLaafaafaafakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaoeagWagWagWagWagWagWaofaojaohaohaohaohaosaotaosanraoQaoCaoRanvaoSaoTaoUanzanAamgamgamfanBanCamianDanEamXanFanGanHanIanJanKanLanManNanGanOaoGapqanRanSaaaaaaaafaaaaafaaLaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYanZaoaagDaobaoPagWaodaoZalKaogapdaoiappaokaolaomaonaooaonaopaoqaoraonaoOapDamgamgaouaovaowamiaoxapHamXaoyanGaozaoAaoBaqgaoDaoEaoFanGaqqanQanQanQanQaoIaoJaoHaoLaqCaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalJaaaaaaaaaaafaaaaaaaaaaamaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaacaaaaaaaaaanXanXapaapbagDalMapcaqJapeapfaqXaphapiaoMaonaonapkaplaonapmapnaoraonapoaonaoNapEapramgamfamgamTaraamYanEamXaptanGapuapvapwapxapyapzapAanGapBaoHapCapLapGapFapPaoHaoHarjaoHaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapUapMagWalgapNalKapOapVapQapRaokapSaqmaqcaqpapWapXapYapZaqaanUaqNaqdaovaqeaovaqfarnaqhaqiaqjaqkanGaqlaqWapyaqnaqoarlaqoaroaqraqsapFaqtaquapFaqvaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWarvalRagWalWalWalWaqDaqEapkaqFaqGaqHaonaqIarwaqKaqLanyarMaqOaqPaqQaqRaqSanxaqUaqVarQamVanGaryaqYaqZarzarbarcardanGarearfapFaqtaqtapFargaoHarhariarCaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaabgaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarkaqBagDaobarHagWarmarOalKaogarPaoiaokarparqarrarsartaonarualWarZarSarxalLasnarAasBamzasOarEarFarGasWamjanGanGarIanGanGanGanGanGanGarJarKarLasaasaapFarNaoHaoHasXaoHaoHaaaaaaakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLasYaaLaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzataaqBagDarRapcatIarTarUatJapharWaloaonaonarYasFasyasMaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslatXatQasoasoaspaspasqasrassastastasuasvasvaswasxauiaszaqsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaaigaigaigaigaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAauoasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCasbapbagDapUapMagWasDasEalKapOasPaoiasGasGasHasIaonasJaonasKalWasLatgauuathatiarAasQasRasSarEasTasUasUasVauvasVauYauSasZasZasZasZasZasZasZasZasZasmavbatbatcaoKatdateatfaaaaafatPatratjatjatjatjavCatjatjatjatjatUaafaaaaaaaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaigaigaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatWatqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHavFavRatKatLatMatNatOatPatPatPatPatPatPatPatPatPatPatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaigaigaigaigaigaigaigaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatSatTavTatTatSatVavUatVatSaafatqavYatYaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatZauaanYaubaucanXaafaafalWaudaueaufaugauhawiaonapnaonasJaqEaujaukaulawkaunauKauparAauqaurausarEatBasZauLawnauMatCauxauyatFatGauzauAauBauCauDatMatNauEauFauGauHauIauHauJauwauOauPaxsatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaaaaafaaaaafaafaaaaaabepaaaaaaaafaaaaaaaafaaaaaIaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTavmatTauNatVavyatVauNauQauRawoauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWawvauZavaalWawMavzaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZavAavoavJatCawravqatFatGauzauAavravsavtatMatNavuavvauGauHauHauHauJavwavQawfavVatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBawRavDauNavEaxdavGauNavHavIaxuavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaxwaxyavSaxCaxAaxOavWavXanXaaaaaaalWalWalWayqavZawaalWawbawcawdaweawpawgaukawhawxautawyawlarAawmaurayzarEatBasZawzawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNayNawwauGauHauHauHauJawAavxawfaykatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaayOaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaaaySaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPaxyawQazgaxAawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawBaxjawCatCaxVavnazpaxcaxfaxeaxhaxgaxhaxiaxkaxlaxmaxnaxoaxoaxoaxnaxmavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaazoazBazoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNazFaxxatSauNazUaxxatSauNaAbauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaAraxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaxGaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaAvaxPaxQaxRaAvavpasZaxSawjcfSatCaxVaxXaxXaxXaxZaxYayaawLaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaAHaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoaBaayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaBcayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaBkayLayMayLayLayLarAaBwayPayQarEaAiasZcfSaycaxUatCayUayTayWaxpayYayXayYaxqayTazaazbazcazdazeazdazdazfaxraBEaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaBOaBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaBQauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEaCeazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTaCiazVazWazXazYazZaAaaCtazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXayiayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwaCDaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGaCHaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawzaAgaAhaBbayRaBdaBeazhaBgaBhaBiaBjaBjaCJaBjatPaBlaBmaBnaBoaBpaBraxvaziazkazjatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaCvazlaDAaDBaCvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaCLaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDcaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDnaCfaCgaChaCfaDxaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDyatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDQaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaDYaCIaAsaAFaCKaEeaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaEvayLayLayLarAaAdayPayQarEaAiasZaAtaECauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaEMaDoaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaESatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvaEVaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaFhaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFaFEaDZaCMaEaaEbaEcaEdaFGaEfaEgaEhaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaFIaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaFSaEKaENaEOaBjaEPaEQaERaFZaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtaCpaGfaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaGkaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkaFlaFlaFmaFnaFoaFpaFqaFlaFlaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaGqavHaFuaGraFxaGxaFzaDfaGHaFJaFKaFLaFLaFLaDraFLaFLaFNaFOaCMaaaaBYaDtaElaFQaEnaFRaBYaaaazJazOazPaGPaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYaGVazTaGaarAaGbaGcaGdarEaAiaDeaDvaDuaCoaDeaHIaDzaHJaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaHYaDpaIhaIcaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaIkaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraGIaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPayuaBLaInaFAaGRaGSaGTaGUaCEaFBaFDaFCaFCaFCbazaIzaFCaHcaFLaFLaFLaFLaFLaFLaFLaFNaHdaCMaafaBYaHeaHfaHgaHhaHiaBYaafazJazOazPaHjaFPaFUaHlaHmazPaHnaHoayLaHpazTaARaHqaATaHrazTaCfaFYaHsazTaHtarAaHuaHvaHwarEaGuaIDaEUaGvaDwaIIaGzaGjatEaHCaHDaBjaHEaBjaHFaBjaHGaBjaHHaGpaIZaDpaJsaJjaHLaHMaHMaHNaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaHQaHVaDsaDsaDsaDCaGBaGAaGCaGCaGLaGJaDCaDCaJwaDCaIdaIeaIfaIgaGFaJHaGFaIiaIjaKjaIlbinaKlaIoaIpaIqaKHaIsbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGMaGNaGOaDPaFFaIAaIAaKMaICaKPaICaIAaIAaIEaIFaFCaGQaFHaGWaHkaFCaIKaILaIMaFLaFLaHRaFLaIOaIPaIKaCMaaaaBYaBYaIQaHSaIQaBYaBYaaaazJazOazPaISaITaIUaFTaIVazPaIWaIXayLaIYazTaKQaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbaKVaCuaCuaCuaCuaCuaHUaHTaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpaKXaJtaGsaGsaDqaJvaDsaDsaKYaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHXaHWaIaaLcaIraIbaIbaIbaIRaINaIgaJIaJJaLdaJkaJMaJNaIgaJOaJPaGFaJQaJAaJSaJTbinaJUaIoaJVaJBaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaLeaIHaIGaIJaLiaJZaJYaJGaKaaFCaIKaKmaKnaKoaKpaIKaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPaKxaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaLkaKIaKJaKKaKLaJeaEDaKNaKOaLmaEEaKRaaaaaaaJlaKSaJKaLYaJlaJLaJnaJnaJnaKWaJnaJnaJnaBjaDpaMcaDpaDpaDpaDpaMvaDpaKZaLaaLbaMwaMFaMEaLfaLgaLhaLfaLfaLfaLfaLfaMVaLfaLfaLfaLfaLfaLfaLfaLfaJRaIgaLjaJWaLlaEFaKbaLoaIgaLpaKTaGFaLraLsaLtaJTaMXaJUaIoaJVaIoaKUaLwaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkaFlaFlaFlaLAaFlaFlaLBaFlaFlaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuaNcaKuaKuaLZaMaaLZaJeaJeaMbaNAaJeaJeaJeaJeaMdaMeaNXaNPaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaLnaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaOiaOpaLvaMyaMfaKZaMAaMBaMCaMCaMDaLfaOqaOsaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJRaIgaMPaMgaMRaMSaMqaMUaIgaOCaMWaOHaMYaMraNaaNbaGFaGGaOMaJVaIoaMxaNeaNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaMzaMzaNkaMzaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNzaNBaQcaNCaNzaNzaNzaNzaNDaNEaNFbgNaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaQdaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMTaMQaOhaQxaOjaOkaOlaOmaOnaJlaOoaQyaQAaOraOtaOtaOuaMZaOwaNdaKZaOyaOzaOAaOAaOBaLfaQEaODaOEaOEaOEaOEaOFaOGaQJaOIaOJaOKaOKaOLaQTaLfaJRaIgaONaOOaNjaOfaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaRbaQbaQbaRraQeaQfaQgaKZaQhaMCaQiaQjaQkaLfaQlaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJRaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaRxaGFaIoaIoaJVaIoaSoaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaStaQFaQGaGOaQCaQHaQIaBIaSuaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaSHaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaSIaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZaSEaLfaRyaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJRaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaSZaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaPiaPiaNkaPiaNlaIAaSmaNnaSnaIAaLKaLKaTPaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKaUjaLKaNraQPaUlaSvaSwaSxaNraReaSyaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaQqaQaaQaaQaaQaaQaaQaaSQaSRaSSaSTaUOaSVaSWaSXaSYaKZaKZaVeaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJRaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaVfaVraVkaVIaVzaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAaVLaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeaUfaUgaUhaUeaUiaLKaLKaWoaLKaLKaLKaLKaUkaWwaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaUxaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaUJaUKaULaUMaUNaWFaUPaUQaURaUSaUTaTfaUUaUVaRCaUXaUYaUZaVaaVbaTeaJRaIgaVcaVcaRLaRMaVdaVdaWKaIgaIgaXlaIgaGGaVgaVhaViaViaViaVjaXnaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaVfcmVaXzaXIaDPaVsaVsaVtaVsaVsaVsaVDaVsaVsaVtaVsaVsaYEaWYaVuaVvaKdaKdaKdaKdaKdaVwaVxaVyaXNaIAaTQaTQaVAaTSaVBaTUaTUaTUaTUaTUaTYaVCaTUaTUaTUaUdaUeclraVEaVFaUeaUiaVGaVHaKeaKcaVKaUmaXXaVMaVNaVOaVPaVQaMkaSzaKOaUoaaaaaaaaaaaaaUpaUpaUpaUpaVRaSlaVTaXEaVVaSDaVXaXFaVZaSOaWbaUpaUpaUpaUpaaaaaaaaaaaaaUAaSNaRqaRpaWcaSSaSPaWeaTkaSSaTsaUWaWiaVSaWkaVWaWmaWnaQbaYqaWpaWqaWraWsaWtaWtaWuaWvaYwaWaaWyaWdaWAaWBaWCaWDaWEaTeaJRaIgaThaONaRLaRMaONaONaONaYxaWGaONaWHaGGaWIaWJaToaToaToaTqaIoaYsaGGaWfaVoaLuaWQaVoaWRaWSaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTGaGgaTHaGiaBIaBIaBIaWVaWWaWWaWWaWWaWWaWWaWWaWXaBIaBLcpSaWZaIAaXcaXbaXbaXbaYraXdaIAaIAaIAaIAaTQaXeaXfaTSaXgaTUaTUaWgaXiaXjaXkaWgaTUaTUaTUaYyaUeaXmaYAaXoaUeaUiaVGaXpaKfaXraXsaUmaXtaVPaXuaXvaXwaXxaMkaSzaKOaMmaSCaMbaXyaUpaUpaVYaXAaYVbcBaXDaXDaXEaXFbcCaXEaXFaXDaXDaXHaZnaXJaXBaUpaUpaXyaJlaXLaXMaSNaRqaRpaJlbanaSPaXOaTkaSSaXPaXQaSSaWhaXSaTkaSSaXTaOtaXUaXVaUQaXWbaCaXYaXZaYaaYbaYcaYdaYeaWjaYgaWBaYhaWDaYiaTeaJRaIgaYjaYjaRLaRMaWlaONaONaYlaONaWzaWxaGGaIoaXRaXhaToaYfaYkaZXaWLbaOaYmaWOaZcaVoaYvbaNbaWbaPaYzbaYaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDbbfaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafaYCaYDcpKaYFaWPaYHaYHaYIaYJaYKaYLaYMaYNaYOaYPaYQaYRaYSaTSaYTaTUaTUaWgaXjaYUbbTaWgaTUaTUaYWaUdaUeaUeaUeaUeaUeaUiaVGaVGaVGaVGaVGaUmaYYaXvaYZaXvaXvaXxaMkaSzaKOaNSaNSaZaaZbaWNaUpaZdaYnaZfbbRbbSbbcbbebaXbaVbaUbaTbbbbbabaZaZfaYoaZjaUpaWMaZbaZlaZmbbhaSNaRqaRpaWcaSSaSSaSSaSSaSSaXPaZoaSSaWhaZpaTkaSSaXTaOtaZqaXVaUQaZraZsaZtaZuaYaaYpaZwaYdaYeaWjaYgaWBaYhaZxaZyaZzbbDaZzaZzaZzaZBaZCaZDaYtaOOaZFaZGaZHaZIaGGaZJaYXaYGaToaZeaYGaIoaIoaXaaZiaVoaYuaVoaZNaZOaZPaZQaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaZSaZTaZUbjnaZWaSFaZYaZkbaaaZvbacbadbaebafaYObagbahbaibajaTSbakbalbambbLbaobapbaqbarbarbarbasbataTSbaubavbawbaxaKgbajbnZaKhbajaaaaUmbaDbaEbaFbaGbaHbaIaMkbaJbaKaMkbaLbaMbbPbcybbQbfAbaRbaQbfwaUpaUpaUpaUpaUpbcDaUpaUpaUpbgUbaQbbdbgWbbWbeobcabbibbjbbkbblbbmbbnaJlaUDaSPbboaTkaSSaZAaZEbbraZKaXOaTkaSSaXTbbtaULaXVbbubbvbbwaUQaUQaYabbxbbybbzbbAbbBaYgaWBbbCaWDbcuaZzaZLbbFbbFbbGbbHbbIaRLaRLaRLaRLaRLaRLaRLaGGbbJaXRaXhaToaYfaXhaIobbKaGGbcPaVoaYuaVoaZNbbMbbNbbOaafbcTaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdKbdtbeabdQbbUaSFbaabaabaabaabaabbVbaabeeaYObbXbbYbaibbZbbZbbZbbZbekbbZbcbaTUbccbcdbcebcebcfbcgaTSaXebchbcibcjaKibeBblcaKkbcobcobcpbcpbcpbcpbcpbcqaMbbcrbcsbctbeMbcvbcwbcxbbgaUpbczbcAbezaUpaUpaaaaaaaafaafbcZaaaaaaaUpaUpbcFbcGbczaUpbbgbcxbcHbcIbcJbcKbcLaRpaWcaSSaSSaSSaSSaSSaGpbcMaSSbcNaSSbcObcObcObcObeNbcQbcRbcSaUQaUQaUQbeRbcUaTeaZMbcWbcXaYgaWBaYhaWDbcYaZzaZZbdabdbbdcbddbdebddbddbddbddbddbdfbdgbdhbdibdjbdkbdlbdmbdnbdobdpbdqbdraVoaYubdsaZNaVobeVbbOaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaYHbabbaaaZvbdzbbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZbdHbdIbdJaTSbeWbdLbdMbdNaTSaXebdObdPbdPbfqbdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXbdYbdYbdYbdYbdYbdYbdZbfxbdZbdYbebbebbebbebbebbecbebbebbebbedbedbfybedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbfWbelbcObcObembenaZzaZzaZzbguaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbgMbbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafbgXaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbhebeObePbeQbhCaRtaYHbeTbeUbhJbdzbbVbhLbhKaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeWbdLbdMbfdaTSaXebdObdPbfebffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbfobfpbhNbfrbfsbftbfubdYbebbfvaXGbfvaXCaSUbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbhRbfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhSaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeWbdLbdMbfdaTSaXebdObdPbgBbgCbgDbfgbgDbdPbfibgEbgFbgGbgHbgIbgJaMbbgKbgLbctbhTbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbaSbaBbfzbgYaZhbebbedbhabhbbhcbeCbhVbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhWbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIbhXbiqbidbhMbitaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaafbhPaYDbhQbjubjqbjwbjvbjCbjBbjwbjGbjQbjObjVbhYbhZbgwbbZbbZbbZbiabfabbZaTSaTSaTSaTSbeWbibbicbjYaTSbiebifbdPbigbihbiibgDbijbdPbfibikbgFbgGbgGbgGbilaMbbimaSzbctbjZbiobipbfjbirbisbfBbiubjMbdYbebbiwbixbiyaZgbiybgYbgebebbedbiAbiBbiCbgQbiEbgZbiGbiHaJibiIbiJbiKbiLbiMbiNbiObiObiPbiQbiRbiSbiSbiSbiTbiSbiSbiSbiSbiSbiUbiVbiVbiVbiWbiObiObiNbiObiObiXbiVbiVbiYbiSbiZbjabjbbiSbjcbiObiObiObiObiObiObiObiObiObiObiObiObiObjdbiTbjebiSbjfbjgbjhbjibjibjjbjkaZNaWRbjlaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbkkbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZaaaaaaaaaaTSaTSaTSaTSbkxaTSbjxbdObdPbjybjzbgDbjAbkAbdPbfibfmbkHbgGbgGbgGbjDaMbbjEaSzbctbkKbnWbgObhdbjIbjJbhfbjLblybdYbjNbkMbjPbiybkNbiybgVbkPbjSbedbjTbjUbizbjWbjWbjWbjXbkVaJibkXbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkYbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktbkubkvbewbkpbkwbkZbkybhFbewbewbkzbewbewblBbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblCbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOblTblEbmlbmdbkObgrbmxbkQbkRbkRbkSbkTbkUbmEbmFbmFbmNbmHbbZbbZbbZbeZbmUbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbllbfmblmbgGblnbgGbloblpblqaSzbctbdYblrblsbltblublvblwblxbdYbdYbebblzblAbnbbmVblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbnsaZzaZzaZzaZzaZzaZzbnwaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbnNaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbnPbmjbmkbmkbnRbbZbdDbmmbeZbmnbbZbmobmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbnSbfgbmybmzblfbmAbfmbmBbgGbgGbjHbmDbnUblqaSzbnVbmGbmGbmGbmGbmGbmGbmGbkLbmGaafbebbmIbmJbmKbmLbmKbmMbjKbebaafbedbmObnXbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTboibolbmWbmXbmYbmZbnabopbjRbndbnebjRboKbmCbnhbnibnjbmPboWbnmbnnbnobnpbnqbnrbpobntbntbnubYfaVJblOblObpsblObZMbZMblObnzbnAbnBblObZtbpwbZtblOblXblYbmbblObZnbpBbZnblObnGbnHbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaabpLbnObpMbeQbnQbgrbpPbpNbpSbnTbqcbpTbjpbqgbqsbnYbnZbnRbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbohbqtbojbgGbgGbgGbokblpblqaSzbqxbmGbombonbncbcEbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbqyboPboQboRboRboSboTboUboUboVbnlboXboYboZbpabpbbnnbpcbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbpmbpnbnybppbnCbnDbpqbqBbptboobqKblOaZzbqQbpxblObpyboqbpAbrcbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbrkbgrbrubjpbrwbrvbpQbpRbrybrxbrCbrCbrCbrDbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPbpZbqabqbbrIbqdbqebqfbrPbqhbqibqjbqkbmAbqlbojbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbshbxsbotaafbebbebbebbebbsjbebbebbebbebaafbedbqzboCbqAbslbqCbqDbqEaJibqFaRqaRpaJibqGbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPbsnboYbqRbqSboNbnnbqUbqVbqWbsobpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbsqbrdbrdbrdbrebrdbrfboObrhbribrjbsrbnIbrlbpCbrmbrnbrobsvbnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbsybsHbsBbthbthbtlbrzbrAbgrbtkbtmbtBbtvbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbtIbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObtKbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabsebscbotbosbotaafbsibtOcLQbtTbsmcLRcLQbuibsiaafbedbspbuobspbedbedbedbuxaJibssaRqaRpbXHboJbngbstbsubuTbqLbswbqNbsxbuUbszbsAbuYbsCbqObsDbnibsEbsFbsGbuZbnnbsIbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNbsObsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabtbbtcbtdbnIbrqbpFbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbvabtibtibtibtjbtibtibgrbvqbvjboAbvCbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubvEbtwbtxbtybtzbtAbfmbfmbvFbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbvIbmGaafbtJbvObtLbtMbtNbtMbtLbvZbtPaafbspbtQbtRbtSbwcbtUbspbtVaJlbtWbbmbwgaJibtYboibtZbuabubbucbudbuebufbwlbuhbwnbprbukbulbumbnibnnbunbpubupbnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbwxbplbplbsMbuybuzbuAbpvbuCbuDbuEbuFbuGbrhbuHbuIbuJbnIbuKbuLbuMbtbbpCbuNbnIbpEbpFbuObnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwZbeObxmbxmbuVbpHbuWbgnbgobuXbuWbgrbxpbjpbxvbvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvibxzbvkbvlbvmbvnbvobfmbvpbgGbxDbpzbvsbvtbvubvvbmGbmGbmGbvxbvybvzbvAbvBbvwaafbpObxHbvHbvJbvKbvMbvNbxIbpOaafbspbqMbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbvYbxObucbyobxTbyKbwdbwebwebwfbyMcdWcdVbwjbwkbyObwmbwkbwkbwkbwkbyQbwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbqTbwvbwwbyUbwybnIbwzbwAbwBbwCbpCbwDbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbzrbxabgGbgGbugbxcbvtbvubxdbxebxfbzHbujbxibxjbxkbxlbvwaafbxrbzNbzJbzObyLbxobzPbzVbxraafbspbqwbAebuBbedbAibspbtVaJlbxwbcLaRpaJibxxbxybAobxAbxBbxCbAtbxEbxCbxFbxGbAubxFbwkbAxbxJbwkbwkbxKbxLbxMbxNbAAbxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbyabwsbwsbwsbsSbwtbybbwwbvDbUabTQbwwbyfbygbyhbyibpCbvLbnIbrqbykbnMaaaaaaaaaaaaaaaaafbwGbwHbrgbwJbwJbwKbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbAFbypbAFbyqbyrbwQbrJbrJbrJbysbrJbwTbrKbytbdPbdPbyubgGbrNbwXbyvbywbyxbyybyybyzbyAbyBbyCbyDbvsbyEbvPbyGbxkbyHbyIbyJbvwaafbxrbxrbxrbxrbALbxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbAVaJibyPblMblNaJibwbbyRbyRbySbyTbxCbAXbyVbyWbyXbyYbyZbzabwmbzbbzcbzdbzebzfbzgbzgbzhbzibzgbzjbzkbckbaAbwubclbBqbcnbBsbzsbztbzubzvbzwbppbzxbpqbpqbzybsSbwtbzzbzAbzBbzCbzDbzAbzEbzFbzGbBtbzIbwwbwwbBwbnMbnMbzKbzLbzLbzLbzMbCJbylbymbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBxbzQbBxbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPbBAbgGbrNbBEbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbBJbAhbBQbBKbBRbAjbBSbAjbAjbyNbAkbAlbAmbAnbBUbApbAqaJibAraRqaRpaJibxbbwYbxhbAvbAwbBXbAybAzbCcbABbACbADbAEbCdbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbCnbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbBabBbbBcbppbBdbBebBfbBgbBhbBibBjbBkbBlbBlbBmbBnbBobTHbCobBrbCrbCwbTIbBvbCAbCHbCEbCIbwGbwJbrgbwJbwJbCKbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbCLbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbBGbgGbBHbBIbgGbCYbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbBNbBMbBObvwbDabCZbDcbDbbDebhUbDgbskbDibtXbBVbyNbBWbzmbBYbBZbCabCabCbbDjbAraRqaRpaJibAsbCebCebySbCfbxCbCgbChbxCbCibCjbCjbCkbwkbClbCmbwkbwkbwkbwkbwkbwkbDwbwkbwkbwmbDIaXKaXKaXKaXKbDKbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbDYbCsbCtbBhbCubCvbEibCxbCxbCxbCybCzbEjbCBbCCbCDbEkbTGbCGbEpbCGbErbEsbBzbuQbuRbEubuRbuQbBBaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBxbzQbBxbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbCQbgGbrNbwXbgGbqlbCRbgGbgGbEwbxcbvtbAbbCTbxcbCUbvwbCVbECbCXbAWbxlbvwbHjbHabGWbAhbEMbEMbEMbAjbEUbERbHlbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbEWbDvbEXbDxbDybDzbDAbyWbDBbEYbCjbDDbwmbDEbDFbwmbDGbDHbEZbDJbFabDLbDMbCpbDNbDObBTbDQbDRbCpbVLbVMbDUbVAbDWbDXbDXbFbbDZbEabEbbEcbEdbEebEfbEabEgbEhbCvbFobFcbFrbwwbwwbwwbwwbwwbFVbFFbEnbzKbzMbCJbEobGfbCJbzKbzLbzMbGgbCJbGhaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGibExbGibEybEzbEAbEAbEAbEAbEAbEBbGjbEDbzTbEEbdPbEFbEGbEHbEIbEJbGubGkbGCbGAbGvbtCbENbAbbEObEPbyEbvwbEQbGDbESbBMbETbvwbBPbEVbGEbAhaaaaaaaaabAjbEKbHibELbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHmbFjbFkbFlbFmbFnbHMbFpbFqbxCbxFbxFbHNbxFbwkbFsbFtbFubFvbFwbFxbDJbFybDLbFzbFAbFBbDObFCbFDbFEbHObVlbDXbHPbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbFQbFRbFSbCvbHQbFUbHRbFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHSbHSbHUbHZbHVbIfbEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbIobGtbGvbGwbGxbGybGzbtCbvtbAbbIvbGBbtCbtGbtGbtGbtGbtGbIAbtGbtGbtGbIBbtGbDfbDhbDdbtGbIDbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibxwaRqaRpbHmbIMbFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbIUbGXbGYbGZbIXbHbbHcbHdbHebHfbCpbUSbUfbwwbwwbwwbwwbwwbJbbwwbwwbwwbzAbJqbzAbzAbHkbBhbCubCvbHQbJrbJDbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbEobCHbBybJVbKfbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbHvbHwbHxbHybGvbHzbKobHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbKzbKUbKBbKVbAabAabLabLxbLnbAabHTbAabzZbHHbKJbHWbHXbHYbLzbxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebLIbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqbIrbFDbIsbItbIubCpbLYbIwbIxbIybUdbLybMhbICbMibUcbIFbIGbIHbIIbIJbzAbIKbCubCvbMpbMlbINbIObIPbIQbIRbGabGbbISbEnbEnbEnbCJbCJbCJbMCbMqbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabMHaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbITbEmbIVbIWbMPbIYbIZbJabMSbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebNdbJkbJlbNfbJnbJobNkbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbNqbGHbDzbHAbFibDVbxFbNBbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbNLbJWbNQbJYbIFbJZbKabKbbKbbzAbKcbKdbKebNZbKgbKhbKibKjbKjbKkbGabGbbKlbEnbKmbObbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbOcbKAbIVbKAbOdbKCbOfbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbOnbOibKWbKXbcLbKYaRpaRpaRpaJlbOtbFlbFnbOIbJmbONbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbLpbLqbLrbLsbLtbCpbLubLvbIxbLwbFGbLybOQbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbLFbCvbwwbLGbLHbORbLJbLKbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbLWbLXbOTbLVbLZbMabMbbGtbMcbMdbMebMfbMgbPvbOUbMjbMjbMkbtCbtCbtCbPAbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbPCbtCbtCbtCaJlaJlbPDaJlaKSaMpbMraJlbKZbJXbPFbGFbLdbxCbDzbLDbxCbMybMzbMAbMBbwkbPHbMDbMEbMFbMGbPSbMIbMJbMKbMLbItbJObFDbFDbMMbJObCpbMNbMObMObMObMObMObMObMObMObMObMObPXbMQbMRbMRbzAbQjbMTbMUbwwbMVbMVbMVbMWbMXbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbQpbLRbLRbNebKtbKtbLTbLTbQubLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbQBbNlbNmbNnbKAbNobNpbGvbQXbNrbNsbNtbGvbNubNvbNwbNxaaaaaaaaaaaabNybNzbNAbRdbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbRebNMbNNbNObNPbRvbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbRxbOabRybMzbMvbMubOebRzbOgbOhbRAbOjbMxbMwbOmbNhbMKbOobFDbFDbNVbJObJObOobCpbMNbMObOqbOrbOsbRBbOubOvbOwbOxbMObOybOzbOAbOAbzAbOBbOCbCvbzIbMZbOEbODbOGbOFbOJbOHbOLbOKbOMbVFbMVbRWbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbQpbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbSgbScbKAbOSbSubSnbKAbSwbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbPebPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNXbPobPpbPqbPrbPsbPtbPtbNSbPubSEbPwbPxbPybDtbNYbLbbSVbGFbGFbSWbDzbTgbxCbTAbPEbTObPGbwkbUbbPIbwkbOkbPKbPLbOlbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbUobMObPTbLEbPUbPUbzAbBhbPVbPWbUqbPYbPYbPZbQbbQabQdbQcbQgbQebQgbRDbMVbQfbRFbOObQhbUwbOpbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobUPbQqbQrbKAbKAbQsbQtbURbQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbUWbQCbQDbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFbQLbQMbQNbQObQPbQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbPnbGFbQVbVjbGFbPzbDzbLebRCbQZbPBbVkbRcbRGbDEbIkbSpbOkbPLbPLbOlbRfbMKbRgbRhbPJbRjbRkbRlbPMbRnbPObMObOsbOsbRobOsbOsbOsbOsbRpbMObRqbLEbRrbRrbzAbRsbRtbRubVmbRwbVybRJbSMbSrbSObSNbSQbSPbSSbSRbWobREbUkbWVbRHbRIbQibRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabLVbRMbRNbRObLVbRPbMabMbbGtbGtbRQbRQbRQbGtbGtbNxbRRbRRbRSbRSbRSbRSbNwbQyaaabRTbRUbRVbXcbRXbRYbRZbSabSbbSbbXebSdbSebXfbNFbPtbPtbPtbPtbPtbXpbPtbPtbShbSibSjbNUbPxbSkbSlbDtbQHbLbbQVbSmbXqbPzbSobJAbJBbSqbRabSsbStbJzbFsbSvbIEbSxbRibRbbSAbSBbMKbRmbSDbXvbRjbSfbSGbXxbRnbPObMObMObMObRobOsbOsbOsbMObMObMObSIbSJbRrbRrbzAbSKbSLbCvbzIbUGbVvbUObQdbVzbVObVGbWibWgbWMbWkbMVbQfbYwbOObSXbSYbSybTaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbTcbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTdbKwbTebKwbTfbYHaafaaaaaabGtbThbTibTjbGtaaabNxbTkbTlbTmbTnbTnbTnbTobQyaaabQzbTpbTqbTrbTsbPfbTtbTvbTubTwbNFbSzbTybTzbYMbTBbTBbTBbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbLfbLkbLcbDtbTJbTKbTLbJFbJEbTJbRybLlbLmbTRbTSbTJbMKbMKbMKbMKbMKbMKbTTbTUbTVbRjbTWbTXbTYbRnbPObMObTZbQWbPQbYYbYSbNWbNcbTZbUgbUhbUibIIbIJbzAbIKbSLbUjbwwbMVbMVbXabXibMVbMVbMVbMVbXubSCbVFbMVbZbbUnbOObUpbZcbUrbOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUsbUsbUsbUsbUsbUsbUtbLTbUubUsbTcbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMHaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbZibNwbUxaaabUybPcbPcbUzbUAbPfbPfbUBbPfbSFbNFbUDbSHbSTbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUNbSZbTxbUQbZrbwabUTbUUbTMbZsbTNbUTbUYbUZbVabVbbUebTPbVdbVebVgbVhbVibUlbZubUmbRjbUCbZvbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAbZzbzAbzAbVwbCxbSLbCxbVxaafbnxbYabYoblSbVBbYtbYZbYzbZebUVbMVbVHbVIbOObVJbVKbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbZCbLUbKuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVPbVQbVQbVRbVSbNxbVTbRSbVUbNxaaaaaaaaaaaabNybVVbVWbVXbVZbVYbPfbNFbWabWbbNIbNFbSUbUXbVfbVcbVDbVCbVEbSUcaqcaqcaqcaqcaqbTFbWjbZLbWlbWcbWdbZVbWpbxgbWrbWsbWtbWubWtbWvbWtbWwbWxbWybWzbWAbWBbWAbWCbWDbWEbWFbWGbWebWIbWfbWKbWLcaabxVbMObxWcanbzlbWSbWTbWhbWSbWScaxbWWbWXbWYbWZbCxbCxbSLbCxbFTaafbnxbZBbZBbXbcaWbXdcbibZObXgbXhbMVbVHbZPbOObOObOObOObOOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbQmbQmbQmbQmbQmbQmbXkbLTbQlbQmbXlbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmcbkbWmcbmbRScbnbXrbRSbXsbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUDbUEbXtbNFbSUbWnbWJbWHbWHbWJbWRbSUbXnbWUbWUbXocaqbXBbDtbDtbXCbXDbXEbXFbXGblRbXIbXJbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbznbzpbzobAPbzqbARbAQbATbAScbrbAUbYfbYgbIwbYhbVobCqbWObWNbWPbYmbYncbtbYpbYqbYrbYscbybYrbYubYvbILaafbnxcaJcbdbrBbVBcbecbgcbfcbjbYAbMVbVHbYBbYCbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbXlbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYDbVQbVQbVRbYEbYFbYGbNxcbDbNxbYIbYJbYKbYIbYIbYLcbJbYNbYObYPcbLbXwbXzbXybYebXAbYjbWJbYybYxbYRbYQbYTcbObYVbYUbYXbYWcaqbZhbNScbQbZjbZkbZlbZlbZmbnEbZobZpbTJbTJbZqcbWbTJbTJccncccccrcaIccubWQbZxbZyccEbZybZAbZaccGbZabZAccJbYfbMNbIwbZEbXWbXVbZdccMbZJbZKbMObMObwwbwwbwwbwwbwwboIbnFbofbwwbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVcbAbZQbZRbUnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaambZSaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaabZfbZgbZgbZgbZHbZgbZgbZTbZIbYIbZYbZZbYIbZUcabccQcadbZWcafccSbZXcaecaccahcagcaibWJbYycajcakbYQcalbSUcaqcaqcaqcaqcaqcarbNSbDtcascatccYcamcawcdjcaycazbTJcaocaBcaCcaDcaEcaFcaGcaHcaIbZxbWQcapbZycaKcaLbZAcaMcaNcaObZAbXXbYfbPObIwbXYcdmbXZbXYbXYbIwbIwbIwcaRcaScaTcaUcaVbwwbwwcdpbwwbwwcaXcaYcaucaAcavcctcaZcbacbccfeccvcLKcLJcbhbUnbUnbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbUubUsbUsbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbbcdNcdBcblcdTcdYcdUcbpcbobYIcdZcbsbYIbYIcebcbucbvcbwcbxceccbqbXzbXybYecbzcedbWJbWJcbBcbCbWJcefbSUcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJceicbEbTJcbKcbMcbNcelcaEcbPcerceucaIbZxbWQcbRbZycbScbTbZAcbUcbVcevbZAccqbYfbYbbYdbYcbYiccsccAbYccexbYkbYlcktbZDbZwbZFcktceCbZGccCccBceHccDccPccFceKceIcLMcLLceIcficLOcLNcLPccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbQpbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafccRccRcdBccTcfjcdYccUccWccVbYIcfkccHccIcfmccKccLcfsccNccOcfuccXcdaccZcdecdbcfGcdycdQcdFcekceecemcfIcdccddaJEcdfcaqbTFcbIcdgcdhcdicfLcdkcdlcfMcdncdocfRcdqcdrcdscdtcaEcducdvcdwcaIbZxbWQcenbZycdxceobZAcdzcdAcepbZAcaPbYfbYfcaQbYccbYcbXcbZbYcchBccacjfcdLcdLbyFbBucdLcdOcdPceqcdRcdOcdSbBpbyebydcdScdScdScdScgebyebydcdScdSbXjcdXcgmcgfceacgocgCcgBbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycbyccgOcegcegcehbKtbKtbLTbLTcgRbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejcetcesbYIbYIbYIbYIbYIchbchnchichichichpcewbXzbXybYeceybYjceEceTceSceWceUceXbSUcezaJFceYaJFcaqbTFcbIceDcfacfacfaceFceGbTJchuchqbTJcbKcbNceJcelcaEchzceLceMcaIbZxbWQceNbZyceOcePbZAbZAbZAbZAbZAccbceRbYfcaQbYcccdchLbYcbYcchBccecjfcdLceZcfbcfbcfccdOcfdchPcffcdOcfgcfhcfhcfhchSciycifcflciCcfncfocfpcdScfqcfrciLbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcftcfBcfvbNebKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcfwcfxcfycfzcfAcejcfDcfCcfFcfEcfHciPciVciVcfKcfJcfJcjacjlcbqbXzbXybYecfNcaicfOcfQcfPcfUcjqcggbSUaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcfZcgacfYcgbcgccgdcjtcaEcjvceLcgicaIcghccfcgjbZycgkcglbZycjCbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLcjIcgycgycgzcgActscgrcgpcgucgtcgGcgGcgGcgxcgIcgIcgJckncgLcgDcgMcdScgNckocgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaaaaacgScgTcgTcgTcgUcgVcejcgHcgFckCcgKcgXcgWcgZcgYchdchachYchcchfchechhchgchjckNbSUbSUbSUbSUbSUbSUbSUbSUclfckQcaqclgcaqbTFcbIcbIctpctqctrcbIcbIchrchschtcfYcaEcaEcaEcaEcaEcaIchkchlcaIchwclpchwbZychychmbZychAchBbVichCbVichDbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLchIchJchJchKcluchMchochOclCchQckLckLckLckLclGchvckLclVckLchEchFcdSchZciachGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcmgchHcgEchNcmkchNcgEchRcmpchRcgEaaaaaaciicgTcgTcgUcgUcijcejchUchTchWchVcjpchXcidciccmwcieciecigciecbqbXzcihbYecikcimcilciocinciocipcirciqciqciAciAciAciAbTFciGciHciIciIciJciKcmGciMciXciOcmPciQciRciSciSciTciUcaIcaIcaIcmQcdEckqbZybZybZybZychBchBbViciYbViciZbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjgcisciucitcjjcjkcivcjmcjncjociwcjocjocixcjrcjscgIcmRcgIciWcjucdScmXcjwcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcjbchHcgEchNcjcchNcgEchRcjdchRcgEaaaaaaciicgTcgUcgUcgUcjBcnecjhcjechWcjickFcnfcnhcngcjzcjycjDcjAcjEcbqbXzcjFchjcjGcnucjHcjJcjJcjJcjKcjMcjLcjNcnwcjOceAciAbTFciGckaciIckbckcckdcubckfckgckhctQckjckkcklciSckmciUcnEcnFckpcjQcjPcdHcdGcdIcdIcdJcdIcdKbVibVibVibVibYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcnIcjRcjTcjSckEcdOcnKcdOckGckHcjXcjUcjUcjYcgIcgIckecjZcjUckickOcdSckPcnLckRcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEckrckuckscgEckzckBckAcgEckDckJckIcgEaaaaafciiclbcgTcgUcgUcgUcejckMckKchWchWcmschWchWchWchWckTcieckWckYcbqclackZcldclccnPcleclhclhclhclicljcljclkciAcllcgqclwclxciGclyciIclzclAclBcnQclDclEclFcolclHclIclJciSclKciUconcoqclNclnclmclQclNclRclSclTbYfceQcdIcdIcdIcdIcdIcltbYfaaaaaaaaaaaaaaaaaaaaacdLcmacmbcmccmdcdOcmecmfcorcdScmhcmicmicmiclvcotcmlclPclOcmicmicmncdScmocpdcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmmcmjcgEcmtcmmcEgcgEcmtcmmcEgcgEaaaaafcmzcgTcgTcgUcgUcmAcejcmvcmucmxcpfcmBcmycmCcmCcmEcmDcmCcmFcpgcbqcmIcmHcmKcmJcimcmLcmLcmMcljcmNcpocmOcmOciAcibceVcprcqgciGcnbciIcnccndcpAciGcmSciNcmWcfYcpOcnicnjciScnkciUclLclMclNcnlcqecnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnocnpcnqcdScdScnrcnscntcdScdScdScdScqrcnscntcdScdScnvcqscnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZSaafaafaafaaaaafcnxaafcnxaafcKAaafcnNaafcKAaafcnNaafaafaaacejcnAcnBcgUcgUcnCcnDcqAcqtcnycnmcoycnzcnzcqIcnzcnGcqOcnHcnGcnJcrzcrvcrQcnMcnOcnOcnOcnOcsecsdcnRcnRcnRcgscgscgscgscnSciGcnTcnUcnccnVcnWciGcmSciNcnXciUcnYcnZcnjcoacobciUclLclMclNcoccodcoeclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcofcogcohcwlcojcokcsfcomcsgcopcoocdOaaLaafaafaafaafaaaaaaaaacsiaaaaaaaaaaafcoscsncosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoucoBcoAcoxcovcowcoCcoxcoFcoJcoCcoDcoLcpycoEcnycnycnycnycnycnycnycnycoHcoGcpBcoIcpCcoKcoNcoMcoOcnGcoQcoPcoRcnGcoTcoScoUcnOcoWcoVcoYcoXcpacoZcpjcpbcpbcpkcpncpncpjcsDciGciGcpccsLciGciGciGcpeciNcsMciUciUciUctbcphciUciUclLcpiclNcvmcpscvmclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcplcpmcplctictccppcpqcomcomctkcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaactmaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcpGcpucpxcpwcpFcpHctxcpzcpNcpIcpEcpDcpPcpFcpLcpJcpRcpMcpQctBcpUcpTcpWcpVcpYcpXcqacpZcqccqbctIcqdctOcqfctScqzcoTcqJcqKcnOcpacpacpacpacpacqMcpjcqPcqPcqPcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcqmciUcqncqocqpcqqciUctTclLcpiclNctVcqQcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoicuacqBcqCculcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcqRcqYcqScqVcqUcpFcqXcpFcvWcqYcqXcpFcvWcqYcpFcpFcpFcpFcpFcqZcpFcpFcpFcrbcqDcrdcrccurcpZcrfcrecrhcrgcrjcricrlcrkcoTcqJcrmcnOcrncpacpacrocpacrpcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrrcrscrtcrucuycrwcrxcrycuEcrAcrBcrCcrDciUcrEcrFcrGcrHcqvcuLcqvcrHaaaaaaaafaaaaaaaaacqvcrRcrTcrScqvaafaafaaaaaaaaacdOcomcomcomcomcrMcppcrNcrNcrNcnpcrNcrOcdOaaaaaaaaaaaaaaacrPcrPcrPbZSaafaafaafaafcnaaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpFcrccpFcrccpFcqXcpFcqLcxacqNcxacqWcxacxacrUcracpFcpFcuYcuUcuUcuUcvncrVcvscvscvtcpZcvvcshcsjcnGcsmcskcvEcnGcspcsocsrcsqcstcsscsvcsucpacswcpjcsxcrKcsycrKcsKcpjbTFcizciGcszcsAcsBcsCciGcfYcvGcfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsNcvOcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcrXcsVcsUcrZcqNcxacsacxacxacsccsbcwacvRcwzctacsWcsQcsQcsXcrccrccthctgctjcwHcnzcnGcwUcnGcnGcnGcwWctlcsrctncttctoctyctucpacwZcpjcxqcrKcsycrKcxrcpjctvctwciGciGcxsciGciGciGciBctzctAciUciUciUcxFciUciUcsIcrGaaacqvctCctZctEctFctGctHcxJctJctKctLcqvcuVcxVcuVcqvcyactPcqvaafaafcdOcplcplcplcybctcctRcuccycctUcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcsOcsTcsTcsTcrXcsTcsTcsTcrXcsTcsTcsTcsTcsTcsYcygcsTcyhcsTcsZcsTcsTcsTcuhcugcuicpvcpFcujcyicukcuncumcupcuocumcuqcuscymcuucutcutcuvcutcuwcypcuxcuAcuzcuBcuBcpjcuCcuDcyrcuFcuFcuGcuHcuIcuJcuJcuJcuJcuJcuJcuJcuJcuKcrFcrGaaactFcyzcuPcuNctFcuOcuRcuQcuQcvdcvacuQcuQcvhcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcyHcuZcvicvbcvccvjcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFcurcpFcuecpFcyRcyJcvpcvocvrcvqcyScvqcyZcvucvxcvwcvycvucvucvzcvAcsecvBcpacvDcvCcpacpaczBcrKcrKcvFcuBcuBcpjbPxcAscvNcvNcvNcvNczFcvNcvNcvNcvNclMcvPcrGcrGcrGcrGcrGcrGaaactFctFczLctFctFczMcvScvTcvUcvVcvHcvJcvIcvLcvKczVcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicwecwfcvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaabZSaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFcurcpFcufcpFcpFcufcufcvkcpFcpFcvZcvYcwgcwgcwgcwgcvlcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcwucrKcwvcwxcwwcpjczXcvMcvNcwIcwJcwKcwLcwMcwNcwOcvNcwPcwQcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAcAHcwCcwBcwEcwDcwGcwFcwTcwScwVcAJcuWcuQcxecqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkcAUcxmcxncdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcvXcpFcpFcpFcvXcpFcpFcpFcpFcpFcvWcpFcpFcBkcwmcwXctdctdcwXcwYcwXcxlcxdcxoctdcxtcxpcyucxHcyEcwkcoTcxucoTcxvcxwcpacpacxAcpacxBcpjcxCcxCcxDcwxcwwcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcxRcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUcBscxWcxXcxYcxZcuTcBzcuScxEcuTcBIcqvcqvcqvcqvaaaaaacdOcplcpmcplcBOctccppcrNcrNcyecyfcrNcBRcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBSaaaaaacBSaaaaaaaaacBSaaaaaaaaaaaaaaacBSaaaaaaaaacBSaaaaaacBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFczmcrWcrWczpcxGcrWczpcrWcxIcCccuUcuUcCfcuUcyFcuUcuUcvncCicufcpFcpFcyjcylcykcyncCncyocpFcCNcyqcyscyscyKcytcoTcxucyvcnOcywcpacyxcpacCOcyycpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcyMcyNcxLcyOcxLcxNcyPcvNcyQcCQcrGaaaaaaaaaaaaaaaaaacqvcuVcCYctFctFcyTcyAcyVcyWctMctDctNcyBctMcvhcyYcqvaaaaaaaaaaaacdOcplcplcplckXcDaczacrNcrNcrNcyfcrNczbcrNczccrNczdaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBScBScBScBSaaaaaaaaacBScBScBScBScBScBScBSaaaaaaaaacBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFcqXcpFcpFcpFcvXcpFcpFcpFcvXcpFcpFcpFcyCcpFcvWcpFcpFcpFcyDcufcpFcpFczncwYctfcyGcwgcDmcwgcwgcyqcDpcyIczocytcoTcxucoTcnOcyUcyLczecyXczfcpacnOczgczJczJczhcDtcDNczNczOcvNcxNczPczQcxNczRczSczTcvNczUcDOcrGaaaaaaaaaaaaaaaaaacqvczWcuMcDUcuVczYczZcAactFcAbcAccsPcyBczWczjcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgczkcAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaacBScBScBScBSaaaaaacBScBScBScBScBScBScBScBScBSaaaaaacBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaaczlcpFcqXcpFczqcxacqNcxaczrcxacqNcxaczrcxacxccxacxbcAhctectdcAtctfczsczucztczwczvczxcwgczzczycwgcwgcwgcwgcwgczAcrzcEccrzcnOcnOcnOcnOcnOcnOcnOcnOczDczJczJczEcANcAObPxcAPcvNcAQcARcErcATcEycAVcAWcvNcAXcAYcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBeczHczGczIcBeczKcqvaafaafaaaaaaaaaaaabquaaacdOcBlcEXcEBcBocBpcEXcFecBrcBpcEXcFgcdOaaaaaabZSaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaacBScBScBScBSaaaaaacBScBScBScBScBScBScBScBScBSaaaaaacBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZSaaaaaaaaaaaIaaaaaacAdcpFcqXcpFcAvcylcqXcpFcAwcylcqXcpFcAucylcpFcpFcAxcpFcAAcylcADcAzcAycABcBmcBncACcAEcwgcFrcAFcFCcAIcAKcumcAMcALcumcAScumcBfcuocBgcBicBhcBhcBjcFEcBVcBWcBWcBXcBYcAObPxcBZcvNcvNcCacCbcFFcCbcCacCdcvNcrGcFKcrGaaaaaaaaaaaaaaaaaacqvctFcFLcuVctFcCgcChcFUctFcCjcCkcqycgvcBtcCkcCocrHaaaaaaaaaaaaaaaaaacgwaafcdOcCqcFVclUcomclscFWclqcomclocGgclWcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaaIaafaafcAdcpFcBqcBycBxcBAcBucBCcBBcBEcBDcBGcBFcBHcpFcBvcGocBKcBJcBMcBLcnycnycnycnycnycnycnycnycGucBNczAcBPcBQcoTcGvcoTcoTcxucoTcoTcGAcoTcBQcBTcCpcBUcCrcGEcGOcGMcCPcHacAObPwcCRcCScCTcCacAGcAVcBwcCacCtcCscCucHjcCXaaaaaaaaaaaaaaaaaacqvcCvctDcuQcHCcDbcuQcDccDdcDeaafaaachxcCxcCwcCyaaaaaaaaaaacaaaaaaaaaaaaaaacdOcDhcplcplcomcDicplcplcomcDicplcplcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcCzaaaaaaaaIaaaaaacCAcCCcCecCEcCDcCGcClcCHcCDcCGcClcCHcCDcCGcCIcCIcCBcCHcCDcCGcCFcnyaaacCMcCLcCVcCUcCZcCWcDjcDgcDkcDkcHVcDlcDocDncDqcIAcDncDqcDocDrcIMcDscDrczAczAcAOcITcIRcDPcDQcAObNUcDRcDScDTcCacCbcIZcCbcCacDvcDucDfaafaaaaaaaaaaaaaaaaaaaaacqvcCvcDVcDwcDXcDXcDwcsPcDYcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDZcplcplcomcEacplcplcomcEacplcplcdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaaacrPaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcCJcCKcCKcDxcCKcCKcCKcCKcEicCKcGhcCKcEicCKcGhcCKcEicCKcGhcCKcCKcCKcGhcCKcGhcCKcKBaafaaacDzcDycDBcDAcDDcDCcDjcDEcDkcDFcDHcDGcDJcDIcDLcDKcDWcDMcDJcEbcEdcJhcDraaaaafcAOcJlcECcEDaafaaabNUbPxbPxbSkcCaclZcEFclYcCaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcEecuXcEfcEJcEJcEfcuQcEKcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcplcplcplcomcELcplcplcomcELcplcplcdOaacaaacrPaaaaaaaafaafaafaaaaaacmTaafaaaaaaaafaafaaaaaacrPaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaqaaaaaaaafcgEcmtcmmcEgcgEcmtcmmcEgcgEcmtcmmcEhcgEaaacgEcEgcmmcEhcgEaaaaafaaacDzcEjcElcEkcEncEmcEpcEocDkcEqcEscJpcDJcEtcEvcEucExcEwcDJcJzcEAcEzcDraaaaaacAOcJAcFhcFiaaaaaabNUbPxbPxbNUcCacmUcmUcmUcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcEEcFncuQcuQcuQcuQcuQcFocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcmYcmYcmYckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacmZaaaaaaaaacrPcrPcrPbZScrPaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaIaaaaaaaafcgEcEGcEIcEHcgEcEMcEOcENcgEcEPcERcEQcgEaafcgEcEScEUcETcgEaaaaafaaacDzcEVcDBcEncEncEWcEYcJBcFacEZcFccFbcJCcFdcFjcFfcFlcFkcFpcFmcJFcFqcDraafaaacFJcJVcJUcAOcKdaaabNUcFMcKocFNcFOaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcFPcFQcEfcEfcEfcFRcFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqpbqpbqpaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcfTaafcrPaaaaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaafaafcgEcFscFtcFscgEcFucFvcFucgEcFwcFxcFwcgEaaacgEcFwcFwcFycgEaaaaafaaacDzcCLcFzcEkcEncDCcFAcDEcDkcFBcFDcKpcDJcKqcFGcKDcFGcFHcDJcFIcFTcFScDraaLcKFcKEcKHcKGcKEcKEcKIbNUciEciDcGjaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGlcEJcEJcEJcEJcEJcGlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaaacrPaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcFscKJcFscgEcFucKKcFucgEcFwcKLcFwcgEaafcgEcFwcKMcFwcgEaafaafaafcFYcFXcGacFZcGccGbcGdcDEcDkcGecKNcGfcDJcGicGmcGkcKOcGncDJcGpcGrcGqcDraaacKQcKPcKScKRcKUcKTcKVcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCmcqxcqxcqxcCocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZSaaaaaacgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaacGscgEcgEcgEcgEaaaaaaaaaaaacBNcBNcBNcBNcBNcKWcGtcGtcGtcGtcKXcGtcGwcGycGxcGycGzcGtcGtcKYcGtcGtcGtcKQcKPcLacKZcLccLbcLdaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScGBcGDcGCcGIcLecGKcGJcLfcGLcLgcGNcGTcGPcGVcGUcGXcGWcGZcGYcHbcLhcGYcGtcKQcKPcLjcLicLccLkcLlaafaaacGQcHccGQcHccGQcHcaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGBcHfcHecHhcHgcLmcHicHlcHkcHocHmcHscHrcHucHtcHucHucHucHvcHucHwcHxcGtcLncKEcKEcKEcKEcKEcLoaafaafcHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaabgaaacBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGBcHfcHzcHBcHAcLpcHicHEcHDcHFcHbcHbcHbcHHcHGcHIcHbcHbcHDcHLcHJcHMcGtcGtcGtcHNaaaaaaaaaaaacHOaaacHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGBcHRcHQcHTcHScLqcHUcHXcHWcHZcHYcHYcHYcIbcIacIdcHYcHYcIecIgcIfcIicIhcIkcIjcImcIlcIlcIlcIlcIlcIlcIncIocIncIocIncHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIpcIrcIqcItcIscIucGJcIvcHbcHbcHbcIxcIwcIzcIycIBcLrcIDcICcIFcIEcIHcIGcINcIIcImcIOcIPcIOcIPcIOcIPcIOcIPcIOcIPcIOcHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaafaaaaaaaaaaaaaafaafcIJcIKcIKcIKcIKcILcILcILcILcILcLscILcGtcIQcHbcHbcHbcLtcGtcLucIScLvcGtcLwcJdcJicIfcJkcJjcLxcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBScBScBScBScBScBScBSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafczCaafaafaafczCaafaaaaafczCaafaaaaaaaaaaaaaaacIUcIVcIWcIXcIYcJncJacJbcJcciFcJecJfcJgcJecGtcLycJocHbcHbcJrcJqcJtcJscJucJqcJwcJvcIgcIfcJycJxcJLcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcydcxzcxycxxcxxcxxcxxcxxcxxcxxcxxcxxcxxcxxczicxzcxzcxzcLAcLzcLCcLBcLDcJDcJEcLEcJGcJHcJHcJHcJIcJJcJKcGtcJMcJMcHbcHbcJrcJNcJPcJOcJQcJNcJwcHbcIFcJZcIHcHbcKacGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcxfaafaaaaafcxfaafaaaaafcxfaafaaaaaaaaaaaaaaacIUcIVcJRcJScJTcLFcIKcLGcJWcJecJecJXcJXcJYcGtcJMcJMcHbcHbcJrcKbcJPcKccLHcKbcKkcKecKscKmcKucKtcKvcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaactYctYctYctYctYaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaafcHncwrcHpaaacHncwrcHpaaacHncwrcHpaafaaaaaaaaaaaaaafaafcKfcIKcIKcIKcIKcKgcKhcKicKicKjcKgcKgcGtcGtcGJcGtcGtcGtcGtcGtcKwcGtcGtcGtcGtcGtcGJcGtcGtcGtcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHncwrcHpaafcHncwrcHpaaacHncwrcHpaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacKxaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaacHqcKycHqcKycKzcKycHqcKycHqcKycHqcKyaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncwrcHpaaacHncwrcHpaaacHncwrcHpaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaLaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncwrcHpaaacHncwrcHpaafcHncwrcHpaafaafaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIbZSbZSaaIaaIaaaaaaaaaaaIaaIaaIaaIaaIaaqaaIaaIaaIaaIaaIaaIaaIaaIcKbaaIaaIaaIaaIaaqaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncwrcHpaaacHncwrcHpaafcHncwrcHpaafaafaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIbZSbZSaaIaaIaaaaaaaaaaaIaaIaaIaaIaaIaaqaaIaaIaaIaaIaaIaaIaaIaaIcKCaaIaaIaaIaaIaaqaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaafcHncwncHpaaacHncwncHpaaacHncwncHpaafaaIaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaIaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaamaamaaqaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaacHKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKaaaaaacKKaaaaaaaaacKKaaaaaaaaaaaaaaacKKaaaaaaaaacKKaaaaaacKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKaaaaaaaaacKKcKKcKKcKKcKKcKKcKKaaaaaaaaacKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaacKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgcKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaacKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKKcKKcKKcKKcKKcKKcKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlaaacKlcKlcKlcKlcKlaaacKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIaaaaaacLIaaaaaaaaacLIaaaaaaaaaaaaaaacLIaaaaaaaaacLIaaaaaacLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIaaaaaaaaacLIcLIcLIcLIcLIcLIcLIaaaaaaaaacLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaacLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgcKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaacLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLIcLIcLIcLIcLIcLIcLIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlaaacKlcKlcKlcKlcKlaaacKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlaaacKlcKlcKlcKlcKlaaacKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaacKlcKlcKlcKlcKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKncKnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 1a39f4702b..d0b1ebcfb2 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -153,7 +153,7 @@ "cW" = (/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor,/area/holodeck/source_thunderdomecourt) "cX" = (/obj/item/weapon/inflatable_duck,/turf/simulated/floor/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/holodeck/source_beach) "cY" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew14,/area/space) -"cZ" = (/turf/space/transit/north/shuttlespace_ns11,/area/skipjack_station/transit) +"cZ" = (/turf/space/transit/north/shuttlespace_ns14,/area/skipjack_station/transit) "da" = (/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_thunderdomecourt) "db" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area/space) "dc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area/space) @@ -348,42 +348,42 @@ "gJ" = (/turf/space/transit/north/shuttlespace_ns15,/area/syndicate_station/transit) "gK" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area/space) "gL" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area/space) -"gM" = (/turf/space/transit/north/shuttlespace_ns5,/area/skipjack_station/transit) -"gN" = (/turf/space/transit/north/shuttlespace_ns15,/area/skipjack_station/transit) +"gM" = (/turf/space/transit/north/shuttlespace_ns9,/area/skipjack_station/transit) +"gN" = (/turf/space/transit/north/shuttlespace_ns13,/area/skipjack_station/transit) "gO" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area/space) "gP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) "gQ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area/space) "gR" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area/space) "gS" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area/space) -"gT" = (/turf/space/transit/north/shuttlespace_ns6,/area/skipjack_station/transit) -"gU" = (/turf/space/transit/north/shuttlespace_ns1,/area/skipjack_station/transit) -"gV" = (/turf/space/transit/north/shuttlespace_ns12,/area/skipjack_station/transit) +"gT" = (/turf/space/transit/north/shuttlespace_ns4,/area/skipjack_station/transit) +"gU" = (/turf/space/transit/north/shuttlespace_ns8,/area/skipjack_station/transit) +"gV" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "gW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_mothership) "gX" = (/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) -"gY" = (/turf/space/transit/north/shuttlespace_ns2,/area/skipjack_station/transit) +"gY" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) "gZ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area/space) -"ha" = (/turf/space/transit/north/shuttlespace_ns8,/area/skipjack_station/transit) +"ha" = (/turf/space/transit/north/shuttlespace_ns12,/area/skipjack_station/transit) "hb" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area/space) -"hc" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_3_recovery"; pixel_x = 25; pixel_y = -25; req_one_access = list(13); tag_door = "escape_pod_3_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) -"hd" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) +"hc" = (/turf/space/transit/north/shuttlespace_ns7,/area/skipjack_station/transit) +"hd" = (/turf/space/transit/north/shuttlespace_ns3,/area/skipjack_station/transit) "he" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_mothership) "hf" = (/turf/space,/area/shuttle/escape_pod1/centcom) "hg" = (/turf/space,/area/shuttle/escape_pod2/centcom) "hh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area/space) -"hi" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) -"hj" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_5_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "escape_pod_5_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) -"hk" = (/turf/space/transit/north/shuttlespace_ns13,/area/skipjack_station/transit) +"hi" = (/obj/machinery/door/airlock/glass_security{name = "Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{id = "syndicate_elite_mech_room"; name = "Mech Room Door"},/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad) +"hj" = (/turf/space/transit/north/shuttlespace_ns11,/area/skipjack_station/transit) +"hk" = (/turf/space/transit/north/shuttlespace_ns6,/area/skipjack_station/transit) "hl" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area/space) "hm" = (/obj/machinery/computer/pod{id = "syndicate_elite"; name = "Hull Door Control"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "hn" = (/obj/machinery/computer/syndicate_elite_shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "ho" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area/space) -"hp" = (/turf/space/transit/north/shuttlespace_ns9,/area/skipjack_station/transit) -"hq" = (/turf/space/transit/north/shuttlespace_ns3,/area/skipjack_station/transit) -"hr" = (/turf/space/transit/north/shuttlespace_ns10,/area/skipjack_station/transit) +"hp" = (/turf/space/transit/north/shuttlespace_ns2,/area/skipjack_station/transit) +"hq" = (/turf/space/transit/north/shuttlespace_ns10,/area/skipjack_station/transit) +"hr" = (/turf/space/transit/north/shuttlespace_ns5,/area/skipjack_station/transit) "hs" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership) -"ht" = (/turf/space/transit/north/shuttlespace_ns7,/area/skipjack_station/transit) +"ht" = (/turf/space/transit/north/shuttlespace_ns1,/area/skipjack_station/transit) "hu" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership) -"hv" = (/turf/space/transit/north/shuttlespace_ns4,/area/skipjack_station/transit) +"hv" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite/mothership) "hw" = (/turf/simulated/floor/plating/airless,/area/shuttle/syndicate_elite/mothership) "hx" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/centcom/evac) "hy" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/space,/area/centcom/evac) @@ -396,19 +396,19 @@ "hF" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/centcom/evac) "hG" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/centcom/evac) "hH" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/centcom/evac) -"hI" = (/turf/space/transit/north/shuttlespace_ns14,/area/skipjack_station/transit) -"hJ" = (/obj/structure/table,/obj/machinery/door_control{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"hI" = (/turf/space/transit/north/shuttlespace_ns15,/area/skipjack_station/transit) +"hJ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) "hK" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/centcom/evac) "hL" = (/obj/machinery/portable_atmospherics/powered/pump,/turf/simulated/shuttle/plating,/area/centcom/evac) "hM" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/plating,/area/centcom/evac) "hN" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/centcom/evac) "hO" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_floor_f9"},/area/centcom/evac) "hP" = (/obj/structure/closet/emcloset,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"hQ" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"hQ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) "hR" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "hS" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "hT" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"hU" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) +"hU" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_1_recovery"; pixel_x = 25; pixel_y = 30; req_one_access = list(13); tag_door = "escape_pod_1_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) "hV" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_floor_f5"},/area/centcom/evac) "hW" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2},/area/centcom/evac) "hX" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/shuttle/plating,/area/centcom/evac) @@ -424,11 +424,11 @@ "ih" = (/turf/unsimulated/wall,/area/syndicate_mothership) "ii" = (/turf/simulated/shuttle/plating,/area/centcom/evac) "ij" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/centcom/evac) -"ik" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"ik" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_2_recovery"; pixel_x = -25; pixel_y = 30; req_one_access = list(13); tag_door = "escape_pod_2_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) "il" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "im" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) "in" = (/obj/item/weapon/stool,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"io" = (/obj/machinery/door/window{dir = 1; name = "Cockpit"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"io" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "ip" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area/space) "iq" = (/turf/space/transit/north/shuttlespace_ns12,/area/shuttle/escape_pod1/transit) "ir" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape_pod1/transit) @@ -445,7 +445,7 @@ "iC" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) "iD" = (/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) "iE" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/centcom/evac) -"iF" = (/obj/machinery/door/airlock/hatch{name = "Infirmary"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) +"iF" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 30; pixel_y = 0},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "iG" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/centcom/evac) "iH" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape_pod1/transit) "iI" = (/turf/space/transit/north/shuttlespace_ns6,/area/shuttle/escape_pod1/transit) @@ -478,16 +478,16 @@ "jj" = (/turf/space,/area/shuttle/escape_pod5/centcom) "jk" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "jl" = (/turf/space,/area/shuttle/escape_pod3/centcom) -"jm" = (/obj/machinery/door/airlock/hatch{name = "Cockpit"; req_access = list(109)},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) -"jn" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 4; icon_state = "right"; name = "Security Desk"; req_access = list(103)},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) +"jm" = (/obj/machinery/door/airlock/maintenance_hatch{req_access = list(101)},/turf/simulated/shuttle/plating,/area/centcom/evac) +"jn" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) "jo" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"jp" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"jq" = (/obj/machinery/door/airlock/centcom{name = "Restroom"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"jp" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_5_recovery"; pixel_x = -25; pixel_y = 25; req_one_access = list(13); tag_door = "escape_pod_5_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) +"jq" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) "jr" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) "js" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "jt" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership) -"ju" = (/obj/machinery/door/window{dir = 2; name = "Seating"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) -"jv" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) +"ju" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_3_recovery"; pixel_x = 25; pixel_y = -25; req_one_access = list(13); tag_door = "escape_pod_3_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) +"jv" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "jw" = (/obj/machinery/door/blast/regular{id = "smindicate"; name = "Outer Airlock"},/turf/simulated/shuttle/plating,/area/syndicate_mothership) "jx" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_mothership) "jy" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swallc1"},/area/centcom/evac) @@ -495,8 +495,8 @@ "jA" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "jB" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "jC" = (/obj/machinery/computer/security/nuclear,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) -"jD" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) -"jE" = (/obj/machinery/door/airlock/glass_security{name = "Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{id = "syndicate_elite_mech_room"; name = "Mech Room Door"},/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad) +"jD" = (/obj/structure/table,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"jE" = (/obj/machinery/door/airlock/hatch{name = "Infirmary"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) "jF" = (/obj/structure/computerframe,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "jG" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) "jH" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) @@ -528,20 +528,20 @@ "kh" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership) "ki" = (/obj/machinery/sleeper,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) "kj" = (/obj/machinery/sleep_console,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) -"kk" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access = list(150)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite/mothership) +"kk" = (/obj/machinery/door/window{dir = 1; name = "Cockpit"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "kl" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "km" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kn" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "ko" = (/obj/machinery/computer/card,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kp" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_mothership) -"kq" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) +"kq" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "kr" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_mothership) "ks" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership) "kt" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"ku" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_2_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock"; req_access = list(13)},/turf/unsimulated/floor,/area/centcom/evac) +"ku" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) "kv" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership) "kw" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership) -"kx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_1_recovery"; pixel_x = 25; pixel_y = 30; req_one_access = list(13); tag_door = "escape_pod_1_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) +"kx" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 4; icon_state = "right"; name = "Security Desk"; req_access = list(103)},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "ky" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kz" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kA" = (/obj/structure/closet,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) @@ -552,17 +552,17 @@ "kF" = (/obj/structure/table,/obj/item/weapon/folder,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "kG" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "kH" = (/obj/structure/closet/crate/freezer,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership) -"kI" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_pod_2_recovery"; pixel_x = -25; pixel_y = 30; req_one_access = list(13); tag_door = "escape_pod_2_recovery_hatch"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) +"kI" = (/obj/machinery/door/airlock/hatch{name = "Cockpit"; req_access = list(109)},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) "kJ" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/obj/item/device/flash,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kK" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "kL" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "kM" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "kN" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/centcom/evac) "kO" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/centcom/evac) -"kP" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) +"kP" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "kQ" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"kR" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 30; pixel_y = 0},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"kS" = (/obj/machinery/door/airlock/maintenance_hatch{req_access = list(101)},/turf/simulated/shuttle/plating,/area/centcom/evac) +"kR" = (/obj/machinery/door/airlock/centcom{name = "Restroom"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"kS" = (/obj/machinery/door/window{dir = 2; name = "Seating"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "kT" = (/obj/structure/urinal{pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "kU" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/decal/cleanable/vomit,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "kV" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) @@ -588,7 +588,7 @@ "lp" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "lq" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) "lr" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) -"ls" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) +"ls" = (/obj/machinery/door/window{dir = 4; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "lt" = (/obj/structure/table,/obj/machinery/computer/pod/old/syndicate{id = "smindicate"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "lu" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) "lv" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{dir = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership) @@ -598,11 +598,11 @@ "lz" = (/obj/structure/window/shuttle{icon_state = "window4"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) "lA" = (/obj/structure/window/shuttle{icon_state = "window12"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) "lB" = (/obj/structure/window/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) -"lC" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) -"lD" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) +"lC" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "synd_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"lD" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Equipment Room"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) "lE" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows"},/area/syndicate_mothership) "lF" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/wood{icon_state = "wood-broken4"},/area/syndicate_mothership) -"lG" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"lG" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) "lH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership) "lI" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership) "lJ" = (/turf/simulated/floor/wood{icon_state = "wood-broken"},/area/syndicate_mothership) @@ -620,14 +620,14 @@ "lV" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) "lW" = (/turf/simulated/floor/wood{icon_state = "wood-broken3"},/area/syndicate_mothership) "lX" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) -"lY" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) -"lZ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "synd_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"lY" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"lZ" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) "ma" = (/obj/structure/table,/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -3; pixel_y = -3},/obj/effect/spawner/newbomb/timer/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) -"mb" = (/obj/machinery/door/window{dir = 4; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) -"mc" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Equipment Room"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"mb" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership) +"mc" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) "md" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/adv,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) "me" = (/obj/item/weapon/weldingtool,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) -"mf" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"mf" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) "mg" = (/obj/item/weapon/crowbar,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) "mh" = (/obj/structure/table,/obj/effect/spawner/newbomb/timer/syndicate,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership) "mi" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "syndieshutters_workshop"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) @@ -663,7 +663,7 @@ "mM" = (/turf/unsimulated/wall{icon_state = "phoron4"},/area/alien) "mN" = (/turf/unsimulated/wall{icon_state = "phoron13"},/area/alien) "mO" = (/turf/unsimulated/wall{icon_state = "phoron9"},/area/alien) -"mP" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) +"mP" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space) "mQ" = (/obj/structure/table,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) "mR" = (/obj/structure/table,/obj/effect/landmark{name = "Nuclear-Code"},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) "mS" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) @@ -676,18 +676,18 @@ "mZ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) "na" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) "nb" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) -"nc" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"nc" = (/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full{pixel_x = 2; pixel_y = 6},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nd" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) "ne" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "nf" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "ng" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "nh" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "syndieshutters_infirmary"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"ni" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 25; pixel_y = 0; tag_door = "admin_shuttle_bay_door"},/turf/unsimulated/floor{name = "plating"},/area/centcom) +"ni" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "nj" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nk" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nl" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nm" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) -"nn" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) +"nn" = (/obj/structure/table,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "no" = (/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "np" = (/obj/structure/table/reinforced,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nq" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) @@ -702,7 +702,7 @@ "nz" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_station/start) "nA" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "nB" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "syndieshutters_workshop"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"nC" = (/obj/machinery/door_control{id = "syndieshutters_infirmary"; name = "remote shutter control"; pixel_x = -25},/obj/structure/mopbucket,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"nC" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nD" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nE" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = 3; pixel_y = 12},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nF" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/ammo_magazine/mc9mm/flash,/obj/item/weapon/gun/projectile/pistol/flash,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -710,9 +710,9 @@ "nH" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) "nI" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "nJ" = (/obj/machinery/computer/security/nuclear,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"nK" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"nK" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "nL" = (/obj/structure/computerframe,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"nM" = (/obj/machinery/door_control{id = "syndieshutters_workshop"; name = "remote shutter control"; pixel_x = 25},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"nM" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "nN" = (/obj/machinery/door/blast/regular{id = "syndieshutters_telebay"; name = "Outer Airlock"},/turf/simulated/shuttle/plating,/area/syndicate_station/start) "nO" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = 32},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "nP" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a12mm,/obj/item/ammo_magazine/a12mm,/obj/item/ammo_magazine/a12mm,/obj/item/ammo_magazine/a12mm,/obj/item/ammo_magazine/a12mm,/obj/item/ammo_magazine/a12mm,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) @@ -739,7 +739,7 @@ "ok" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) "ol" = (/obj/machinery/door/airlock/centcom{name = "Suit Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "om" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_station/start) -"on" = (/obj/machinery/door_control{id = "syndieshutters_telebay"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"on" = (/obj/machinery/door/window/northright{name = "Flight Deck"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oo" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_station/start) "op" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/weapon/tank/jetpack/carbondioxide,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oq" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) @@ -754,66 +754,66 @@ "oz" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oA" = (/obj/structure/bed/chair{dir = 8},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oB" = (/obj/machinery/recharger/wallcharger{pixel_x = -25},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oC" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"oC" = (/obj/structure/closet/secure_closet/medical_wall{pixel_x = -32; pixel_y = 0; req_access = list(150)},/obj/item/stack/medical/splint,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oD" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oE" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/head/helmet/space/void/merc,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oF" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) -"oG" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"oG" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oH" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 0; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space) "oJ" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oK" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oL" = (/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "Preparation"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"oL" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oM" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oN" = (/turf/unsimulated/wall,/area/centcom) -"oO" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "synd_sensor"; pixel_x = 8; pixel_y = 25},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"oO" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "merc_shuttle_pump"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) -"oQ" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oR" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(101); tag_door = "admin_shuttle_hatch"},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) -"oS" = (/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Preparation"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"oQ" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "merc_shuttle_sensor"; pixel_x = 8; pixel_y = 25},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"oR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "merc_shuttle"; pixel_x = -8; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"oS" = (/obj/machinery/door/airlock/vault{name = "Armory"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "oT" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom) "oU" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 8},/area/centcom) "oV" = (/turf/unsimulated/floor{name = "plating"},/area/centcom) "oW" = (/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "oX" = (/obj/machinery/flasher{id = "syndieflash"; pixel_x = 0; pixel_y = 28},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "oY" = (/obj/item/device/radio/electropack,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) -"oZ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"oZ" = (/obj/machinery/door/airlock/external{density = 1; frequency = 1331; id_tag = "merc_shuttle_outer"; name = "Ship External Access"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "smindicate"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) "pa" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) -"pb" = (/obj/machinery/door/window{dir = 4; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"pb" = (/obj/machinery/door/window{dir = 2; name = "Seating"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pc" = (/obj/machinery/door/airlock/centcom{name = "Hardsuit Storage"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "pd" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "pe" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) -"pf" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"pf" = (/obj/structure/table,/obj/machinery/computer/pod/old/syndicate{id = "smindicate"},/obj/machinery/door/window{dir = 4; name = "Blast Door Control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pg" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "ph" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_station/start) "pi" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "pj" = (/obj/item/weapon/cigbutt,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) -"pk" = (/obj/structure/table,/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 4; pixel_y = 7},/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"pk" = (/obj/machinery/door/window{dir = 1; name = "Cell"; req_access = list(150)},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pl" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"pm" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"pm" = (/obj/machinery/door/airlock/external{frequency = 1331; id_tag = "merc_base_hatch"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "pn" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"po" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"po" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "merc_shuttle_pump"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pp" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) "pq" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "pr" = (/obj/machinery/vending/cigarette,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "ps" = (/obj/machinery/microwave,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"pt" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) +"pt" = (/obj/machinery/door/airlock/external{frequency = 1331; id_tag = "merc_shuttle_inner"; name = "Ship External Access"; req_access = list(0)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pu" = (/turf/simulated/floor/plating,/area/shuttle/administration/centcom) "pv" = (/obj/item/device/multitool,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "pw" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"px" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/supply/dock) -"py" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/living) +"px" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"py" = (/obj/machinery/vending/assist{contraband = null; name = "AntagCorpVend"; products = list(/obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/signaler = 4, /obj/item/device/assembly/infra = 4, /obj/item/device/assembly/prox_sensor = 4, /obj/item/weapon/handcuffs = 8, /obj/item/device/flash = 4, /obj/item/weapon/cartridge/signal = 4, /obj/item/clothing/glasses/sunglasses = 4)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"pA" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/obj/item/clothing/mask/surgical,/obj/item/clothing/gloves/latex,/obj/item/weapon/surgicaldrill,/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = null; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"pA" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) "pB" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"pC" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 0; req_access = list(150)},/obj/item/weapon/surgicaldrill,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) +"pC" = (/obj/machinery/door/window{dir = 4; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pD" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "pE" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "pF" = (/turf/unsimulated/wall,/area/centcom/living) "pG" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet15-15"; dir = 4},/area/holodeck/source_courtroom) "pH" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/button/flasher{id = "syndieflash"; name = "Flasher"; pixel_x = 27; pixel_y = 0; tag = "permflash"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pI" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"pJ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/supply/dock) +"pJ" = (/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Preparation"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pK" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "pL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "pM" = (/obj/machinery/door/window/northright,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) @@ -831,8 +831,8 @@ "pY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/centcom/living) "pZ" = (/turf/unsimulated/wall,/area/centcom/suppy) "qa" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/knife{pixel_x = -6},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = -1},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 9},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"qb" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Administration"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"qc" = (/obj/machinery/telecomms/allinone{intercept = 1},/obj/machinery/door/window/northright{name = "Telecoms Mainframe"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"qb" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(101); tag_door = "admin_shuttle_hatch"},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"qc" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qd" = (/obj/structure/closet/syndicate/suit{name = "suit closet"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qe" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/space,/area/shuttle/administration/centcom) "qf" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) @@ -845,7 +845,7 @@ "qm" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Thunderdome Autolathe"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "qn" = (/obj/structure/dispenser,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "qo" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"qp" = (/obj/machinery/door/window{dir = 1; name = "Surgery"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"qp" = (/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "Preparation"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qq" = (/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) "qr" = (/obj/machinery/atm{pixel_y = 24},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) "qs" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) @@ -859,12 +859,12 @@ "qA" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 4},/area/centcom/suppy) "qB" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/suppy) "qC" = (/obj/structure/closet{name = "custodial"},/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/mop,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"qD" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) -"qE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/supply/dock) +"qD" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) +"qE" = (/obj/structure/table,/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 4; pixel_y = 7},/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "qF" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qG" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 4},/turf/space,/area/shuttle/administration/centcom) "qH" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) -"qI" = (/obj/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) +"qI" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) "qJ" = (/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/structure/table,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) "qK" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "qL" = (/obj/machinery/door/airlock/external,/turf/unsimulated/floor{name = "plating"},/area/centcom/living) @@ -885,12 +885,12 @@ "ra" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rb" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4; start_pressure = 740.5},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rc" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"rd" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) +"rd" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 25; pixel_y = 0; tag_door = "admin_shuttle_bay_door"},/turf/unsimulated/floor{name = "plating"},/area/centcom) "re" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rf" = (/obj/structure/table,/obj/item/clothing/gloves/yellow,/obj/item/device/assembly/signaler{pixel_y = 2},/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rg" = (/obj/structure/table,/obj/item/clothing/gloves/yellow,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/glasses/night,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rh" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"ri" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) +"ri" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rj" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rk" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/effect/spawner/newbomb/timer/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rl" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) @@ -898,22 +898,22 @@ "rn" = (/obj/machinery/computer/cloning,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "ro" = (/obj/machinery/clonepod,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "rp" = (/obj/machinery/computer/scan_consolenew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) -"rq" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "supply_shuttle"; pixel_x = 25; pixel_y = 0; req_one_access = list(13,31); tag_door = "supply_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/supply/dock) +"rq" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rr" = (/obj/structure/device/piano{dir = 4},/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) "rs" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) -"rt" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) +"rt" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "ru" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) "rv" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/wall,/area/centcom/living) "rw" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "rx" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "ry" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "rz" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/floor,/area/supply/dock) -"rA" = (/obj/machinery/door/window/northright{name = "Flight Deck"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"rA" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) "rC" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rD" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"rE" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"rF" = (/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full{pixel_x = 2; pixel_y = 6},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) +"rE" = (/obj/machinery/button/remote/blast_door{id = "syndieshutters_infirmary"; name = "remote shutter control"; pixel_x = -25},/obj/structure/mopbucket,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"rF" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rG" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rH" = (/obj/structure/table,/obj/effect/spawner/newbomb/timer/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) @@ -922,41 +922,41 @@ "rL" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) "rM" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "rN" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) -"rO" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) +"rO" = (/obj/machinery/button/remote/blast_door{id = "syndieshutters_telebay"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"rQ" = (/obj/structure/table,/obj/machinery/door_control{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"rR" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"rQ" = (/obj/machinery/button/remote/blast_door{id = "syndieshutters_workshop"; name = "remote shutter control"; pixel_x = 25},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"rR" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Administration"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "rS" = (/obj/structure/table,/obj/item/device/aicard,/obj/effect/spawner/newbomb/timer/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"rT" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "synd_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "synd_airlock"; pixel_x = -8; pixel_y = 25; tag_airpump = "synd_pump"; tag_chamber_sensor = "synd_sensor"; tag_exterior_door = "synd_outer"; tag_interior_door = "synd_inner"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"rT" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) "rU" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "rV" = (/obj/structure/table/reinforced,/obj/machinery/librarycomp,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/shuttle/administration/centcom) "rW" = (/obj/structure/bookcase,/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/shuttle/administration/centcom) "rX" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) "rY" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) -"rZ" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_closed"; id_tag = "synd_outer"; locked = 0; name = "Ship External Access"; req_access = list(150)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "smindicate"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/plating,/area/syndicate_station/start) -"sa" = (/obj/machinery/door/airlock/vault{name = "Armory"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"sb" = (/obj/machinery/door/window{dir = 2; name = "Seating"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"rZ" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/supply/dock) +"sa" = (/obj/machinery/door/window{dir = 1; name = "Surgery"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"sb" = (/obj/machinery/telecomms/allinone{intercept = 1},/obj/machinery/door/window/northright{name = "Telecoms Mainframe"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sc" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"sd" = (/obj/structure/table,/obj/machinery/computer/pod/old/syndicate{id = "smindicate"},/obj/machinery/door/window{dir = 4; name = "Blast Door Control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"sd" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/supply/dock) "se" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/structure/sign/nosmoking_1{pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"sf" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_closed"; id_tag = "synd_inner"; locked = 0; name = "Ship External Access"},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"sf" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/obj/item/clothing/mask/surgical,/obj/item/clothing/gloves/latex,/obj/item/weapon/surgicaldrill,/obj/structure/closet/secure_closet/medical_wall{pixel_x = 32; pixel_y = 0; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "sg" = (/obj/machinery/door/window/northright{icon_state = "right"; dir = 2},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "sh" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "si" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "sj" = (/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/shuttle/administration/centcom) "sk" = (/turf/simulated/floor{icon_state = "chapel"},/area/shuttle/administration/centcom) -"sl" = (/obj/machinery/vending/assist{contraband = null; name = "AntagCorpVend"; products = list(/obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/signaler = 4, /obj/item/device/assembly/infra = 4, /obj/item/device/assembly/prox_sensor = 4, /obj/item/weapon/handcuffs = 8, /obj/item/device/flash = 4, /obj/item/weapon/cartridge/signal = 4, /obj/item/clothing/glasses/sunglasses = 4)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"sl" = (/obj/structure/closet/secure_closet/medical_wall{pixel_y = 0; req_access = list(150)},/obj/item/weapon/surgicaldrill,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_station/start) "sm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/living) "sn" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) "so" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sp" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"sq" = (/obj/machinery/door/window{dir = 1; name = "Cell"; req_access = list(150)},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"sq" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living) "sr" = (/obj/structure/table,/obj/item/roller{pixel_y = 8},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "ss" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "st" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/fire{pixel_x = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "su" = (/obj/item/weapon/weldingtool,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"sv" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "synd_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"sw" = (/obj/structure/closet/secure_closet/medical_wall{pixel_x = -32; pixel_y = 0; req_access = list(150)},/obj/item/stack/medical/splint,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"sv" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "supply_shuttle"; pixel_x = 25; pixel_y = 0; req_one_access = list(13,31); tag_door = "supply_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/supply/dock) +"sw" = (/obj/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) "sx" = (/obj/structure/table,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/living) "sy" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/living) "sz" = (/obj/machinery/sleeper,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/living) @@ -965,15 +965,15 @@ "sC" = (/obj/machinery/computer/card/centcom,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) "sD" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) "sE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/floor,/area/supply/dock) -"sF" = (/turf/simulated/mineral,/area/syndicate_mothership{name = "\improper Raider Base"}) +"sF" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/supply/dock) "sG" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/circular_saw{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "sH" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"sI" = (/turf/unsimulated/wall{tag = "icon-iron4"; icon_state = "iron4"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"sI" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "sJ" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sK" = (/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sL" = (/obj/machinery/vending/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "sM" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) -"sN" = (/turf/unsimulated/wall{icon_state = "iron12"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"sN" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/living) "sO" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/living) "sP" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/living) "sQ" = (/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/living) @@ -1002,7 +1002,7 @@ "tn" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/syndicate_station/start) "to" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/space,/area/syndicate_station/start) "tp" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/living) -"tq" = (/turf/unsimulated/wall{tag = "icon-iron8"; icon_state = "iron8"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"tq" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "tr" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/supply/dock) "ts" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/supply/dock) "tt" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/supply/dock) @@ -1015,17 +1015,17 @@ "tA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/space,/area/supply/dock) "tB" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/supply/dock) "tC" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/space,/area/supply/dock) -"tD" = (/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"tE" = (/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"tF" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/syndicate_mothership{name = "\improper Raider Base"}) -"tG" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"tH" = (/turf/unsimulated/wall{tag = "icon-iron2"; icon_state = "iron2"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"tD" = (/obj/structure/table/rack,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"tE" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"tF" = (/obj/structure/table/rack,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"tG" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/emps,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/gun/launcher/grenade,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"tH" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "tI" = (/obj/structure/bed,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "tJ" = (/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "tK" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "tL" = (/obj/structure/bed,/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary) "tM" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) -"tN" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"tN" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "tO" = (/obj/machinery/telecomms/receiver/preset_cent,/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) "tP" = (/obj/machinery/telecomms/bus/preset_cent,/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/control) "tQ" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/control) @@ -1035,10 +1035,10 @@ "tU" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/control) "tV" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/control) "tW" = (/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/control) -"tX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"tY" = (/turf/unsimulated/wall{icon_state = "iron3"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"tZ" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"ua" = (/turf/unsimulated/wall{icon_state = "iron11"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"tX" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/control) +"tY" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"tZ" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"ua" = (/obj/machinery/shield_capacitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "ub" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "uc" = (/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary) "ud" = (/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/prison/solitary) @@ -1046,25 +1046,25 @@ "uf" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "ug" = (/turf/unsimulated/wall,/area/centcom/test) "uh" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"ui" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/syndicate_mothership{name = "\improper Raider Base"}) -"uj" = (/turf/unsimulated/wall{icon_state = "iron9"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"ui" = (/obj/machinery/shield_gen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"uj" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "uk" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"ul" = (/turf/unsimulated/wall{icon_state = "iron13"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"um" = (/turf/unsimulated/wall{icon_state = "iron5"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"un" = (/obj/structure/urinal{pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"ul" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"um" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/control) +"un" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "uo" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "up" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "uq" = (/obj/structure/closet/secure_closet/security,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "ur" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "us" = (/turf/space,/area/centcom/specops) "ut" = (/obj/machinery/mech_bay_recharge_port,/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) -"uu" = (/obj/machinery/camera{c_tag = "Assault Armor North"; dir = 2; network = list("ERT")},/obj/mecha/combat/gygax/dark,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) +"uu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "uv" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; listening = 0; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "uw" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 9},/area/centcom/specops) -"ux" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) -"uy" = (/obj/structure/urinal{pixel_y = 32},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) -"uz" = (/obj/item/tape/engineering{tag = "icon-engineering_h"; icon_state = "engineering_h"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"uA" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"ux" = (/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) +"uy" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"uz" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"uA" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/button/remote/blast_door{name = "Spec Ops Ready Room"; pixel_y = 15; req_access = list(11); id = "CREED"},/obj/machinery/button/remote/blast_door{name = "Mech Storage"; icon_state = "doorctrl0"; pixel_y = 0; req_access = list(11); id = "ASSAULT"},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "uB" = (/obj/structure/bed,/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary) "uC" = (/obj/structure/bed,/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "uD" = (/turf/unsimulated/floor{icon_state = "green"; dir = 10},/area/centcom/control) @@ -1094,18 +1094,18 @@ "vb" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vc" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vd" = (/obj/structure/table/rack,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"ve" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access = list(19)},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"vf" = (/obj/item/tape/engineering{tag = "icon-engineering_v"; icon_state = "engineering_v"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vg" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"ve" = (/obj/machinery/door/airlock/centcom{name = "Creed's Office"; opacity = 1; req_access = list(108)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"vf" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"vg" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Armor Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "vh" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/wall,/area/prison/solitary) "vi" = (/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/prison/solitary) "vj" = (/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary) -"vk" = (/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"vk" = (/obj/machinery/vending/engivend,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "vm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "vn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "vo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"vp" = (/turf/unsimulated/wall{icon_state = "iron10"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"vp" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "vq" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "vr" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "vs" = (/obj/machinery/door/window/northleft,/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) @@ -1114,28 +1114,28 @@ "vv" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vw" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vx" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/taperoll/police,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vy" = (/turf/unsimulated/wall{icon_state = "iron14"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vz" = (/obj/structure/table/reinforced,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vA" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"vy" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"vz" = (/obj/machinery/vending/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"vA" = (/obj/machinery/pipedispenser/disposal/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vB" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control) "vC" = (/turf/unsimulated/floor{icon_state = "green"},/area/centcom/control) "vD" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control) -"vE" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/cobweb2{tag = "icon-cobweb1"; icon_state = "cobweb1"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"vE" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vF" = (/obj/structure/closet/secure_closet/courtroom,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vG" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) -"vH" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/obj/machinery/camera{c_tag = "Court"; invisibility = 1; network = list("thunder"); pixel_x = 10},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) +"vH" = (/obj/mecha/combat/gygax/dark,/obj/machinery/camera/network/ert{c_tag = "Assault Armor North"},/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) "vI" = (/obj/mecha/medical/odysseus/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) "vJ" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vK" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) +"vK" = (/obj/machinery/power/emitter,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vL" = (/obj/structure/sign/poster{poster_type = "/datum/poster/bay_50"; pixel_x = -32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"vM" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = 25; tag_door = "centcom_shuttle_bay_door"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"vN" = (/obj/item/xenos_claw,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vO" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/weapon/gun/launcher/spikethrower,/obj/item/clothing/under/vox/vox_casual,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vP" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/weapon/gun/launcher/spikethrower,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vQ" = (/obj/item/clothing/mask/gas/swat{desc = "A close-fitting mask clearly not made for a human face."; name = "\improper alien mask"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vR" = (/turf/unsimulated/wall{tag = "icon-iron1"; icon_state = "iron1"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vS" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) -"vT" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"vM" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"vN" = (/obj/structure/table/reinforced,/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"vO" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) +"vP" = (/obj/machinery/door/airlock/centcom{name = "Teleporter Bay"; opacity = 1; req_access = list(107)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) +"vQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"vR" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"vS" = (/obj/structure/table/rack,/obj/item/rig_module/mounted,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"vT" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vU" = (/obj/structure/sign/securearea{name = "\improper CAUTION"; pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "vV" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) "vW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) @@ -1149,16 +1149,16 @@ "we" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "wf" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "wg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space) -"wh" = (/turf/unsimulated/wall{icon_state = "iron6"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"wh" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wi" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT2"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "wj" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/teleporter,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wk" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet9-4"; dir = 4},/area/holodeck/source_courtroom) -"wl" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_dock"; name = "docking port controller"; pixel_x = 25; pixel_y = 0; req_one_access = list(13); tag_door = "centcom_dock_airlock"},/turf/unsimulated/floor{dir = 6; icon_state = "warning"},/area/centcom/evac) -"wm" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom) -"wn" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"wo" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"wp" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"wq" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"wl" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"wm" = (/obj/structure/sign/nosmoking_2,/turf/unsimulated/wall,/area/centcom/living) +"wn" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"wo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"wp" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"wq" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "ws" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "wt" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) @@ -1167,12 +1167,12 @@ "ww" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "wx" = (/obj/mecha/working/ripley/firefighter,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) "wy" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,/obj/item/mecha_parts/mecha_equipment/tool/rcd,/obj/item/weapon/pickaxe/diamonddrill,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"wz" = (/obj/item/pizzabox/meat,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"wA" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(2)},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"wB" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"wz" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"wA" = (/obj/machinery/door/airlock/centcom{name = "Research Facility"; opacity = 1; req_access = list(104)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/test) +"wB" = (/obj/structure/table/reinforced,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wC" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wD" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/medical,/obj/item/clothing/accessory/storage/black_vest,/obj/item/weapon/rig/ert/medical,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"wE" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"wE" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/living) "wF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) "wG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) "wH" = (/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) @@ -1183,82 +1183,82 @@ "wM" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "wN" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "wO" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1443; listening = 0; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"wP" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"wP" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "wR" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "wS" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "wT" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control) "wU" = (/obj/structure/bed/chair,/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/control) -"wV" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"wV" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wW" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT2"; name = "Launch Bay #2"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"wX" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"wY" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"wZ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_dock_airlock"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/evac) -"xa" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "shuttle_dock_north_mech"; pixel_y = -19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"xb" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "centcom_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"xc" = (/obj/item/clothing/head/xenos,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"xd" = (/obj/item/organ/xenos/plasmavessel,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"xe" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror/raider{pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"wX" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/pinpointer/advpinpointer,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"wY" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/cdeathalarm_kit,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"wZ" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xa" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xb" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/taperoll/engineering,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xc" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"xd" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"xe" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "xf" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) -"xg" = (/obj/structure/closet{icon_closed = "syndicate1"; icon_opened = "syndicate1open"; icon_state = "syndicate1"; name = "emergency response team wardrobe"},/obj/item/clothing/under/ert,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/rank/centcom_officer,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"xh" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xg" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xh" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xi" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "xj" = (/obj/machinery/door/airlock/centcom{name = "Courthouse"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"xk" = (/obj/machinery/vending/cola{name = "Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"xl" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"; tag = "icon-spiderling"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"xm" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_port_hatch"; locked = 1; name = "Port Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"xn" = (/obj/machinery/vending/cigarette{name = "cigarette machine"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"xk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"xl" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/accessory/storage/black_vest,/obj/item/weapon/rig/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xm" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xn" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xo" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xp" = (/obj/machinery/door/airlock/centcom{name = "Holding Cell"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"xq" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/wall,/area/centcom/specops) -"xr" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_centcom_dock"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_one_access = list(103); tag_door = "specops_centcom_dock_door"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"xs" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xt" = (/obj/structure/table/rack,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"xv" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"xw" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_centcom_dock_door"; locked = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"xx" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xy" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xz" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xA" = (/obj/structure/closet/crate/medical,/obj/item/weapon/circular_saw,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xp" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/engineer,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/weapon/rig/ert/engineer,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xq" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xr" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"xs" = (/obj/mecha/working/hoverpod,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) +"xt" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/rcd,/obj/item/rig_module/device/rcd,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/mounted/egun,/obj/item/rig_module/mounted/egun,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xu" = (/obj/machinery/door/airlock/centcom{name = "Armory Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"xv" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/control) +"xw" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) +"xx" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"xy" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"xz" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) +"xA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/obj/machinery/camera/network/thunder{c_tag = "Court"; pixel_x = 10; pixel_y = -6},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "xB" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "xC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) "xD" = (/obj/machinery/computer/robotics,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "xE" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "xF" = (/obj/machinery/computer/card,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "xG" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"xH" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xI" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/roller,/obj/item/roller,/obj/item/roller,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xJ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/flash,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/device/flash,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xK" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"xL" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"xM" = (/obj/machinery/door/airlock/glass_security{name = "Holding Cell"; req_access = list(2)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) -"xN" = (/obj/item/tape/engineering{tag = "icon-engineering_v"; icon_state = "engineering_v"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"xO" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) +"xH" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"xI" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"xJ" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; listening = 0; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"xK" = (/obj/structure/sign/securearea{name = "ENGINEERING ACCESS"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"xL" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"xM" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xN" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"xO" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/specops) "xP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) "xQ" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"xR" = (/obj/structure/bed/chair/office/dark,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_x = -12; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"xR" = (/obj/structure/sign/redcross{pixel_y = -32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "xS" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "xT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) "xU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) "xV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) "xW" = (/obj/machinery/door/airlock/centcom{name = "Courthouse"; opacity = 1},/turf/unsimulated/floor{icon_state = "whiteshiny"},/area/centcom/control) "xX" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) -"xY" = (/obj/machinery/camera{c_tag = "Jury Room"; network = list("thunder"); pixel_x = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"xY" = (/obj/structure/sign/nosmoking_2,/turf/unsimulated/wall,/area/centcom/control) "xZ" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"ya" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"yb" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"yc" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"yd" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/door/window/southright{name = "Arrivals Processing"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"ye" = (/obj/machinery/door/airlock/glass_security{name = "Holding Cell"; req_access = list(2)},/turf/unsimulated/floor,/area/centcom/control) -"yf" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_port"; name = "port docking hatch controller"; pixel_x = 0; pixel_y = 25; tag_door = "specops_shuttle_port_hatch"},/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"yg" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) +"ya" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yb" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/handcuffs,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"yd" = (/obj/structure/bed/chair/office/light,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ye" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yf" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yg" = (/obj/machinery/door/airlock/centcom{name = "Medical Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "yh" = (/turf/unsimulated/wall,/area/centcom/creed) -"yi" = (/obj/machinery/door/airlock/centcom{name = "Arrivals Processing"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"yj" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_fore"; name = "forward docking hatch controller"; pixel_x = 0; pixel_y = -25; tag_door = "specops_shuttle_fore_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"yk" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_fore_hatch"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/shuttle/specops/centcom) -"yl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"ym" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Arrivals Processing"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"yi" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"yj" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yk" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yl" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ym" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/wall,/area/centcom/specops) "yn" = (/obj/structure/table/reinforced,/obj/item/device/pda/captain,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "yo" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "yp" = (/obj/machinery/computer/security,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) @@ -1271,76 +1271,76 @@ "yw" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/evac) "yx" = (/obj/structure/table/rack,/obj/item/weapon/rig/merc/empty,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "yy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) -"yz" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/extinguisher,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_shuttle"; pixel_x = 8; pixel_y = 25; req_one_access = list(13); tag_door = "escape_shuttle_hatch"},/obj/machinery/camera{c_tag = "Shuttle Bridge West"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"yA" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"yz" = (/obj/structure/table/rack,/obj/item/device/lightreplacer,/obj/item/device/lightreplacer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"yA" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "yB" = (/obj/structure/table/rack,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/backpack/satchel,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) -"yC" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"yD" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"yC" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/pillbottles,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"yD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "yE" = (/obj/item/weapon/mop,/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "yF" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket{amount_per_transfer_from_this = 50},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"yG" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; listening = 0; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"yG" = (/obj/machinery/chem_master,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "yH" = (/obj/structure/closet/secure_closet/hos,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "yI" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "yJ" = (/obj/structure/table/rack,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"yK" = (/obj/structure/sign/securearea{name = "ENGINEERING ACCESS"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"yK" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "yL" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control) "yM" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/evac) "yN" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "yO" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "yP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control) -"yQ" = (/obj/machinery/camera{c_tag = "Assault Armor South"; dir = 1; network = list("ERT")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) +"yQ" = (/obj/structure/closet/crate,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "yR" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"yS" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"yS" = (/obj/structure/table/reinforced,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "yT" = (/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/control) "yU" = (/obj/structure/closet/secure_closet/injection,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "yV" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control) -"yW" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) -"yX" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"yY" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"yZ" = (/obj/machinery/door/airlock/centcom{name = "Armory Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"yW" = (/obj/structure/table/reinforced,/obj/item/weapon/stamp/centcomm,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yX" = (/obj/structure/closet{icon_closed = "syndicate1"; icon_opened = "syndicate1open"; icon_state = "syndicate1"; name = "emergency response team wardrobe"},/obj/item/clothing/under/ert,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/rank/centcom_officer,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"yY" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"yZ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "za" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/melee/energy/axe,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) "zb" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/melee/energy/axe,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) "zc" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zd" = (/obj/machinery/telecomms/relay/preset/centcom,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) -"ze" = (/obj/machinery/door/airlock/centcom{name = "Engineering Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"ze" = (/obj/structure/closet/crate,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zf" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) -"zg" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) -"zh" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"zi" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/maneuvering_jets,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/drill,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/healthscanner,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/plasmacutter,/obj/item/rig_module/device/rcd,/obj/item/rig_module/device/rcd,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/chem_dispenser/injector,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/chem_dispenser/combat,/obj/item/rig_module/mounted/egun,/obj/item/rig_module/mounted/egun,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zg" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"zh" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_centcom_dock"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_one_access = list(103); tag_door = "specops_centcom_dock_door"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"zi" = (/obj/machinery/door/airlock/centcom{name = "Holding Cell"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "zj" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"zk" = (/obj/mecha/working/hoverpod,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) -"zl" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"zm" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/accessory/storage/black_vest,/obj/item/weapon/rig/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"zn" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zk" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/flash,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/device/flash,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zl" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/roller,/obj/item/roller,/obj/item/roller,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zm" = (/obj/structure/closet/crate/medical,/obj/item/weapon/circular_saw,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zn" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zo" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_courtroom) "zp" = (/obj/machinery/computer/security/telescreen{name = "Spec. Ops. Monitor"; network = list("ERT")},/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "zq" = (/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "zr" = (/obj/machinery/computer/card/centcom,/obj/item/weapon/card/id/centcom,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) -"zs" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/control) -"zt" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/control) -"zu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/centcom/control) -"zv" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/control) -"zw" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/control) -"zx" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zs" = (/obj/machinery/camera/network/ert{c_tag = "Assault Armor South"; dir = 1},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) +"zt" = (/obj/structure/sign/nosmoking_2,/turf/unsimulated/wall,/area/centcom/specops) +"zu" = (/obj/machinery/camera/network/thunder{c_tag = "Court - Jury Room"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) +"zv" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) +"zw" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) +"zx" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/centcom/control) "zz" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space) "zA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) "zB" = (/turf/unsimulated/floor{icon_state = "loadingarea"},/area/centcom/specops) -"zC" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"zD" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) +"zC" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zD" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zE" = (/obj/machinery/computer/pod{id = "NTrasen"; name = "Hull Door Control"},/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) -"zF" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/control) -"zG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor,/area/centcom/control) -"zH" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/control) -"zI" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/control) -"zJ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control) +"zF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/centcom/holding) +"zG" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/holding) +"zH" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/holding) +"zI" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) +"zJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor,/area/centcom/holding) "zK" = (/obj/structure/grille,/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},/turf/unsimulated/floor,/area/centcom/control) "zL" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "zM" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/space,/area/shuttle/specops/centcom) "zN" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/specops/centcom) -"zO" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/engineer,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/weapon/rig/ert/engineer,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"zO" = (/obj/structure/table/rack,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zP" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom) -"zQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor,/area/centcom/control) +"zQ" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/holding) "zR" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape/centcom) "zS" = (/obj/structure/window/shuttle{icon_state = "window4"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "zT" = (/obj/structure/window/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) @@ -1351,24 +1351,24 @@ "zY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops/centcom) "zZ" = (/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("ERT"); pixel_y = 30},/obj/machinery/computer/shuttle_control/specops,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "Aa" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"Ab" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Ab" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_centcom_dock_door"; locked = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) "Ac" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "Ad" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"Ae" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/device/flash,/obj/item/device/flash,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/obj/item/clothing/accessory/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Af" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) +"Ae" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Af" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/holding) "Ag" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Weapon Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"Ah" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/cdeathalarm_kit,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Ah" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "Ai" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"},/area/shuttle/escape/centcom) "Aj" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_courtroom) "Ak" = (/turf/simulated/floor/holofloor{icon_state = "carpet15-15"; dir = 4},/area/holodeck/source_courtroom) "Al" = (/turf/simulated/shuttle/wall{icon_state = "swallc3"},/area/shuttle/escape/centcom) "Am" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"An" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/pinpointer/advpinpointer,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Ao" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Ap" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/control) -"Aq" = (/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/control) -"Ar" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"As" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"An" = (/turf/simulated/mineral,/area/syndicate_mothership{name = "\improper Raider Base"}) +"Ao" = (/turf/unsimulated/wall{icon_state = "iron6"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Ap" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/holding) +"Aq" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/holding) +"Ar" = (/turf/unsimulated/wall{icon_state = "iron12"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"As" = (/turf/unsimulated/wall{icon_state = "iron10"},/area/syndicate_mothership{name = "\improper Raider Base"}) "At" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape/centcom) "Au" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Jury Box"},/turf/simulated/floor/holofloor{icon_state = "carpet10-8"; dir = 4},/area/holodeck/source_courtroom) "Av" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) @@ -1377,37 +1377,37 @@ "Ay" = (/obj/machinery/computer/prisoner{name = "Implant Management"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "Az" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "AA" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom) -"AB" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/taperoll/engineering,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"AB" = (/obj/machinery/vending/cola{name = "Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "AC" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "AD" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "AE" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 4},/turf/space,/area/shuttle/specops/centcom) -"AF" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/control) -"AG" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/control) +"AF" = (/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/holding) +"AG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/unsimulated/floor,/area/centcom/holding) "AH" = (/turf/unsimulated/wall,/area/centcom/ferry) "AI" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT3"; name = "Launch Bay #3"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"AJ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/skills{icon_state = "medlaptop"; pixel_x = 3; pixel_y = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"AK" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"AJ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) +"AK" = (/turf/unsimulated/wall{icon_state = "iron3"},/area/syndicate_mothership{name = "\improper Raider Base"}) "AL" = (/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) -"AM" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"AM" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/extinguisher,/obj/machinery/camera/network/crescent{c_tag = "Shuttle Bridge West"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "AN" = (/obj/structure/window/reinforced/holowindow{dir = 1},/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet6-2"; dir = 4},/area/holodeck/source_courtroom) "AO" = (/obj/machinery/door/window/holowindoor{name = "Red Team"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_emptycourt) -"AP" = (/obj/machinery/atm{pixel_x = -26},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) -"AQ" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) +"AP" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/holding) +"AQ" = (/obj/machinery/door/airlock/glass_security{name = "Holding Cell"; req_access = list(2)},/turf/unsimulated/floor,/area/centcom/holding) "AR" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape/centcom) -"AS" = (/obj/structure/closet/crate,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"AS" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "AT" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape/centcom) "AU" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape/centcom) "AV" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) "AW" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "AX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "AY" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 8},/area/centcom/ferry) -"AZ" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"Ba" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"Bb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"Bc" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry) -"Bd" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) -"Be" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) -"Bf" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/control) +"AZ" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Ba" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"; tag = "icon-spiderling"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Bb" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) +"Bc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"Bd" = (/obj/machinery/door/airlock/centcom{name = "Arrivals Processing"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Be" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) +"Bf" = (/obj/machinery/door/airlock/glass_security{name = "Holding Cell"; req_access = list(2)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "Bg" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Bh" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{dir = 4; icon_state = "wood_siding8"},/area/holodeck/source_picnicarea) "Bi" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{icon_state = "wood_siding6"; dir = 2},/area/holodeck/source_picnicarea) @@ -1421,98 +1421,98 @@ "Bq" = (/obj/structure/window/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) "Br" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/transport1/centcom) "Bs" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/shuttle/transport1/centcom) -"Bt" = (/obj/machinery/door/airlock/external{frequency = 1380; glass = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_bay_door"; locked = 1; name = "Transport Airlock"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry) +"Bt" = (/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/holding) "Bu" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Bv" = (/obj/structure/closet/crate,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Bv" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_port_hatch"; locked = 1; name = "Port Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "Bw" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) "Bx" = (/obj/structure/window/reinforced/holowindow,/obj/machinery/door/window/holowindoor{dir = 1; name = "Court Reporter's Box"},/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) "By" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_floor_f9"},/area/shuttle/transport1/centcom) -"Bz" = (/obj/structure/table/reinforced,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bz" = (/obj/machinery/vending/cigarette{name = "cigarette machine"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "BA" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_floor_f5"},/area/shuttle/transport1/centcom) "BB" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/transport1/centcom) "BC" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "BD" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/transport1/centcom) "BE" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/window/reinforced,/turf/space,/area/shuttle/transport1/centcom) -"BF" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) -"BG" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/evac) +"BF" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Arrivals Processing"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"BG" = (/obj/machinery/computer/card,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "BH" = (/obj/structure/window/reinforced/holowindow,/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 1; icon_state = "right"; name = "Witness Box"},/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) "BI" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) "BJ" = (/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "BK" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "BL" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) -"BM" = (/obj/structure/table/reinforced,/obj/item/weapon/stamp/centcomm,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"BN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/ferry) -"BO" = (/obj/machinery/door/airlock/external{name = "Arrivals Bar Airlock"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry) -"BP" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control) -"BQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"BR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"BS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) +"BM" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"BN" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "escape_shuttle"; pixel_x = 0; pixel_y = -25; req_one_access = list(13); tag_door = "escape_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BO" = (/obj/machinery/status_display{pixel_y = 30},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/machinery/camera/network/crescent{c_tag = "Shuttle Bridge East"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"BP" = (/turf/unsimulated/floor{icon_state = "green"; dir = 10},/area/centcom/holding) +"BQ" = (/obj/structure/bed/chair/office/dark,/obj/machinery/button/remote/blast_door{desc = "A remote control switch for port-side blast doors."; id = "CentComPort"; name = "Security Doors"; pixel_x = -12; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"BR" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"BS" = (/obj/machinery/computer/secure_data,/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals North"; dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "BT" = (/obj/structure/bed/chair{dir = 4},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "BU" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) "BV" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape/centcom) "BW" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/transport1/centcom) "BX" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "swall_floor_f10"},/area/shuttle/transport1/centcom) -"BY" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"BY" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_port"; name = "port docking hatch controller"; pixel_x = 0; pixel_y = 25; tag_door = "specops_shuttle_port_hatch"},/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "BZ" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "swall_floor_f6"},/area/shuttle/transport1/centcom) "Ca" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "Cb" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/transport1/centcom) "Cc" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/shuttle/transport1/centcom) -"Cd" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/ferry) -"Ce" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/ferry) -"Cf" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/ferry) -"Cg" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/ferry) -"Ch" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"Ci" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"Cj" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/control) -"Ck" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) -"Cl" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) -"Cm" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac) -"Cn" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Co" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/evac) -"Cp" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Cd" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Ce" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/holding) +"Cf" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/holding) +"Cg" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Ch" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/door/window/southright{name = "Arrivals Processing"; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Ci" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/skills{icon_state = "medlaptop"; pixel_x = 3; pixel_y = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Cj" = (/obj/machinery/atm{pixel_x = -26},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) +"Ck" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/holding) +"Cl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"Cm" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/holding) +"Cn" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) +"Co" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"Cp" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) "Cq" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) "Cr" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Cs" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/transport1/centcom) "Ct" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/transport1/centcom) -"Cu" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/ferry) -"Cv" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/ferry) -"Cw" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/ferry) -"Cx" = (/obj/machinery/door/airlock/glass{name = "Arrivals Bar"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) -"Cy" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) -"Cz" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) -"CA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) +"Cu" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/holding) +"Cv" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/camera/network/crescent{c_tag = "Shuttle Cell"},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) +"Cw" = (/obj/machinery/door/airlock/external{frequency = 1380; glass = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_bay_door"; locked = 1; name = "Transport Airlock"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/holding) +"Cx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"Cy" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/holding) +"Cz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/holding) +"CA" = (/obj/machinery/door/airlock/external{name = "Arrivals Bar Airlock"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/holding) "CB" = (/turf/simulated/floor/holofloor{icon_state = "carpet5-1"; dir = 4},/area/holodeck/source_theatre) "CC" = (/obj/structure/window/shuttle{icon_state = "window2"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "CD" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor{icon_state = "carpet15-15"; dir = 4},/area/holodeck/source_courtroom) -"CE" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/ferry) -"CF" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/ferry) -"CG" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/ferry) -"CH" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control) -"CI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"CJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"CK" = (/turf/unsimulated/floor{icon_state = "warning"},/area/centcom/evac) -"CL" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/pillbottles,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"CE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"CF" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/holding) +"CG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"CH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"CI" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/holding) +"CJ" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/holding) +"CK" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/holding) +"CL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "CM" = (/obj/structure/window/shuttle{icon_state = "window3"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) "CN" = (/turf/unsimulated/wall,/area/centcom/holding) "CO" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "CP" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"CQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"CR" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control) -"CS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"CT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) +"CQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"CR" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/holding) +"CS" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals East"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"CT" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/holding) "CU" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_courtroom) -"CV" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/wall,/area/centcom/evac) -"CW" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/obj/item/clothing/head/bandana{pixel_y = -10},/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) -"CX" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) -"CY" = (/obj/structure/closet/athletic_mixed,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) +"CV" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_dock_airlock"; locked = 1; name = "Arrivals Airlock"; req_access = list(13)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/holding) +"CW" = (/obj/machinery/camera/network/crescent{c_tag = "Shuttle Center"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"CX" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/holding) +"CY" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/holding) "CZ" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/obj/structure/closet/athletic_mixed,/turf/unsimulated/floor{tag = "icon-siding4"; name = "plating"; icon_state = "siding4"},/area/centcom/holding) "Da" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{tag = "icon-siding8"; name = "plating"; icon_state = "siding8"},/area/centcom/holding) -"Db" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"Dc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) -"Dd" = (/turf/unsimulated/floor{icon_state = "warning"; dir = 1; heat_capacity = 1},/area/centcom/evac) -"De" = (/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "warning"},/area/centcom/evac) +"Db" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/holding) +"Dc" = (/obj/machinery/door/airlock/glass{name = "Arrivals Bar"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Dd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"De" = (/obj/structure/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/camera/network/crescent{c_tag = "Shuttle West"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Df" = (/obj/structure/window/shuttle{icon_state = "window1"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"Dg" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) +"Dg" = (/obj/structure/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/camera/network/crescent{c_tag = "Shuttle East"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Dh" = (/turf/unsimulated/beach/sand{tag = "icon-desert3"; icon_state = "desert3"},/turf/unsimulated/floor{tag = "icon-siding4"; name = "plating"; icon_state = "siding4"},/area/centcom/holding) "Di" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{tag = "icon-siding8"; name = "plating"; icon_state = "siding8"},/area/centcom/holding) "Dj" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/amanita_pie,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) @@ -1521,9 +1521,9 @@ "Dm" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Dn" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Do" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/stew,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"Dp" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) +"Dp" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/holding) "Dq" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Dr" = (/turf/unsimulated/beach/sand{tag = "icon-desert2"; icon_state = "desert2"},/area/centcom/ferry) +"Dr" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/holding) "Ds" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/turf/unsimulated/floor{tag = "icon-siding4"; name = "plating"; icon_state = "siding4"},/area/centcom/holding) "Dt" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/boiledrice,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Du" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/beetsoup,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) @@ -1536,15 +1536,15 @@ "DB" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/holding) "DC" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "DD" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"DE" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"DF" = (/obj/item/weapon/inflatable_duck,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) +"DE" = (/turf/unsimulated/wall{icon_state = "iron13"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"DF" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/holding) "DG" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{tag = "icon-siding4"; name = "plating"; icon_state = "siding4"},/area/centcom/holding) "DH" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) -"DI" = (/obj/machinery/chem_master,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"DI" = (/turf/unsimulated/wall{tag = "icon-iron8"; icon_state = "iron8"},/area/syndicate_mothership{name = "\improper Raider Base"}) "DJ" = (/turf/simulated/floor/holofloor{icon_state = "carpet9-4"; dir = 4},/area/holodeck/source_theatre) "DK" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "carpet1-0"},/area/holodeck/source_theatre) -"DL" = (/turf/unsimulated/beach/sand{tag = "icon-desert1"; icon_state = "desert1"},/area/centcom/ferry) -"DM" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand{tag = "icon-coconuts"; icon_state = "coconuts"},/area/centcom/ferry) +"DL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"DM" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/holding) "DN" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/bloodsoup,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "DO" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/tofukabob,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "DP" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/poppypretzel,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) @@ -1552,16 +1552,16 @@ "DR" = (/obj/structure/table/woodentable{dir = 5},/obj/item/clothing/under/suit_jacket,/obj/item/clothing/suit/wcoat,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) "DS" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) "DT" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"DU" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"DU" = (/turf/unsimulated/wall{tag = "icon-iron4"; icon_state = "iron4"},/area/syndicate_mothership{name = "\improper Raider Base"}) "DV" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) -"DW" = (/obj/structure/table/rack,/obj/item/device/lightreplacer,/obj/item/device/lightreplacer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"DW" = (/turf/unsimulated/wall{icon_state = "iron5"},/area/syndicate_mothership{name = "\improper Raider Base"}) "DX" = (/obj/structure/bed/roller,/turf/unsimulated/floor{dir = 4; icon_state = "whitegreenfull"},/area/centcom/holding) "DY" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "DZ" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Ea" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Eb" = (/obj/structure/bed/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Ec" = (/mob/living/simple_animal/crab,/turf/unsimulated/beach/sand{tag = "icon-desert3"; icon_state = "desert3"},/area/centcom/ferry) -"Ed" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand{tag = "icon-desert_dug"; icon_state = "desert_dug"},/area/centcom/ferry) +"Ec" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"Ed" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_dock"; name = "docking port controller"; pixel_x = 25; pixel_y = 0; req_one_access = list(13); tag_door = "centcom_dock_airlock"},/turf/unsimulated/floor{dir = 6; icon_state = "warning"},/area/centcom/holding) "Ee" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/spesslaw,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Ef" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/candiedapple,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Eg" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) @@ -1573,10 +1573,10 @@ "Em" = (/turf/space/transit/north/shuttlespace_ns4,/area/shuttle/escape/transit) "En" = (/turf/space/transit/east/shuttlespace_ew10,/area/shuttle/escape_pod5/transit) "Eo" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/obj/item/weapon/inflatable_duck,/turf/unsimulated/floor{tag = "icon-siding4"; name = "plating"; icon_state = "siding4"},/area/centcom/holding) -"Ep" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Ep" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Eq" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/glass/rag,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) -"Er" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"Es" = (/obj/machinery/door/airlock/centcom{name = "Medical Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"Er" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_fore_hatch"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/shuttle/specops/centcom) +"Es" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_fore"; name = "forward docking hatch controller"; pixel_x = 0; pixel_y = -25; tag_door = "specops_shuttle_fore_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "Et" = (/turf/unsimulated/floor{dir = 8; icon_state = "whitegreen"},/area/centcom/holding) "Eu" = (/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet5-1"; dir = 4},/area/holodeck/source_courtroom) "Ev" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor{icon_state = "carpet9-4"; dir = 4},/area/holodeck/source_courtroom) @@ -1586,15 +1586,15 @@ "Ez" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor{icon_state = "carpet13-5"; dir = 4},/area/holodeck/source_courtroom) "EA" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/escape/centcom) "EB" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape/centcom) -"EC" = (/obj/effect/overlay/palmtree_l,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) -"ED" = (/turf/unsimulated/beach/sand{tag = "icon-beachcorner"; icon_state = "beachcorner"},/area/centcom/ferry) -"EE" = (/turf/unsimulated/beach/sand{tag = "icon-beach"; icon_state = "beach"},/area/centcom/ferry) +"EC" = (/turf/unsimulated/floor{icon_state = "warning"},/area/centcom/holding) +"ED" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/machinery/camera/network/crescent{c_tag = "Crescent Bar East"; dir = 4},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) +"EE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "EF" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/centcom/holding) "EG" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/holding) "EH" = (/turf/unsimulated/wall,/area/tdome) "EI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/tdome) "EJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/tdome) -"EK" = (/obj/structure/bed/chair/office/light,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"EK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "EL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/tdome) "EM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/tdome) "EN" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet13-5"; dir = 4},/area/holodeck/source_courtroom) @@ -1607,8 +1607,8 @@ "EU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape/centcom) "EV" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape/centcom) "EW" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape/centcom) -"EX" = (/turf/unsimulated/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/centcom/ferry) -"EY" = (/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/ferry) +"EX" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/holding) +"EY" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "EZ" = (/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/holding) "Fa" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "Fb" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) @@ -1621,7 +1621,7 @@ "Fi" = (/turf/unsimulated/floor{dir = 5; icon_state = "whitegreen"},/area/centcom/holding) "Fj" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor{icon_state = "carpet5-1"; dir = 4},/area/holodeck/source_courtroom) "Fk" = (/turf/unsimulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/centcom/holding) -"Fl" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/turf/unsimulated/beach/sand{tag = "icon-coconuts"; icon_state = "coconuts"},/area/centcom/ferry) +"Fl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "Fm" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "Fn" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "Fo" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) @@ -1633,7 +1633,7 @@ "Fu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/shuttle/plating,/area/centcom/holding) "Fv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/tdome) "Fw" = (/turf/unsimulated/floor{tag = "icon-whitehall (EAST)"; icon_state = "whitehall"; dir = 4},/area/centcom/holding) -"Fx" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Fx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "Fy" = (/turf/unsimulated/floor{dir = 4; icon_state = "whitegreen"},/area/centcom/holding) "Fz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/shuttle/plating,/area/centcom/holding) "FA" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome) @@ -1642,7 +1642,7 @@ "FD" = (/turf/unsimulated/floor{tag = "icon-whitehall (NORTHEAST)"; icon_state = "whitehall"; dir = 5},/area/centcom/holding) "FE" = (/obj/machinery/optable,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) "FF" = (/turf/unsimulated/floor{tag = "icon-whitehall (NORTHWEST)"; icon_state = "whitehall"; dir = 9},/area/centcom/holding) -"FG" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"FG" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/wall,/area/centcom/holding) "FH" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreen"},/area/centcom/holding) "FI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/shuttle/plating,/area/centcom/holding) "FJ" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome) @@ -1660,8 +1660,8 @@ "FV" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/adv{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/turf/unsimulated/floor{dir = 0; icon_state = "whitegreen"},/area/centcom/holding) "FW" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/turf/unsimulated/floor{dir = 0; icon_state = "whitegreen"},/area/centcom/holding) "FX" = (/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/unsimulated/floor{dir = 6; icon_state = "whitegreen"},/area/centcom/holding) -"FY" = (/obj/structure/sign/redcross{pixel_y = -32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"FZ" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/handcuffs,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"FY" = (/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"FZ" = (/obj/item/tape/engineering{tag = "icon-engineering_v"; icon_state = "engineering_v"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Ga" = (/obj/structure/closet/secure_closet/bar,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) "Gb" = (/turf/unsimulated/floor{icon_state = "white"},/area/tdome) "Gc" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) @@ -1702,12 +1702,12 @@ "GL" = (/obj/structure/table/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) "GM" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) "GN" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"GO" = (/obj/machinery/camera{pixel_x = 11; pixel_y = -9; network = list("thunder"); c_tag = "Red Team"},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"GO" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/holding) "GP" = (/turf/simulated/floor/bluegrid,/area/tdome) "GQ" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome) -"GR" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("thunder"); c_tag = "Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"GR" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "GS" = (/obj/machinery/atmospherics/pipe/vent,/turf/simulated/floor/bluegrid,/area/tdome) -"GT" = (/obj/machinery/camera{pixel_x = 10; network = list("thunder"); c_tag = "Arena"},/turf/simulated/floor/bluegrid,/area/tdome) +"GT" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/obj/item/clothing/head/bandana{pixel_y = -10},/obj/item/clothing/glasses/sunglasses,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "GU" = (/turf/unsimulated/beach/sand{density = 1; opacity = 1},/area/beach) "GV" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/tdome) "GW" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor,/area/tdome) @@ -1719,14 +1719,14 @@ "Hc" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/tdome) "Hd" = (/obj/effect/overlay/palmtree_l,/turf/unsimulated/beach/sand,/area/beach) "He" = (/obj/effect/overlay/palmtree_r,/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/beach) -"Hf" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Hf" = (/obj/structure/closet/athletic_mixed,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "Hg" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) "Hh" = (/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/beach) "Hi" = (/turf/unsimulated/floor{icon_state = "redcorner"; dir = 8},/area/tdome) "Hj" = (/obj/structure/table/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) -"Hk" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Hk" = (/obj/item/tape/engineering{tag = "icon-engineering_v"; icon_state = "engineering_v"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Hl" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/tdome) -"Hm" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Hm" = (/turf/unsimulated/wall{tag = "icon-iron1"; icon_state = "iron1"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Hn" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/tdome) "Ho" = (/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) "Hp" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) @@ -1756,7 +1756,7 @@ "HN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/beach/sand,/area/beach) "HO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/beach/sand,/area/beach) "HP" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/beach) -"HQ" = (/obj/structure/bed/chair,/turf/unsimulated/beach/sand,/area/beach) +"HQ" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Bar Center"},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "HR" = (/mob/living/simple_animal/crab/Coffee,/turf/unsimulated/beach/sand,/area/beach) "HS" = (/obj/item/clothing/head/collectable/paper,/turf/unsimulated/beach/sand,/area/beach) "HT" = (/turf/unsimulated/floor{icon_state = "sandwater"},/area/beach) @@ -1773,7 +1773,7 @@ "Ie" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "If" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/nuclear,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "Ig" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/wizard_station) -"Ih" = (/obj/machinery/vending/engivend,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Ih" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "\[center]\[b]LIST OF SPELLS AVAILABLE\[/b]\[/center]\[br]\[br]Magic Missile:\[br]This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.\[br]\[br]Fireball:\[br]This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.\[br]\[br]Disintegrate:\[br]This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.\[br]\[br]Disable Technology:\[br]This spell disables all weapons, cameras and most other technology in range.\[br]\[br]Smoke:\[br]This spell spawns a cloud of choking smoke at your location and does not require wizard garb.\[br]\[br]Blind:\[br]This spell temporarly blinds a single person and does not require wizard garb.\[br]Forcewall:\[br]This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.\[br]\[br]Blink:\[br]This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.\[br]\[br]Teleport:\[br]This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.\[br]\[br]Mutate:\[br]This spell causes you to turn into a hulk, and gain telekinesis for a short while.\[br]\[br]Ethereal Jaunt:\[br]This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.\[br]\[br]Knock:\[br]This spell opens nearby doors and does not require wizard garb.\[br]"; name = "List of Available Spells (READ)"},/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/wizard_station) "Ii" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/wizard_station) "Ij" = (/obj/structure/toilet{pixel_y = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station) "Ik" = (/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station) @@ -1800,27 +1800,27 @@ "IF" = (/obj/machinery/vending/magivend,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "IG" = (/obj/structure/mineral_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "IH" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"II" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"IJ" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) -"IK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/creed) -"IL" = (/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"II" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"IJ" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"IK" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals South"; dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) +"IL" = (/turf/unsimulated/wall{icon_state = "iron14"},/area/syndicate_mothership{name = "\improper Raider Base"}) "IM" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack/cultpack,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "IN" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/monocle,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "IO" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "IP" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/under/psysuit,/obj/item/clothing/suit/wizrobe/psypurple,/obj/item/clothing/head/wizard/amp,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "IQ" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/shoes/sandal/marisa{desc = "A set of fancy shoes that are as functional as they are comfortable."; name = "Gentlemans Shoes"},/obj/item/clothing/under/gentlesuit,/obj/item/clothing/suit/wizrobe/gentlecoat,/obj/item/clothing/head/wizard/cap,/obj/item/weapon/staff/gentcane,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "IR" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"IS" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Armor Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"IT" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"IU" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{name = "Spec Ops Ready Room"; desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; pixel_y = 15; req_access = list(11); id = "CREED"},/obj/machinery/door_control{name = "Mech Storage"; desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; pixel_y = 0; req_access = list(11); id = "ASSAULT"},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) -"IV" = (/obj/machinery/door/airlock/centcom{name = "Creed's Office"; opacity = 1; req_access = list(108)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) -"IW" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"IX" = (/obj/structure/table/rack,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"IY" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"IS" = (/turf/unsimulated/wall{tag = "icon-iron2"; icon_state = "iron2"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"IT" = (/obj/structure/table,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"IU" = (/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"IV" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access = list(19)},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"IW" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/cobweb2{tag = "icon-cobweb1"; icon_state = "cobweb1"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"IX" = (/obj/structure/table/reinforced,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"IY" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = 25; tag_door = "centcom_shuttle_bay_door"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "IZ" = (/obj/structure/flora/pottedplant{tag = "icon-plant-06"; icon_state = "plant-06"},/turf/simulated/floor/holofloor{icon_state = "wood"; dir = 4},/area/holodeck/source_theatre) -"Ja" = (/obj/structure/table/rack,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Jb" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Jc" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Ja" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) +"Jb" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Jc" = (/turf/unsimulated/wall{icon_state = "iron11"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Jd" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "Je" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "Jf" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/cups,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) @@ -1829,57 +1829,57 @@ "Ji" = (/obj/item/target/syndicate,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "Jj" = (/obj/item/target/alien,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "Jk" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/wizard_station) -"Jl" = (/obj/machinery/shield_capacitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Jl" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/syndicate_mothership{name = "\improper Raider Base"}) "Jm" = (/obj/structure/kitchenspike,/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) "Jn" = (/obj/structure/kitchenspike,/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) -"Jo" = (/obj/machinery/shield_gen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Jp" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Jq" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Jr" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Jo" = (/obj/item/tape/engineering{tag = "icon-engineering_h"; icon_state = "engineering_h"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Jp" = (/obj/structure/urinal{pixel_y = 32},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Jq" = (/obj/structure/urinal{pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Jr" = (/turf/unsimulated/wall{icon_state = "iron9"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Js" = (/obj/structure/table/woodentable,/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/milosoup,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "Jt" = (/obj/structure/table/woodentable,/obj/item/weapon/dice,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "Ju" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "Jv" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station) "Jw" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) "Jx" = (/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) -"Jy" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Jz" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JA" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/emps,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/gun/launcher/grenade,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JB" = (/obj/structure/table/reinforced,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom) -"JD" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JE" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JF" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"Jy" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Jz" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"JA" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JB" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JC" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JD" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JE" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JF" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "JG" = (/obj/structure/table/woodentable,/obj/item/device/megaphone,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"JH" = (/obj/structure/table/rack,/obj/item/rig_module/mounted,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JI" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JJ" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JK" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JL" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JN" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JO" = (/obj/machinery/door/airlock/centcom{name = "Research Facility"; opacity = 1; req_access = list(104)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/test) +"JH" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(2)},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) +"JI" = (/obj/item/clothing/head/xenos,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JJ" = (/obj/item/organ/xenos/plasmavessel,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JK" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror/raider{pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JL" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "centcom_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) +"JM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) +"JN" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "shuttle_dock_north_mech"; pixel_y = -19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"JO" = (/obj/item/clothing/mask/gas/swat{desc = "A close-fitting mask clearly not made for a human face."; name = "\improper alien mask"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) "JP" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chawanmushi,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JQ" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c1,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JR" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/robotics_cyborgs,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "JS" = (/obj/structure/table/reinforced,/obj/item/robot_parts/head,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "JT" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) -"JU" = (/obj/structure/table/reinforced,/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JV" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) -"JW" = (/obj/machinery/door/airlock/centcom{name = "Teleporter Bay"; opacity = 1; req_access = list(107)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) -"JX" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JY" = (/obj/machinery/vending/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"JZ" = (/obj/machinery/power/emitter,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Ka" = (/obj/machinery/pipedispenser/disposal/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Kb" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"Kc" = (/obj/structure/shuttle/engine/heater,/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Kd" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) +"JU" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/weapon/gun/launcher/spikethrower,/obj/item/clothing/under/vox/vox_casual,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JV" = (/obj/item/xenos_claw,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JW" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/weapon/gun/launcher/spikethrower,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JY" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"JZ" = (/obj/item/pizzabox/meat,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Ka" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Kb" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Kc" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Kd" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Ke" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/wizard_station) "Kf" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/wizard_station) "Kg" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows"},/area/wizard_station) "Kh" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/wizard_station) -"Ki" = (/turf/unsimulated/wall{tag = "icon-iron1"; icon_state = "iron1"},/area/shuttle/skipjack/station) -"Kj" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) +"Ki" = (/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "warning"},/area/centcom/holding) +"Kj" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/under/vox/vox_casual,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Kk" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) "Kl" = (/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) "Km" = (/turf/unsimulated/floor{tag = "icon-ironsand8"; icon_state = "ironsand8"},/turf/unsimulated/floor{tag = "icon-asteroid8"; name = "plating"; icon_state = "asteroid8"},/area/wizard_station) @@ -1888,18 +1888,18 @@ "Kp" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "Kq" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "Kr" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"Ks" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) +"Ks" = (/obj/structure/shuttle/engine/heater,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "Kt" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"Ku" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"Kv" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/simulated/floor,/area/tdome) -"Kw" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Kx" = (/obj/item/weapon/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Ky" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/crowbar,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Kz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"KA" = (/turf/unsimulated/wall{icon_state = "iron6"},/area/shuttle/skipjack/station) -"KB" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"KC" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"KD" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) +"Ku" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Kv" = (/turf/unsimulated/floor{icon_state = "warning"; dir = 1; heat_capacity = 1},/area/centcom/holding) +"Kw" = (/obj/item/organ/xenos/eggsac,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Kx" = (/obj/item/weapon/tank/nitrogen,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Ky" = (/obj/item/organ/stack,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Kz" = (/obj/structure/bed/chair,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KD" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) "KE" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-lava"; name = "plating"; icon_state = "lava"},/area/wizard_station) "KF" = (/turf/space/transit/east/shuttlespace_ew8,/area/shuttle/escape_pod5/transit) "KG" = (/turf/unsimulated/floor{tag = "icon-ironsand14"; icon_state = "ironsand14"},/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) @@ -1907,46 +1907,46 @@ "KI" = (/mob/living/simple_animal/hostile/retaliate/goat{name = "Experiment 97d"},/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) "KJ" = (/obj/item/weapon/caution,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "KK" = (/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) -"KL" = (/turf/unsimulated/wall{icon_state = "iron10"},/area/shuttle/skipjack/station) -"KM" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"KN" = (/turf/unsimulated/wall{icon_state = "iron13"},/area/shuttle/skipjack/station) -"KO" = (/turf/unsimulated/wall{icon_state = "iron12"},/area/shuttle/skipjack/station) -"KP" = (/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"KQ" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"KR" = (/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"KS" = (/obj/machinery/atmospherics/pipe/tank/nitrogen{dir = 1; initialize_directions = 1; start_pressure = 493.6},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"KT" = (/turf/unsimulated/wall{icon_state = "iron3"},/area/shuttle/skipjack/station) -"KU" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"KV" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"KW" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) -"KX" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) -"KY" = (/obj/structure/table,/obj/item/weapon/deck,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"KZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"La" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Lb" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Lc" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Ld" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Le" = (/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) -"Lf" = (/turf/unsimulated/wall{tag = "icon-iron7"; icon_state = "iron7"},/area/shuttle/skipjack/station) -"Lg" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Lh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Li" = (/turf/unsimulated/wall{icon_state = "iron11"},/area/shuttle/skipjack/station) -"Lj" = (/turf/unsimulated/wall{tag = "icon-iron4"; icon_state = "iron4"},/area/shuttle/skipjack/station) -"Lk" = (/turf/unsimulated/wall{tag = "icon-iron8"; icon_state = "iron8"},/area/shuttle/skipjack/station) -"Ll" = (/obj/structure/table,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Lm" = (/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Ln" = (/obj/structure/table,/obj/item/weapon/deck,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) -"Lo" = (/obj/structure/table,/obj/item/weapon/legcuffs,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) -"Lp" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Lq" = (/obj/structure/table,/obj/item/weapon/cautery,/obj/item/weapon/retractor,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Lr" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Ls" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) -"Lt" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rainbow,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) +"KL" = (/obj/machinery/computer/station_alert,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KM" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KN" = (/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "shuttle_dock_south_mech"; pixel_y = 19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"KP" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) +"KQ" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KR" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) +"KS" = (/obj/machinery/door/airlock/glass_medical{name = "Arrivals Medbay"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"KT" = (/obj/machinery/door/airlock/glass_medical{name = "Escape Shuttle Infirmary"; req_access = list(5)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"KU" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KV" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"KW" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 29},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) +"KX" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"KY" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) +"KZ" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) +"La" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) +"Lb" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) +"Lc" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) +"Ld" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron1"},/area/shuttle/skipjack/station) +"Le" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Lf" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access = list(150)},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) +"Lg" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron6"},/area/shuttle/skipjack/station) +"Lh" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Li" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Lj" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Lk" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron10"},/area/shuttle/skipjack/station) +"Ll" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Lm" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_east_control"; req_access = list(150)},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) +"Ln" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) +"Lo" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron13"},/area/shuttle/skipjack/station) +"Lp" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron12"},/area/shuttle/skipjack/station) +"Lq" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Lr" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) +"Ls" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron3"},/area/shuttle/skipjack/station) +"Lt" = (/obj/structure/table,/obj/item/weapon/deck,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) "Lu" = (/turf/unsimulated/floor{tag = "icon-ironsand7"; icon_state = "ironsand7"},/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) "Lv" = (/turf/unsimulated/floor{tag = "icon-ironsand12"; icon_state = "ironsand12"},/turf/unsimulated/floor{tag = "icon-asteroid2"; name = "plating"; icon_state = "asteroid2"},/area/wizard_station) -"Lw" = (/obj/structure/bed,/obj/item/weapon/bedsheet/hos,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) +"Lw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "Lx" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"Ly" = (/obj/structure/table,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"Ly" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron7"},/area/shuttle/skipjack/station) "Lz" = (/turf/simulated/floor/holofloor{icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_theatre) "LA" = (/turf/simulated/floor/holofloor/grass,/turf/simulated/floor/holofloor{icon_state = "wood_siding1"; dir = 2},/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{icon_state = "wood_siding5"; dir = 2},/area/holodeck/source_picnicarea) "LB" = (/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_theatre) @@ -1970,66 +1970,66 @@ "LT" = (/turf/space/transit/east/shuttlespace_ew3,/area/shuttle/escape_pod5/transit) "LU" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area/space) "LV" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area/space) -"LW" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) -"LX" = (/turf/unsimulated/wall{icon_state = "iron5"},/area/shuttle/skipjack/station) -"LY" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/obj/item/weapon/reagent_containers/food/snacks/liquidfood,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"LZ" = (/obj/structure/closet,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/obj/item/weapon/reagent_containers/food/snacks/tastybread,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"Ma" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"Mb" = (/turf/unsimulated/wall{icon_state = "iron9"},/area/shuttle/skipjack/station) -"Mc" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Md" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 1},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) -"Me" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Mf" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Mg" = (/turf/unsimulated/wall{icon_state = "iron14"},/area/shuttle/skipjack/station) -"Mh" = (/obj/item/pizzabox/meat,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Mi" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Mj" = (/obj/structure/bed,/obj/item/weapon/bedsheet/clown,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Mk" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Ml" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Mm" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Mn" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) -"Mo" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Mp" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Mq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Mr" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Ms" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"Mt" = (/turf/unsimulated/wall{tag = "icon-iron2"; icon_state = "iron2"},/area/shuttle/skipjack/station) -"Mu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Mv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Mw" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_west_control"; req_one_access = list(150)},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) -"Mx" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northwest_lock"; locked = 1; req_access = list(150)},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"My" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"Mz" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access = list(150)},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) +"LW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"LX" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron11"},/area/shuttle/skipjack/station) +"LY" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron4"},/area/shuttle/skipjack/station) +"LZ" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron8"},/area/shuttle/skipjack/station) +"Ma" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mb" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mc" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rainbow,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Md" = (/obj/structure/bed,/obj/item/weapon/bedsheet/hos,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Me" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron5"},/area/shuttle/skipjack/station) +"Mf" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron9"},/area/shuttle/skipjack/station) +"Mg" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mh" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mi" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron14"},/area/shuttle/skipjack/station) +"Mj" = (/obj/item/pizzabox/meat,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mk" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Ml" = (/obj/structure/bed,/obj/item/weapon/bedsheet/clown,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mm" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mn" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mo" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Mp" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Mq" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access = list(45)},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"Mr" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/harpoon,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/rig/light/stealth,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Ms" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Mt" = (/obj/structure/table,/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/minihoe,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Mu" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Mv" = (/obj/machinery/vending/hydroseeds,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Mw" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Mx" = (/obj/machinery/washing_machine,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"My" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/clothing/shoes/magboots,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Mz" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/clothing/suit/space/void/mining,/obj/item/clothing/head/helmet/space/void/mining,/obj/item/clothing/head/helmet/space/void/atmos,/obj/item/clothing/suit/space/void/atmos,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "MA" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns12,/area/space) -"MB" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "vox_east_control"; req_access = list(150)},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) -"MC" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access = list(45)},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) -"MD" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_southeast_lock"; locked = 1; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"ME" = (/obj/structure/table/rack,/obj/item/weapon/rig/light/hacker,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"MF" = (/obj/structure/table/rack,/obj/item/weapon/rig/industrial,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"MG" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_southwest_lock"; locked = 1; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"MH" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_east_vent"; tag_exterior_door = "vox_northeast_lock"; frequency = 1331; id_tag = "vox_east_control"; tag_interior_door = "vox_southeast_lock"; pixel_x = -24; req_access = list(150); tag_chamber_sensor = "vox_east_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"MI" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"MJ" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"MK" = (/obj/structure/bed/chair{dir = 1},/obj/item/clothing/glasses/thermal/monocle,/obj/item/clothing/head/pirate,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"ML" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"MM" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_west_vent"; tag_exterior_door = "vox_northwest_lock"; frequency = 1331; id_tag = "vox_west_control"; tag_interior_door = "vox_southwest_lock"; pixel_x = 24; req_access = list(150); tag_chamber_sensor = "vox_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating/vox,/area/shuttle/skipjack/station) -"MN" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"MO" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MB" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MC" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 28},/turf/unsimulated/floor{tag = "icon-whitecorner (NORTH)"; icon_state = "whitecorner"; dir = 1},/area/centcom/holding) +"MD" = (/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"ME" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MG" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MH" = (/turf/simulated/shuttle/wall{dir = 2; icon = 'icons/turf/walls.dmi'; icon_state = "iron2"},/area/shuttle/skipjack/station) +"MI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MK" = (/obj/item/robot_parts/head,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"ML" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northwest_lock"; locked = 1; req_access = list(150)},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MM" = (/obj/item/robot_parts/l_leg,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"MN" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) +"MO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "MP" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) "MQ" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) "MR" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"MS" = (/obj/machinery/camera{c_tag = "Shuttle"},/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"MT" = (/obj/machinery/status_display{pixel_y = 30},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) +"MS" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) +"MT" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) "MU" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 30},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"MV" = (/obj/structure/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/camera{c_tag = "Shuttle West"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"MW" = (/obj/structure/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/camera{c_tag = "Shuttle East"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"MX" = (/obj/machinery/camera{c_tag = "Shuttle Center"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"MV" = (/turf/unsimulated/beach/sand{tag = "icon-desert2"; icon_state = "desert2"},/area/centcom/holding) +"MW" = (/obj/item/weapon/inflatable_duck,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) +"MX" = (/obj/structure/sign/redcross,/turf/unsimulated/wall,/area/centcom/holding) "MY" = (/obj/machinery/status_display{pixel_y = 30},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"MZ" = (/obj/machinery/camera{c_tag = "Crescent Arrivals East"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) +"MZ" = (/turf/unsimulated/beach/sand{tag = "icon-desert1"; icon_state = "desert1"},/area/centcom/holding) "Na" = (/obj/structure/window/shuttle{icon_state = "window12"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"Nb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) +"Nb" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "Nc" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Nd" = (/obj/machinery/computer/secure_data,/obj/machinery/camera{c_tag = "Crescent Arrivals North"; dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"Nd" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand{tag = "icon-coconuts"; icon_state = "coconuts"},/area/centcom/holding) "Ne" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"; dir = 2},/area/shuttle/escape/centcom) "Nf" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Ng" = (/obj/structure/AIcore/deactivated,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) @@ -2039,21 +2039,20 @@ "Nk" = (/obj/machinery/computer/shuttle_control/emergency,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Nl" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Nm" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Nn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"No" = (/obj/machinery/status_display{pixel_y = 30},/obj/structure/table,/obj/machinery/camera{c_tag = "Shuttle Bridge East"},/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Np" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"Nn" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access = list(150)},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"No" = (/mob/living/simple_animal/crab,/turf/unsimulated/beach/sand{tag = "icon-desert3"; icon_state = "desert3"},/area/centcom/holding) "Nq" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{dir = 9; icon_state = "whitegreen"},/area/centcom/holding) -"Nr" = (/obj/machinery/camera{c_tag = "Crescent Medical"; dir = 4},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) +"Nr" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand{tag = "icon-desert_dug"; icon_state = "desert_dug"},/area/centcom/holding) "Ns" = (/obj/machinery/sleeper{icon_state = "sleeper_0-r"; orient = "RIGHT"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Nt" = (/obj/machinery/sleep_console{icon_state = "sleeperconsole-r"; orient = "RIGHT"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Nu" = (/obj/machinery/hologram/holopad,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) +"Nu" = (/obj/structure/closet/crate/freezer/rations,/obj/machinery/camera/network/crescent{c_tag = "Shuttle West Storage"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) "Nv" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/wrench,/turf/unsimulated/floor{dir = 8; icon_state = "whitegreen"},/area/centcom/holding) -"Nw" = (/obj/machinery/camera{c_tag = "Crescent Bar Center"},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"Nx" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/camera{c_tag = "Crescent Arrivals South"; dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) +"Nw" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/machinery/camera/network/crescent{c_tag = "Shuttle Medical"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"Nx" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/crescent{c_tag = "Shuttle East Storage"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) "Ny" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"Nz" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/machinery/camera{c_tag = "Crescent Bar East"; dir = 4},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"NA" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"NB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) +"Nz" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Bar West"; dir = 4},/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) +"NA" = (/obj/effect/overlay/palmtree_l,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) +"NB" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_southeast_lock"; locked = 1; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "NC" = (/obj/machinery/status_display{pixel_y = -30},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "ND" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "NE" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) @@ -2064,71 +2063,79 @@ "NJ" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "NK" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "NL" = (/obj/structure/closet/hydrant{pixel_x = -30; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) -"NM" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/engie,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/engie,/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/skipjack/station) +"NM" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "NN" = (/obj/machinery/door/airlock/glass_mining{name = "Shuttle Cargo"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) -"NO" = (/obj/machinery/camera{c_tag = "Crescent Bar West"; dir = 4},/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry) +"NO" = (/obj/machinery/hologram/holopad,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "NP" = (/obj/structure/bed/roller,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "NQ" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "NR" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"NS" = (/obj/machinery/recharge_station,/obj/machinery/camera{c_tag = "Shuttle East Storage"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) +"NS" = (/turf/unsimulated/beach/sand{tag = "icon-beach"; icon_state = "beach"},/area/centcom/holding) "NT" = (/obj/machinery/recharge_station,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) -"NU" = (/obj/item/robot_parts/head,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"NU" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) "NV" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"NW" = (/obj/machinery/camera{c_tag = "Shuttle Medical"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"NX" = (/obj/structure/closet/crate/freezer/rations,/obj/machinery/camera{c_tag = "Shuttle West Storage"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) +"NW" = (/turf/unsimulated/beach/sand{tag = "icon-beachcorner"; icon_state = "beachcorner"},/area/centcom/holding) +"NX" = (/turf/unsimulated/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/centcom/holding) "NY" = (/obj/structure/closet/crate/freezer/rations,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) -"NZ" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"NZ" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) "Oa" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) "Ob" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/evac) -"Oc" = (/obj/structure/table,/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/minihoe,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Od" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/harpoon,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/rig/light/stealth,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Oe" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Of" = (/obj/machinery/vending/hydroseeds,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Og" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/clothing/shoes/magboots,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Oh" = (/obj/machinery/washing_machine,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Oi" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/clothing/suit/space/void/mining,/obj/item/clothing/head/helmet/space/void/mining,/obj/item/clothing/head/helmet/space/void/atmos,/obj/item/clothing/suit/space/void/atmos,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Oj" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Ok" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 28},/turf/unsimulated/floor{tag = "icon-whitecorner (NORTH)"; icon_state = "whitecorner"; dir = 1},/area/centcom/holding) -"Ol" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Om" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/crossbow,/obj/item/stack/rods{amount = 10},/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"On" = (/obj/structure/table/rack,/obj/item/weapon/grenade/empgrenade,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/grenade/spawnergrenade,/turf/simulated/shuttle/floor{icon_state = "floor4"; oxygen = 0},/area/shuttle/skipjack/station) -"Oo" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Op" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"Oq" = (/obj/item/robot_parts/l_leg,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) -"Or" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"Os" = (/obj/item/organ/stack,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Ot" = (/obj/item/organ/xenos/eggsac,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Ou" = (/obj/item/weapon/tank/nitrogen,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Ov" = (/obj/structure/bed/chair,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Ow" = (/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Ox" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/glasses/thermal/monocle,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Oy" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/pressure,/obj/item/clothing/head/helmet/space/vox/pressure,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/under/vox/vox_casual,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Oz" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/evac) -"OA" = (/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OB" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OF" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/obj/machinery/mech_sensor{dir = 8; frequency = 1380; id_tag = "shuttle_dock_south_mech"; pixel_y = 19},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"OG" = (/obj/machinery/computer/station_alert,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OH" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OI" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) -"OJ" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OK" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OL" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/syndicate_mothership{name = "\improper Raider Base"}) -"OM" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 29},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) -"ON" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"OO" = (/obj/machinery/door/airlock/glass_medical{name = "Escape Shuttle Infirmary"; req_access = list(5)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"OP" = (/obj/machinery/door/airlock/glass_medical{name = "Arrivals Medbay"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"OQ" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) -"OR" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) -"OS" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) -"OT" = (/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"OU" = (/turf/space,/area/shuttle/skipjack/station) -"OV" = (/mob/living/carbon/human/monkey{name = "Murphey"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"Oc" = (/obj/structure/table/rack,/obj/item/weapon/rig/light/hacker,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Od" = (/obj/structure/table/rack,/obj/item/weapon/rig/industrial,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Oe" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_southwest_lock"; locked = 1; req_access = list(150)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Of" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_east_vent"; tag_exterior_door = "vox_northeast_lock"; frequency = 1331; id_tag = "vox_east_control"; tag_interior_door = "vox_southeast_lock"; pixel_x = -24; req_access = list(150); tag_chamber_sensor = "vox_east_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "vox_east_vent"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Og" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Oh" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Oi" = (/obj/item/weapon/wrench,/obj/item/weapon/mop,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Oj" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Ok" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/crowbar,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Ol" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Om" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Medical"; dir = 4},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) +"On" = (/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) +"Oo" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Op" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"Oq" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"Or" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"Os" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Ot" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Ou" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_west_vent"; tag_exterior_door = "vox_northwest_lock"; frequency = 1331; id_tag = "vox_west_control"; tag_interior_door = "vox_southwest_lock"; pixel_x = 24; req_access = list(150); tag_chamber_sensor = "vox_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"Ov" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) +"Ow" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"Ox" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"Oy" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/skipjack/station) +"Oz" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/skipjack/station) +"OA" = (/obj/structure/table,/obj/item/weapon/deck,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) +"OB" = (/obj/structure/table,/obj/item/weapon/legcuffs,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) +"OC" = (/obj/structure/table,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"OD" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"OE" = (/obj/structure/table,/obj/item/weapon/cautery,/obj/item/weapon/retractor,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"OF" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) +"OG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"OH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast{dir = 2; id = "skipjack"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"OI" = (/obj/structure/table,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"OJ" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/skipjack/station) +"OK" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/engie,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/engie,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station) +"OL" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/clothing/suit/space/pirate,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"OM" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"ON" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 1},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/skipjack/station) +"OO" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/crossbow,/obj/item/stack/rods{amount = 10},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"OP" = (/obj/structure/table/rack,/obj/item/weapon/grenade/empgrenade,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/grenade/spawnergrenade,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"OQ" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/glasses/thermal/plain/monocle,/obj/item/clothing/under/vox/vox_robes,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"OR" = (/obj/structure/bed/chair{dir = 1},/obj/item/clothing/glasses/thermal/plain/monocle,/obj/item/clothing/head/pirate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station) +"OS" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) +"OT" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/simulated/floor,/area/tdome) +"OU" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"OV" = (/turf/space,/area/shuttle/skipjack/station) "OW" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"OX" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"OY" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "\[center]\[b]LIST OF SPELLS AVAILABLE\[/b]\[/center]\[br]\[br]Magic Missile:\[br]This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.\[br]\[br]Fireball:\[br]This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.\[br]\[br]Disintegrate:\[br]This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.\[br]\[br]Disable Technology:\[br]This spell disables all weapons, cameras and most other technology in range.\[br]\[br]Smoke:\[br]This spell spawns a cloud of choking smoke at your location and does not require wizard garb.\[br]\[br]Blind:\[br]This spell temporarly blinds a single person and does not require wizard garb.\[br]Forcewall:\[br]This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.\[br]\[br]Blink:\[br]This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.\[br]\[br]Teleport:\[br]This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.\[br]\[br]Mutate:\[br]This spell causes you to turn into a hulk, and gain telekinesis for a short while.\[br]\[br]Ethereal Jaunt:\[br]This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.\[br]\[br]Knock:\[br]This spell opens nearby doors and does not require wizard garb.\[br]"; name = "List of Available Spells (READ)"},/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/wizard_station) +"OX" = (/mob/living/carbon/human/monkey{name = "Murphey"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"OY" = (/obj/machinery/door/airlock/centcom{name = "Engineering Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) +"OZ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(0)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"Pa" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1331; id_tag = "merc_base"; pixel_x = -25; pixel_y = -5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"Pb" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/turf/unsimulated/beach/sand{tag = "icon-coconuts"; icon_state = "coconuts"},/area/centcom/holding) +"Pc" = (/obj/effect/landmark{name = "tdome2"},/obj/machinery/camera/network/thunder{c_tag = "Thunderdome - Red Team"; invisibility = 101},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"Pd" = (/obj/effect/landmark{name = "tdome1"},/obj/machinery/camera/network/thunder{c_tag = "Green Team"; invisibility = 101},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"Pe" = (/obj/machinery/camera/network/thunder{c_tag = "Thunderdome Arena"; invisibility = 101},/turf/simulated/floor/bluegrid,/area/tdome) +"Pf" = (/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) +"Pg" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) (1,1,1) = {" aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoalahajeEapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtwtwtwtwtwtwtwtwtwtwtwtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaQ @@ -2168,39 +2175,39 @@ adaXaVbfaWbbaZaSbdbeaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeaUaVbaaWakaVabaZaYaXaVbdbbbe alaWbeaRaSaYaVaZaTbbbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbaXbebdaSaabeaeaVbaaWbeaTaYbbaRfWcfdbfXfYfZcwdtcgaUbaaWbbbfbeaXbdafbeaRaLfLaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgagagafUfOgbgcfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aoaSbbaUaZbabeaVbcaYbfaTaXaRbdaWbebabfbbaUaVaTaZaRaYaWbbaTaZajbbahbebdaSbbbcbaaYgdLVgfggghgigjgkglfZgmbdaSaYaRbbaWaTanbbaUaLfLaUaTaTbeaUaTbeaUaTbeaUaTbeaUaTbeaUaUaTaTbeaUaTbeaUaTbeaUaTbeaUaTbeaUaTaTfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM abaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaSaYbcaVamaYagbbaTaZaYbfbdbagmgigqghglgrgsgtgugvgwaTaZbaaUaYaSbcakaYaXaLfLaXbcbcbbaXbcbbaXbcbbaXbcbbaXgxgygmgmgxgxgyaXbcbbaXbcbbaXbcbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUgzgAgBgCgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aeanamacakalajaaaeadahabaiagaoafajalahamacaaabakagadafamabakMAbaacaYbcaVbaaRaTbdgwgtgugkgIgfglghgjgJgKbcaVbdaXbaaZbfaabaaWaLfLaWbfbfaYaWbfaYaWbfaYaWbfaYaWgLhIgwgwgLhpgOaWbfaYaWbfaYaWbfaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUgPgAgEgEgDgEgAgEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ahbdaSaYaRbbaWaTbbbdaSaYaRbbaWaTbbaWaTbdaSaYaRbbaWaTanaMaMaMaMbdaibabfbebdaUbcaTgKghgjgvgqgigIgkgggsgQbfbeaTaWbdaVaRajbdaSaLfLaSaRaRbaaSaRbagKgRgSgKgRgSgKgRhkhvhvhahagSgKgRgSgKgRgSgKaRbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogojDgXjvgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -agaTaZbaaUaYaSbcaYaTaZbaaUaYaSbcaYaSbcaTaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbaTaXbfbcgQgkgggJgugtgqgvgrglgZaRbbbcaSaTbeaUamaTaZaLfLaZaUaUbdaZaUbdgQhtgVhqhthbgQhtgVhqhqhthtgVgQgdgVhqhtgVgQaUbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogojDgXjvgEgEgEgEjEgEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -acbcaVbdaXbaaZbfbabcaVbdaXbaaZbfbaaZbfbcaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYbcaWaRbfgZgvgrgsgjghgugJgfgIhhaUaYbfaZbcbbaXadbcbeaLfLaVaXaXaTaVaXaTgZgTcZgYgThlgYgTcZgYgYgTgTcZgYgmcZgYgTcZgZaXaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUhmgohnfUgPgAgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aibfbeaTaWbdaVaRbdbfbeaTaWbdaVaRbdaVaRbfbeaTaWbdaVaRajaMaMaMaMbfakbcaXbabfaSaUaRhhhogfglgggkgjgsgicggyaXbaaRaVbfaYaWalbfbbaLfLbeaWaWbcbeaWbchhgMhrgUgMgxgUgMhrgUgUgMgMhrgUgwhrgUgMhrhhaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNhsfUkkfUhugzgAgEgEgDgEgAgEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -afaRbbbcaSaTbeaUaTaRbbbcaSaTbeaUaTbeaUaRbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdaRaZaXaUhodtgrgvgrgvgggrgvfZgOaWbdaUbeaRbaaSaoaRaYaLfLbbaSaSbfbbaSbfgyhvhpgNhvgLgNhvhpgNgNhvhvhpgNgKhpgNhvhpgyaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNaMhshwhuaMgzgAgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhxhyhzhAhBhfhfhfaMhghghghxhyhzhAhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -anaUaYbfaZbcbbaXbcaUaYbfaZbcbbaXbcbbaXaUaYbfaZbcbbaXadaMaMaMaMaUajaRaSaTaXicfXhChDgrgigsgigsgfgigsgkfZfZgxhCaYaUbdaZabaUbaaLfLaZaRaYaZaYaZaRgOhqhahIhqhahIhqhahIhqhahIhqhIhqhahIhqhagOaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEhFhFhFhGhHkqhHhHhHkuhHhKhFhFhFhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -akaXbaaRaVbfaYaWbfaXbaaRaVbfaYaWbfaYaWaXbaaRaVbfaYaWalaMaMaMaMaXamaUaZbcaWgygkgtgIgigsgjgrgvgigugvgrgqgkgkfXbaaXaTaVaeaXbdaLfLaVaUbaaVbaaVaUgSgYhthkgYhthkgYhthkgYhthkgYhkgYhthkgYhtgSaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEhLhMhNhOhPkxhRhShTkIhPhVhWhXhYhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aaaWbdaUbbaSaYbeaTaUhZiaibicidbaiecdifcwigaUbeaRbaaSaoaMaMaMaMaWadaXaVbfaSgOgkghgqgugvgggigsgtgjgkgfgugvggcwbdaWbcbeahaWaTaLfLbeaXbdbebdbeaXhbgUgTgVgUgTgVgUgTgVgUgTgVgUgVgUgTgVgUgThbbeaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEiiiiijkPilimilinilimilkRijiiiihEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ajbaaTaXaRbdaUbfaSaXipiqirisitaXiuiviwixiyaXbbaUbdaZabaMaMaMaMaSalaWbeaRaZgSgvgkgugjgJgrgkgqghgggsgigjgJgrizaTaSbfbbagaSbcaLfLbeaXbdbebdbegmhbgUgTgVgUgTgVgUgTgVgUgTgVgUgVgUgTgVgUgThbhhaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAiAiAiBiAiAiAiCiDiAiAiAiCiAiAiAiAiAiAiCiAiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhWiikSimimimimimimimimimkSiihNiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ambdbcaWaUaTaXaRaZaWiyiHiIiJiKaWiLiMiNiOiPaWaYaXaTaVaeaMaMaMaMaZaoaSbbaUaVLUgJgvgjgggsgfgvgugkgrglgtgggsgficbcaZaRaYacaZbfaLfLbeaXbdbebdbegmgVgUgTgVgUgTgVgUgTgVgUgTgVgUgVgUgTgVgUgTgVhhaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiBiAiAiAiAiAiAiAiAiAiAiAiCiAiAiAiAiAiCiAiAiAiAiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhHhKiRilimiliSiSilimiThGhHiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -adaTbfaSaXbcaWaUaVaSiPiUiVirieaSipiWiXiYiZaSbaaWbcbeahaMaMaMaMaVabaZaYaXbecggsgJgggrglgigJgjgvgfgIghgrglgihobfaVaUbaaibeaRaLfLbbaWaTbbaTbbgwcZgNgMcZgNgMcZgNgMcZgNgMcZgNcZgNgMcZgNgMcZgyaWaTbbaWaTaMbbfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAjaiAiAiAiAiAiBiAiAiDiCiAiAiCiAiAiCiDiAiCiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEjbinimjcjbjbjdimjehEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -albcaRaZaWbfaSaXbeaZiZisjfiIjgaZiyjhixjiitaZbdaSbfbbagaMaMaMaMbeaeaVbaaWbbfZglgsgrgfgIgtgsgggJgigqgkgfgIgtdtaRbeaXbdafaMaUaLfLbfbabaaZbfbagQgLhkhqhphkgQgLhkhqhphphkhkhqgLgShqhphkhqgLgSaZbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiBiAiAiCiDiAiAiCiAiDihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjhEjkilimjcjbjbjdimhPhEjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aobfaUaVaSaRaZaWbbaVitipiKiZhZaViPigiuiyiKaVaTaZaRaYacaMaMaMaMbbahbebdaSgOdbgIglgfgigqghglgrgsgtgugvgigqghhDgdbbaWaTanbbaXaLfLaRbdbdaVaRbdaVgRhbgZgRhbgZgRgVgYhahagVgVgYgRhbgZgRhbgZgRbdaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiBiAiAiAiAiAiDiAiCiDiAiCiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjhihjimimiljojoilimhchdjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -abaRaXbebcaVaUbaaVaRaXbebcaVaUbaaVaUbaaRaXbebcaVaUbaaiaMaMaMaMaYagbbaTaZgSgggqgIgigtgugkgIgfglghgjgJgtgugkgIgmaYaSbcakaYaWaLfLaUaTaTbeaUaTbeaUaTbeaUaTbegdcZgUhthtcZcZgUgdaTbeaUaTbeaUaTbeaUaTbeaUaTaTfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAjrjrjrjrjrjrjriAiAiAiAiAiAiAiCiAiAjaiDiAiAiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjhEhPjsimimimimimimilhEjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aebaaWbbbfbeaXbdbebaaWbbbfbeaXbdbeaXbdbaaWbbbfbeaXbdafaMaMaMaMbaacaYbcaVhbgrgugqgtghgjgvgqgigIgkgggsghgjgvgqgwbaaZbfaabaaSaLfLaXbcbcbbaXbcbbaXbcbbaXbcbbgmhrgNgTgThrhrgNgmbcbbaXbcbbaXbcbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAjtfOdjgWgWgWhefOjxiAiAiAiAjaiAiAiBiAiBiAiCiAiCihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhGhHhHhHjyimilimimjzhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ahaSaSaYaRbbaWaTbbaSaSaYaRbbaWaTbbaWaTaSaSaYaRbbaWaTanaMaMaMaMbdaibabfbehlgfgjgughgkgggJgugtgqgvgrglgkgggJgugKbdaVaRajbdaZaLfLaWbfbfaYaWbfaYaWbfaYaWbfaYgwhphIgMgMhphphIgwbfaYaWbfaYaWbfaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAfOjAjBjChQhJjFjFfOjGiAiAjrjrjrjrjrjrjrjrjHjIjrihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEjJjJjKjLimilimimiljMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -agaZaZbaaUaYaSbcaYaZaZbaaUaYaSbcaYaSbcaZaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbgxgigggjgkgvgrgsgjghgugJgfgIgvgrgsgjgQaTbeaUamaTbeaLfLaSaRaRbaaSaRbaaSaRbaaSaRbagKhahkhvhvhahahkgKaRbaaSaRbaaSaRbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAfOjNjBjBjOjBjBjBfOjGiAjPjQjRjRjSihihihihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjTjUjUjUjVimjWjXjYjXhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -acaVaVbdaXbaaZbfbaaVaVbdaXbaaZbfbaaZbfaVaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYgLgtgrgggvgigJgkgIgsghgqgrgtgJgfglgggZbcbbaXadbcbbaLfLaZaUaUbdaZaUbdaZaUbdaZaUbdgQgdgVhqhqhththbgQaUbdaZaUbdaZaUbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAfOjZjBjBjBkajBkbfOjGjajPkckdkdkdkekfihkgkhihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkikjjUiFimklkmknkohEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aibebeaTaWbdaVaRbdbebeaTaWbdaVaRbdaVaRbebeaTaWbdaVaRajaMaMaMaMbfakbcaXbagRghgfgrgJgtgsgvgqglgkgugfghgsgigIgrhhbfaYaWalbfaYaLfLaVaXaXaTaVaXaTaVaXaTaVaXaTaVgmhlgZgZgmgmhlaVaXaTaVaXaTaVaXaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAkpfOfOfOiofOfOfOkriAiAkskckdkdktkdkdikkvkvkwihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEhUjUjUjLimjXkykykzhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -afbbbbbcaSaTbeaUaTbbbbbcaSaTbeaUaTbeaUbbbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdfFgkgigfgsghglgJgugIgvgjgigkglgtgqgfdcaRbaaSaoaRbaaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAfOkAjBkAfOkBjrjrjrkCkDkdkEkFkGkdihkvkHkHihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkikjjUjVimjnkykykJhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -analahajaoacaeabanagakafamaafLfLfLfLfLahajabafaoaaagadaMaMaMaMaUajaRaSaTfYgvgtgiglgkgIgsgjgqgJgggtgvgIghgugidtaUbdaZabaUbdaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAfOkKjBkLfOjQjRjRjRjSihkdkEkMkGkdihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEkNkNhHkOjmhHhHkNkNiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -bebcaXbabfaSaUaRbeaWbbaVbdaYaZaTaUaSbbaXbaaRaVbfaYaWaTaMaMaMaMaXamaUaZbchCgJghgtgIgvcgglgggugsgrcwgJgqgkgjgthDaXaTbeaeaXaTaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAjtfOfOfOfOfOkKjBkLfOkckQkQkQkQjpkdkdkdkdkdjqkTkUihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhKkVjdimkWkXhGiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aeanamacakalajaaaeadahabaiagaoafajalahamacaaabakagadafamabakMAbaacaYbcaVbaaRaTbdgwgtgugkgIgfglghgjgJgKbcaVbdaXbaaZbfaabaaWaLfLaWbfbfaYaWbfaYaWbfaYaWbfaYaWgLcZgwgwgLgMgOaWbfaYaWbfaYaWbfaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUgPgAgEgEgDgEgAgEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ahbdaSaYaRbbaWaTbbbdaSaYaRbbaWaTbbaWaTbdaSaYaRbbaWaTanaMaMaMaMbdaibabfbebdaUbcaTgKghgjgvgqgigIgkgggsgQbfbeaTaWbdaVaRajbdaSaLfLaSaRaRbaaSaRbagKgRgSgKgRgSgKgRgNgTgTgUgUgSgKgRgSgKgRgSgKaRbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVgXgYgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +agaTaZbaaUaYaSbcaYaTaZbaaUaYaSbcaYaSbcaTaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbaTaXbfbcgQgkgggJgugtgqgvgrglgZaRbbbcaSaTbeaUamaTaZaLfLaZaUaUbdaZaUbdgQhchahdhchbgQhchahdhdhchchagQgdhahdhchagQaUbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVgXgYgEgEgEgEhigEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +acbcaVbdaXbaaZbfbabcaVbdaXbaaZbfbaaZbfbcaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYbcaWaRbfgZgvgrgsgjghgugJgfgIhhaUaYbfaZbcbbaXadbcbeaLfLaVaXaXaTaVaXaTgZhkhjhphkhlhphkhjhphphkhkhjhpgmhjhphkhjgZaXaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUhmgohnfUgPgAgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aibfbeaTaWbdaVaRbdbfbeaTaWbdaVaRbdaVaRbfbeaTaWbdaVaRajaMaMaMaMbfakbcaXbabfaSaUaRhhhogfglgggkgjgsgicggyaXbaaRaVbfaYaWalbfbbaLfLbeaWaWbcbeaWbchhhrhqhthrgxhthrhqhththrhrhqhtgwhqhthrhqhhaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNhsfUhvfUhugzgAgEgEgDgEgAgEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +afaRbbbcaSaTbeaUaTaRbbbcaSaTbeaUaTbeaUaRbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdaRaZaXaUhodtgrgvgrgvgggrgvfZgOaWbdaUbeaRbaaSaoaRaYaLfLbbaSaSbfbbaSbfgygTgMhIgTgLhIgTgMhIhIgTgTgMhIgKgMhIgTgMgyaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNaMhshwhuaMgzgAgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhxhyhzhAhBhfhfhfaMhghghghxhyhzhAhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +anaUaYbfaZbcbbaXbcaUaYbfaZbcbbaXbcbbaXaUaYbfaZbcbbaXadaMaMaMaMaUajaRaSaTaXicfXhChDgrgigsgigsgfgigsgkfZfZgxhCaYaUbdaZabaUbaaLfLaZaRaYaZaYaZaRgOhdgUcZhdgUcZhdgUcZhdgUcZhdcZhdgUcZhdgUgOaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEhFhFhFhGhHhJhHhHhHhQhHhKhFhFhFhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +akaXbaaRaVbfaYaWbfaXbaaRaVbfaYaWbfaYaWaXbaaRaVbfaYaWalaMaMaMaMaXamaUaZbcaWgygkgtgIgigsgjgrgvgigugvgrgqgkgkfXbaaXaTaVaeaXbdaLfLaVaUbaaVbaaVaUgShphcgNhphcgNhphcgNhphcgNhpgNhphcgNhphcgSaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEhLhMhNhOhPhUhRhShTikhPhVhWhXhYhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aaaWbdaUbbaSaYbeaTaUhZiaibicidbaiecdifcwigaUbeaRbaaSaoaMaMaMaMaWadaXaVbfaSgOgkghgqgugvgggigsgtgjgkgfgugvggcwbdaWbcbeahaWaTaLfLbeaXbdbebdbeaXhbhthkhahthkhahthkhahthkhahthahthkhahthkhbbeaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEiiiiijioilimilinilimiliFijiiiihEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ajbaaTaXaRbdaUbfaSaXipiqirisitaXiuiviwixiyaXbbaUbdaZabaMaMaMaMaSalaWbeaRaZgSgvgkgugjgJgrgkgqghgggsgigjgJgrizaTaSbfbbagaSbcaLfLbeaXbdbebdbegmhbhthkhahthkhahthkhahthkhahthahthkhahthkhbhhaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAiAiAiBiAiAiAiCiDiAiAiAiCiAiAiAiAiAiAiCiAiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhWiijmimimimimimimimimimjmiihNiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ambdbcaWaUaTaXaRaZaWiyiHiIiJiKaWiLiMiNiOiPaWaYaXaTaVaeaMaMaMaMaZaoaSbbaUaVLUgJgvgjgggsgfgvgugkgrglgtgggsgficbcaZaRaYacaZbfaLfLbeaXbdbebdbegmhahthkhahthkhahthkhahthkhahthahthkhahthkhahhaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiBiAiAiAiAiAiAiAiAiAiAiAiCiAiAiAiAiAiCiAiAiAiAiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhHhKiRilimiliSiSilimiThGhHiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +adaTbfaSaXbcaWaUaVaSiPiUiVirieaSipiWiXiYiZaSbaaWbcbeahaMaMaMaMaVabaZaYaXbecggsgJgggrglgigJgjgvgfgIghgrglgihobfaVaUbaaibeaRaLfLbbaWaTbbaTbbgwhjhIhrhjhIhrhjhIhrhjhIhrhjhIhjhIhrhjhIhrhjgyaWaTbbaWaTaMbbfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAjaiAiAiAiAiAiBiAiAiDiCiAiAiCiAiAiCiDiAiCiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEjbinimjcjbjbjdimjehEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +albcaRaZaWbfaSaXbeaZiZisjfiIjgaZiyjhixjiitaZbdaSbfbbagaMaMaMaMbeaeaVbaaWbbfZglgsgrgfgIgtgsgggJgigqgkgfgIgtdtaRbeaXbdafaMaUaLfLbfbabaaZbfbagQgLgNhdgMgNgQgLgNhdgMgMgNgNhdgLgShdgMgNhdgLgSaZbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiBiAiAiCiDiAiAiCiAiDihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjhEjkilimjcjbjbjdimhPhEjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aobfaUaVaSaRaZaWbbaVitipiKiZhZaViPigiuiyiKaVaTaZaRaYacaMaMaMaMbbahbebdaSgOdbgIglgfgigqghglgrgsgtgugvgigqghhDgdbbaWaTanbbaXaLfLaRbdbdaVaRbdaVgRhbgZgRhbgZgRhahpgUgUhahahpgRhbgZgRhbgZgRbdaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAiAiAiAiAiAiAiAiAiBiAiAiAiAiAiDiAiCiDiAiCiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjjnjpimimiljojoilimjujqjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +abaRaXbebcaVaUbaaVaRaXbebcaVaUbaaVaUbaaRaXbebcaVaUbaaiaMaMaMaMaYagbbaTaZgSgggqgIgigtgugkgIgfglghgjgJgtgugkgIgmaYaSbcakaYaWaLfLaUaTaTbeaUaTbeaUaTbeaUaTbegdhjhthchchjhjhtgdaTbeaUaTbeaUaTbeaUaTbeaUaTaTfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAjrjrjrjrjrjrjriAiAiAiAiAiAiAiCiAiAjaiDiAiAiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjhEhPjsimimimimimimilhEjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aebaaWbbbfbeaXbdbebaaWbbbfbeaXbdbeaXbdbaaWbbbfbeaXbdafaMaMaMaMbaacaYbcaVhbgrgugqgtghgjgvgqgigIgkgggsghgjgvgqgwbaaZbfaabaaSaLfLaXbcbcbbaXbcbbaXbcbbaXbcbbgmhqhIhkhkhqhqhIgmbcbbaXbcbbaXbcbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAjtfOdjgWgWgWhefOjxiAiAiAiAjaiAiAiBiAiBiAiCiAiCihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhGhHhHhHjyimilimimjzhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ahaSaSaYaRbbaWaTbbaSaSaYaRbbaWaTbbaWaTaSaSaYaRbbaWaTanaMaMaMaMbdaibabfbehlgfgjgughgkgggJgugtgqgvgrglgkgggJgugKbdaVaRajbdaZaLfLaWbfbfaYaWbfaYaWbfaYaWbfaYgwgMcZhrhrgMgMcZgwbfaYaWbfaYaWbfaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAfOjAjBjCjvjDjFjFfOjGiAiAjrjrjrjrjrjrjrjrjHjIjrihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEjJjJjKjLimilimimiljMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +agaZaZbaaUaYaSbcaYaZaZbaaUaYaSbcaYaSbcaZaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbgxgigggjgkgvgrgsgjghgugJgfgIgvgrgsgjgQaTbeaUamaTbeaLfLaSaRaRbaaSaRbaaSaRbaaSaRbagKgUgNgTgTgUgUgNgKaRbaaSaRbaaSaRbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAfOjNjBjBjOjBjBjBfOjGiAjPjQjRjRjSihihihihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjTjUjUjUjVimjWjXjYjXhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +acaVaVbdaXbaaZbfbaaVaVbdaXbaaZbfbaaZbfaVaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYgLgtgrgggvgigJgkgIgsghgqgrgtgJgfglgggZbcbbaXadbcbbaLfLaZaUaUbdaZaUbdaZaUbdaZaUbdgQgdhahdhdhchchbgQaUbdaZaUbdaZaUbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAfOjZjBjBjBkajBkbfOjGjajPkckdkdkdkekfihkgkhihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkikjjUjEimklkmknkohEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aibebeaTaWbdaVaRbdbebeaTaWbdaVaRbdaVaRbebeaTaWbdaVaRajaMaMaMaMbfakbcaXbagRghgfgrgJgtgsgvgqglgkgugfghgsgigIgrhhbfaYaWalbfaYaLfLaVaXaXaTaVaXaTaVaXaTaVaXaTaVgmhlgZgZgmgmhlaVaXaTaVaXaTaVaXaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAkpfOfOfOkkfOfOfOkriAiAkskckdkdktkdkdkqkvkvkwihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkujUjUjLimjXkykykzhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +afbbbbbcaSaTbeaUaTbbbbbcaSaTbeaUaTbeaUbbbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdfFgkgigfgsghglgJgugIgvgjgigkglgtgqgfdcaRbaaSaoaRbaaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAfOkAjBkAfOkBjrjrjrkCkDkdkEkFkGkdihkvkHkHihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkikjjUjVimkxkykykJhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +analahajaoacaeabanagakafamaafLfLfLfLfLahajabafaoaaagadaMaMaMaMaUajaRaSaTfYgvgtgiglgkgIgsgjgqgJgggtgvgIghgugidtaUbdaZabaUbdaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAiAiAiAiAiAfOkKjBkLfOjQjRjRjRjSihkdkEkMkGkdihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEkNkNhHkOkIhHhHkNkNiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +bebcaXbabfaSaUaRbeaWbbaVbdaYaZaTaUaSbbaXbaaRaVbfaYaWaTaMaMaMaMaXamaUaZbchCgJghgtgIgvcgglgggugsgrcwgJgqgkgjgthDaXaTbeaeaXaTaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAjtfOfOfOfOfOkKjBkLfOkckQkQkQkQkPkdkdkdkdkdkRkTkUihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhKkVjdimkWkXhGiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM bbaWbdaUbeaRaUbeaRaWbdaUbeaRaWbdaUbeaRaWbdaUbeaRbaaSbcaMaMaMaMaWadaXaVbffXgsgkghgqgJfZgIgrgjglgfizgsgugvggghfWaWbcbeahaWbcaLfLaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAfOkYjBjBjBfOkKjBkLfOkDkQkZjRjSihkdkdkdkdkdihlalalbihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEjbiliSillchEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aYaSaTaXbbaUaXbbaUaSaTaXbbaUaSaTaXbbaUaSaTaXbbaUbdaZbfaMaMaMaMaSalaWbeaRcwglgvgkgugsdbcgfYldfWhCicglgjgJgrgkcgaSbfbbagaSbfaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAfOkYjBkKlefOkKjBkLfOfOlflglhliihihihihihljihlklalbihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhElllmlnlolphEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -baaZbcaWaYaXaWaYaXaZbcaWaYaXaZbcaWaYaXaZbcaWaYaXaTaVaRaMaMaMaMaZaoaSbbaUizfWhoicdbhDldbcaWaUaTaShofWlddtfYicfZaZaRaYacaZaRaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihlqiAfOkYjBkKlrfOfOjufOfOltjBjBfOlulvliihlwlxlyihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiElzlAlAlAlBiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -bdaVbfaSbaaWaSbaaWaVbfaSbaaWaVbfaSbaaWaVbfaSbaaWbcbeaUaMaMaMaMaVaeaVbaaWbeaTaYbbaRbdaUbfaSaXbcaZaYaTaUbaaWbbbfbeaXbdafaVaXaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAfOkYjBjBjBmbjBjBlZjBjBjBjBfOjGiAjPlElFlxlxihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aTbeaRaZbdaSaZbdaSbeaRaZbdaSbeaRaZbdaSbeaRaZbdaSbfbbaXaMaMaMaMbeahakadaiaaaoamajahalagaeafacabanamaoagadacaiaeaaacalanbeaWaLfLaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAfOkYjBjBjBmcjBjBjBlHjBjBjBfOlIiAjPkclwlJlxihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +baaZbcaWaYaXaWaYaXaZbcaWaYaXaZbcaWaYaXaZbcaWaYaXaTaVaRaMaMaMaMaZaoaSbbaUizfWhoicdbhDldbcaWaUaTaShofWlddtfYicfZaZaRaYacaZaRaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihlqiAfOkYjBkKlrfOfOkSfOfOltjBjBfOlulvliihlwlxlyihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiElzlAlAlAlBiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +bdaVbfaSbaaWaSbaaWaVbfaSbaaWaVbfaSbaaWaVbfaSbaaWbcbeaUaMaMaMaMaVaeaVbaaWbeaTaYbbaRbdaUbfaSaXbcaZaYaTaUbaaWbbbfbeaXbdafaVaXaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAfOkYjBjBjBlsjBjBlCjBjBjBjBfOjGiAjPlElFlxlxihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aTbeaRaZbdaSaZbdaSbeaRaZbdaSbeaRaZbdaSbeaRaZbdaSbfbbaXaMaMaMaMbeahakadaiaaaoamajahalagaeafacabanamaoagadacaiaeaaacalanbeaWaLfLaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAiAfOkYjBjBjBlDjBjBjBlHjBjBjBfOlIiAjPkclwlJlxihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM bcbbaUaVaTaZaVaTaZbbaUaVaTaZbbaUaVaTaZbbaUaVaTaZaRaYaWaMaMaMaMaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAjtfOfOfOfOfOfOlKjBjBfOfOfOfOfOfOjxjPkDlwlxlxihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaMaMaMaMaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlLlMlNlOlPfOjBjBjBfOlQlRlSlTlUfOlVihlwlxlWihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlXlXlXlXlXlDjBjBjBlCjBjBjBjBmafOlVihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlLlMlXlXlXlYjBjBjBlGjBjBjBjBmafOjGiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlXlXlXlXmdfOmelsmgfOmhfOjwfOfOfOmjiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlXlXlXlXlXlGjBjBjBlYjBjBjBjBmafOlVihihihihihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlLlMlXlXlXlZjBjBjBmbjBjBjBjBmafOjGiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlXlXlXlXmdfOmemcmgfOmhfOjwfOfOfOmjiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlXlXlXfOfOfOlXlXlXfOfOfOjBjBjBfOjGiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOlLlMbDfOiAfOmlmlmlfOiAfOjFmmmnfOjGiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihiAfOmlmlmlfOiAkpmompmqkriAfOmlmlmlfOjGiAihaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2227,108 +2234,108 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmImDmDmTmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMkDmUmVmWmVmUihmumumumumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXmxmxmxmxmOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMihihmWmWmYihihmumumumumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihmWmWmWihmumumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZnananbihihrEihihihihihihihmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMnvrPrIrIrIrBnzaMaMndnenfngnenenerlihrFnjnknlihmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnInJrRnLrQnHnzaMndnenmnmnenenenerOnonononpihihihihihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZnananbihihmfihihihihihihihmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMnvrPrIrIrIrBnzaMaMndnenfngnenenerlihncnjnknlihmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnInJninLnnnHnzaMndnenmnmnenenenenCnonononpihihihihihmumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMnHnQnRnRnSnRnRnLnHaMndnqnrnsntneneneihnonononuihbOkQbTihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHnZnRnRnRnRoanLnHaMndnenAnAnenenepaihrtnonDnEihbLkQmkihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHofnRnRognRnRohnHaMndneneneneneneriihihihihihihbPkQnGihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHrAnHnHnHnHnHooaMnTnananUihkdkdkdihkTkTnVnWihcikQrcihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHswoyoaounFnHaMaMaMaMaMaMobkdkdkdoclalaododihcikQrcihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHnZnRnRnRnRoanLnHaMndnenAnAnenenepaihnKnonDnEihbLkQmkihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHofnRnRognRnRohnHaMndnenenenenenenMihihihihihihbPkQnGihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHonnHnHnHnHnHooaMnTnananUihkdkdkdihkTkTnVnWihcikQrcihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoCoyoaounFnHaMaMaMaMaMaMobkdkdkdoclalaododihcikQrcihmumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoBoAoanRornHaMaMaMaMaMaMoikdkdkdihojlaihihihokolokihihihihmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHoBoyoanRLYnHnzaMaMmPmKoFihkdkdkdihihihihnOnOkQkQkQnPnPpKihihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHnHnHnHvLoyoanRLZnHnHnHnHnzototihkdkdkdkdihnYnXkQkQkQkQkQkQkQkQqKihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHpioXoYnHnRoHnRoJnHnHoZoOrTrZjppnjpkdkdkdkdsakQkQkQkQkQoDkQkQkQkQoxihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMphoWpjoWnHnHnHsbnHnHsdoZplpmrZjppLjpkdkdkdkdihoqopkQkQkQkQkQkQkQkQoMihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMnHnHphsqnHnHnRnRslnHnHpzsfpznHoIoIihoPnanUihihihihowovkQkQkQozozoeihihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHManRnRpHnHnRnRnRnHrbsosvpInHmBaMmBaMaMaMaMmumuihihihokpcokihihihihmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVpdpepepepepfpfpepepepepgoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqanRnRnRpbnRnRnRoSnRnRnRqdnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVpdpppqprpspeoRpupepvpwpepepepgoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMnHqCnRnRnRoQnRnRnRoLnRnRnRqFnHaMaMaMaMaMaMaMaMaMmumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVpdpepBpBpBpBpepopopepBpBpDpEpepepgoVpFpFpFpFpFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnvnHnHnHnHnHnHnRnRnRnHnHnHnHnHnHnzaMaMaMaMaMmAaMmBmumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpepepMpNpOpPpepBpBpQpBpBpBpBpRpSpeoVpFpTpUpVpFpFpFpFpFpWpXpXpYpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqZrasesrpknHrenRnRnHrfrfrfrgrgnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqeqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeoVpFqopUpUnnqqqrqsqtquqsqvqwqxpFpFpFpFpFpFpFpFpFpFqyqzqzqzqzqzqzqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMnxrjrjrjrjrjnHnRnRnRnHrenRnRnRrknwaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqGqfpBpBpBpBpBpQpBpBpepepepepepepeqHnipFpFpFpFpFqqqvqsqJOaqsqvqvqvqLqMqMqMqMqMqMqMqMqNqyqOqPqPqPqPqPqQqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMnhrCrDrjrjrjncnRnRnRmfnRnRnRrGrHmiaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqRpeqSpBqSpBqSpepBpBpBqTqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqvqvqLqMqMqMqMqMqMqMqMqNqyqXqYqYqYqYqYqXqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnyrjrjrjrjrjoCnRnRnRoGnRnRnRnRrSnBaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVpepepepepepepepBpBrhpBqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqqqqpFpFpFpFpFpFpFpFpFpZqyqXqYqYqYqYqYqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHnCrjrjrjscnHpznKpznHoKoKonnRnMnHaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpermrnrormrppepBpBpBqbqUoVoVoVoVoVoVpFpFpFpFpFqvqvqsqJquqsqvrrrspFqDrururvpFrwrxrypZqzqXqYqYqYqYrzqEpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHspqpsHssstnHsunRvUnHqcnHnHnNnHnHaMaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqeqfrJrJrJrJrJpQpBpBpepepepepepepepgoVpFpTpUpVpFqvqvqsqJrKqsqvqqqqpFrLrLrLrLpFrMrxrNpZqzqXqYqYqYqYqYpJpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsGrjpApCnHnHnRsJsKnHnHnHnRnRLxnHaMaMaMaMaMaMaMmAmBmBmumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqGqfrUrJrJrJrJpepBpBpBpBpBpepBrVrWpeoVpFqopUpUnnqvqvqvqvqvqvqvqvqvpFrLrXrYrYpFpFrdpFpZqzqXqYqYqYqYrqqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsWsXsYnHaMnHsZsZsZnHaMnHnLtatbnHaMaMaMaMaMaMaMmAaMmBaMmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqRpepesgshshshpepBpNsipNpBpQpBsjskpeoVpFpFpFpFpFpFpFqIpFpFpFqvqvqvsmrLsnsnrLrLrLrLrYpZqzqXqYqYqYqYqYpJpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsZsZsZnHaMomtmtntoooaMnHsZsZsZnHaMaMaMaMaMaMaMmAmBmBmBmBmBmumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVqRperJrJrJrJpepBsipNsipBpeqSpepeqHoVpFsxsyszpFsAsBsBsBsCpFqvqvqvqvrLrLrLrLsDrLrLrYpZqzqXqYqYqYqYsEpxpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMomtmtntoooaMaMaMaMaMaMaMomtmtntoooaMaMaMaMaMaMaMmAaMmBaMmBaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVqRpesLsMptpepBpBpBpBpBpepepeqHoVoVpFsOsPsQsRsBsBsBsBsSpFqvqvqvsmsTrLrLrLsUrLrLsVpZqzqXqYqYqYqYqYqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHoBoyoanRoGnHnzaMaMmPmKoFihkdkdkdihihihihnOnOkQkQkQnPnPpKihihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHnHnHnHvLoyoanRoLnHnHnHnHnzototihPakdkdkdihnYnXkQkQkQkQkQkQkQkQqKihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHpioXoYnHnRoHnRoJnHnHoOoQoRoZpmpnpmkdkdkdkdoSkQkQkQkQkQoDkQkQkQkQoxihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMphoWpjoWnHnHnHpbnHnHpfoOplpooZpmpLpmkdkdkdkdihoqopkQkQkQkQkQkQkQkQoMihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMnHnHphpknHnHnRnRpynHnHpzptpznHoIoIihoPnanUihihihihowovkQkQkQozozoeihihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHpxnRnRpHnHnRnRnRnHrbsoOZpInHmBaMmBaMaMaMaMmumuihihihokpcokihihihihmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVpdpepepepepApApepepepepgoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqanRnRnRpCnRnRnRpJnRnRnRqdnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVpdpppqprpspeqbpupepvpwpepepepgoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMnHqCnRnRnRqcnRnRnRqpnRnRnRqFnHaMaMaMaMaMaMaMaMaMmumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVpdpepBpBpBpBpeqDqDpepBpBpDpEpepepgoVpFpFpFpFpFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnvnHnHnHnHnHnHnRnRnRnHnHnHnHnHnHnzaMaMaMaMaMmAaMmBmumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpepepMpNpOpPpepBpBpQpBpBpBpBpRpSpeoVpFpTpUpVpFpFpFpFpFpWpXpXpYpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqZrasesrqEnHrenRnRnHrfrfrfrgrgnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqeqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeoVpFqopUpUqIqqqrqsqtquqsqvqwqxpFpFpFpFpFpFpFpFpFpFqyqzqzqzqzqzqzqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMnxrjrjrjrjrjnHnRnRnRnHrenRnRnRrknwaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqGqfpBpBpBpBpBpQpBpBpepepepepepepeqHrdpFpFpFpFpFqqqvqsqJOaqsqvqvqvqLqMqMqMqMqMqMqMqMqNqyqOqPqPqPqPqPqQqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMnhrCrDrjrjrjrinRnRnRrqnRnRnRrGrHmiaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqRpeqSpBqSpBqSpepBpBpBqTqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqvqvqLqMqMqMqMqMqMqMqMqNqyqXqYqYqYqYqYqXqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnyrjrjrjrjrjrtnRnRnRrAnRnRnRnRrSnBaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVpepepepepepepepBpBrhpBqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqqqqpFpFpFpFpFpFpFpFpFpZqyqXqYqYqYqYqYqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHrErjrjrjscnHpzrFpznHoKoKrOnRrQnHaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpermrnrormrppepBpBpBrRqUoVoVoVoVoVoVpFpFpFpFpFqvqvqsqJquqsqvrrrspFrTrururvpFrwrxrypZqzqXqYqYqYqYrzrZpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHspsasHssstnHsunRvUnHsbnHnHnNnHnHaMaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqeqfrJrJrJrJrJpQpBpBpepepepepepepepgoVpFpTpUpVpFqvqvqsqJrKqsqvqqqqpFrLrLrLrLpFrMrxrNpZqzqXqYqYqYqYqYsdpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsGrjsfslnHnHnRsJsKnHnHnHnRnRLxnHaMaMaMaMaMaMaMmAmBmBmumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqGqfrUrJrJrJrJpepBpBpBpBpBpepBrVrWpeoVpFqopUpUqIqvqvqvqvqvqvqvqvqvpFrLrXrYrYpFpFsqpFpZqzqXqYqYqYqYsvqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsWsXsYnHaMnHsZsZsZnHaMnHnLtatbnHaMaMaMaMaMaMaMmAaMmBaMmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqRpepesgshshshpepBpNsipNpBpQpBsjskpeoVpFpFpFpFpFpFpFswpFpFpFqvqvqvsmrLsnsnrLrLrLrLrYpZqzqXqYqYqYqYqYsdpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsZsZsZnHaMomtmtntoooaMnHsZsZsZnHaMaMaMaMaMaMaMmAmBmBmBmBmBmumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVqRperJrJrJrJpepBsipNsipBpeqSpepeqHoVpFsxsyszpFsAsBsBsBsCpFqvqvqvqvrLrLrLrLsDrLrLrYpZqzqXqYqYqYqYsEsFpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMomtmtntoooaMaMaMaMaMaMaMomtmtntoooaMaMaMaMaMaMaMmAaMmBaMmBaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVqRpesLsMsIpepBpBpBpBpBpepepeqHoVoVpFsOsPsQsRsBsBsBsBsSpFqvqvqvsmsTrLrLrLsUrLrLsVpZqzqXqYqYqYqYqYqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVqRpepepepepepepepepepeqHoVoVoVoVpFpFtctdpFpFpFtctetdpFqvqvqvpFtftgtgtgtgtgthpFpZqztitjqYqYqYtktlqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpFtptptptptptptptptppFpFpypFpFtptptptptptptppFpZqztrtstttttttstuqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvyhyhyhyhyhyhyhxOxOBdtxtxtxtxtxtxpFtytztypFtxtxtxtxtxtxtxtxpZqzqztAtBtBtBtCqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvJbtvJaIXIYJzJyJAtvJquhJrJrJoJlJpJpJcJcyhzdyIyIyIyIIKwGILwGIItOtPtQtRtSpFtytztypFtTtUtVtWtWtxaMaMpZqzqzqzqzqzqzqzqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvIWuhuhuhuhuhuhuhuhuhyhyByIIUyIyIIVxQxQxQITueufufufufpFtytztypFtWtWtWtWtWtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutuuvbuvuwISuhuhuhuhuhuhuhHmtvIhuhuhuhuhuhuhuhuhuhyhyHIJzqyIyIIKwGILwGIIueufufufufpFpFpypFpFtWtWtWtWtWtxuguguguguguguoupuqtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvbvctvJXuhuhuhuhuhuhuhtvJYuhuhuhuhJpKbKaJZJZyhzrzpzEyIyIyhxxxxxxtxuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvIStvtvtvuhuhuhuhuhuhuhuhtvuhuhuhuhJUtvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtxJVtxvlvmvntxufufuftxvlvmvotxJWtxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvbvJtvvxJMukxoJNJHuhuhtvuhuhuhuhJKtvJJJIJIJJylJLAKJExQxQxQxQxQJFtxufufvBvCvCvCvCvCvCvCvCvCvDufufJOvqvqvqvqvqugvFuNuotxurururtxvGvGvHvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVwWuXuVuVuVuYwWwivavbvbwjtvwFwGwGwGwItvuhuhtvuhuhuhuhJBtvuhxQxQwmJCwmwmwmwmwmxQxQxQJDtxufufvVvWvXvXvXvXvXvXvXvYueufufugvZwawbwcwdugweuNuptxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutwxvbvbwyylAsAhAnAoAryluhuhyluhuhuhuhAByluhxQxQuwxLxQxQxQAKAKtvtvtvtvtvufufvVwrwsufwtwuwvufwswrueufufugugugugugugugweuNuptxurururtxwwwwuNwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVzCuXuVuVuVuYzCzDvavbvbzxyaznuhuhuhzmyauhuhyauhuhAeAbzOyayYxQxQxQtvwFwGwHwGwItvwJwJwJtvufufwKwLwMwNwOzlwQwRwSwLwTufuftxwUwUwUwUwUtxtxuOtxtxtxuOtxtxuNuNuNuNuNvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutzkvbvbzhtvziuhuhuhuhtvyZyZtvzezetvtvtvtvyYxQxQuwuWxfxfxfxfxfzgxfxfxfzgufufufyXufufxiufxiufufyXufufufxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVySuXuVuVuVuYySyWyQvbvbuwyCuhuhuhuhuhyCuhuhyDuhuhyKyGyAyAuhxQxQvdtvwFwGwHwGwItvxBxBxBtvufufvBxCxDwNxEufxFwRxGxCvDufufxjurururururxjurururururururxjwwwwwwwwwwtxuOuOtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvbvbuwyCuhuhuhuhuhyCuhuhFYuhuhxQFGFGFGxQxQxQzcxuFZEKxQHfHktvtvtvtvtvufufvVwLxSufxiufxiufxSwLueufuftxxTxUxUxUxVtxtxxWtxtxtxuOtxtxtxxXxXxXtxtxurururxYurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvvbvbDUtvwFwGwGwGwItvEsEstvEpuhxQErBaFxxQxQxQyRxqEKxQxQxQxQxLxQAeDWtvufufvVtxtxynyoufypyqtxtxueufuftxaMaMaMaMaMtxyrystxuNytuNuNyuyvywywywObtxururuQuQururyyaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvCnCpCLDEDIuhuhuhylBvuhxQBaBMBzxQxQxQxQxLxQxQxQxhxgylxQxQBYtvufufvVtxtxvlvmvmvmvotxtxueufuftxaMaMaMaMaMtxysystxyLyLyLuNyuywywywywyMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhyaASuhxQAZAZAZxQxQxQxQxLxQxQxQxhxgyayJyEyFtvufufwKyTyTyTyTyTyTyTyTyTwTufuftxaMaMaMaMaMtxyUystxyLyVyLuNyuyuyuyuyuyutxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhtvwCuhuhxruhuhuhxQxQwCxqxQxQxQxhxgtvtvtvtvtvtxtxxptxtxufufufufuftxtxtxtxtxtxaMaMaMaMaMtxzfystxvFuNuNuNyuaMaMaMaMaMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvxJxJxIxHxAxyxzwDtvxtxsxxtvxwxwtvxxxsxtxuxvxQxQxhxgtvzsztztzszuzvufzwtxtxtxxKtxtxtxaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMzyuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt -mumumumumumumumumumumusFsFsFsFsFwhsNsNsNvpsFsFsFsFsFsFsFsFsFsFsFmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvzAzBzBzAtvtvtvtvxkxQxQxhxgtvzszFzFzszGzHufzwtxzIwTufwKzJtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzKururzLzLururzKaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumumumumumumusFsFsFsFsFtYtZtGxltYsFsFsFsFsFsFsFsFsFsFsFmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzMzNzNzNzNxmxmzNzNzPaMtvxnxQxQxhxgtvzsztztzszQzHufzwtxueufufufvVtxaMaMaMaMaMaMaMaMaMaMaMaMzRzSNaNaNazTzUaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumumumumumumusFsFsFsFsFtYvAtGtGtYsFsFsFsFsFsFsFsFsFsFsFmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYzZAayfAcAcAdygzNzPtvtvxLxLtvtvtvzszszszsyezHufzwtxAfuxAfyiAftxaMaMaMaMaMaMaMaMaMaMaMzRAiNiNjNkNlNmAlzUaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumumusFsFsFsNulsNtqsFsIulsNtqvgumsNsNsNsNsNvpsFsFsFsFsFmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYAmAcAcAcAcAcAcyjykylxQxQxQxQxQtvApzsApzszuzHufAqxMueufymufxFyuaMaMaMaMaMaMaMaMaMaMzRAiyzAMADAvADNpNoAlzUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumusFsFsFsFtDxNtGtGtGtGtGtGtGtGtGtGtGtGtGtGtGtGtYsFsFsFsFsFmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYAxAyAzAzAzAzAzzNAAxPxQxQxQxQxQxLApzsApzszGzHufAqxMuDufwtxRNdyuaMaMaMaMaMaMaMaMaMaMACADADADADNcADADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumusFsFtGvftDvftGtGtGtGtGtGtGtGtGtGtGtGtGtGtGtGvRycybsFsFsFmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAEzNzNzNzNzNzNzNzNAAaMyaxQxQxQxQxQtvApzsApzszQAFxSAGAHAftXAJydAfyuaMaMaMaMaMaMaMaMaMaMAtADBuNhNeNgNeNfCrADAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumusFsFtDvftDsFsFsFsIsNsNvpvgsIsNvytqvgtHtGtGtGvgtEvksFsFsFmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAPufufAQvVyuyuyuaMaMaMaMaMaMaMaMAtveACATARAUARATACveAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumusFtDtDsFsFsFsFsFsFsFsFtYtGtGvAtYvEtGtYtGtGtGvgtEvzsFsFtHmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWAWAWAWAWAWAWAWAWAWAWAWAXAYvMvKBbBcBcBcBcBcAHBdxCBeufufBfvVxCBdyuaMaMaMaMaMaMaMaMAtADCrAtMSMTMUAtBuADAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumusFtDsFsFsFmumusFsIsNtquatNtGtZtYtNtZtYtGtGtGtHtEtEtEtFtYmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWBlBmBnBlBmBmBoBpBqBmBrBsAYAWAWBtBcBcBcBcBcAHBdwrBeufufufvVwrBdyuyuyuyuyuyuaMaMaMACADCrCCMQMRMPCCBuADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumusFuzuzsFmumumusFuyununumsNsNsNulsNsNujtGtGtGtYtEtEtEuitYmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWBlByuABABBBCBCBCBCBCBCBDBEAYAWAWBbBcBcBcBcBcAHBdwrBeufufufBFwrBdBGBGBGBGBGyuaMaMzRAiADCrDfMQBwMPDfBuADAlzUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumusFtDtDtDtDsFsFmumusFwEwPwEvgtGtGtGtGtGtGtGtGtGtGtYwXwVwYsIujmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWBIBJBKBJBLBJBJBJBJBJBJBJwBAWAWAWAHAHAHAHBNBOAHBdwrBeufufufBPBQvmBRBRBRBRBRBRBRBSAtBgADCrAlACwAACAiBuADBgAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumuxctDtDtDtDxdsFmumutHxewEwEvgtGtGtGtGtGtGtGtGtGtGtYsFsFsFsFsFmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWBWBXxbBZBBCaCaCaCaCaCaCbCcAYAWAWAHCdCeCfCgCgAHChCiCjufufufufCkClClMZClClCmwZCowZxaADADADMYMXADADMYADADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumuvQvNvOtDvPtDtDmumuvRvSvTwhsNsNsNsNsNsNvysNtqvgsIulvysNsNsNsNsNsNvpmumuaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWBWBmCsBWBmBmBoBpBqBmCtBsAYAWAWAHCuCvCwCgCgCxCyCzufufufufufCkClClClClClCmCABRBSAtMVADCrCCBuADCrCCBuADMWAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumuwztDwqtDvOtDtDmumusFsFsFtYtGtGtGtGtGtGtYwnwpwpwpwotYtGtGtGtGtGtGtYmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWAWAWAWAWAWAWAWAWAWAWAWAXAYAWAWAHCECFCGCgCgCxCyCzufufufufCHCIBRCJClClCKwlyuaMaMCCBuADCrCMBuADCrCMBuADCrCCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumusFtDOytDOxtDtDmumuaMaMmutYtGtZtGtGtGtGvRwpwpOwwpwpvRtGtGtGtGtZtGtYmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHCNCNCNCNCNCNCNCNCNCNCNCNCNNzCOCOCPCPCNCQvYCRufNAufBFCSBdCTClCmOzCVyuaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumusFOuOttDtDOstDmumuaMaMmutYtGtGtGtGtGtGvgwpwpOvwpwpvgtGtGtGtGtGtGtYmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHCWCXCXCXCYCZDaCPCPCPNwCPCPCPCPCPCPCPCPCPCPNyCPCNBdwrNxufufufBPDbBRDcClClDdDeyuaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumusFsFtDtDtDtDsFmumumAaMaMtYtGtGtHOCODOEtHwpOGOHwpwptHOCODOEtHtGtGtYaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHDgDgDgDgDgDhDiDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBdwrDpufufufufCkClClClClClCmCABRBSAtBTADCrDfBuADCrDfBuADDqAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumusFsFsFsFOBOAsFmumBmAaMaMvRtGtGvRaMaMaMumtqOCODOEsIujaMaMaMvRtGtGvRaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHDgDrDgDgDgDsDiDtDuDlCPDmDvDwDlCPCPDxDxDxDxDxDxCNDyDzDADBDCDCDCDDDCDCClClClCmwZCowZOFADADNCADADADADADNCADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumusFsFsFsFsFsFmuaMaMaMaMaMOIONONOLaMaMaMaMaMaMaMaMaMaMaMaMaMOIONONOLaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHDgDFDgDgDgDsDaCPCPCPNyCPCPCPCPCPDGDHDHDHDHDHDHCNCNCNCNCNOPOPCNCNCNCNCABRBRBRBRBRBSEAACNNATzSzTOOzSzTATNNACBVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumumumumumuaMaMaMaMOIOJOKOLaMaMaMaMaMaMaMaMaMaMaMaMaMOIOJOKOLaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHDgDgDLDgDMDsDiDNDODlCPDmDPDQDlCPDGDRDSDSDSDSDSCNDTDTDTNDDVDVOMDXDXCNBGBGBGBGyuaMaMAtNENFAtNHNIEaNKNJAtNLNGAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumumumumuaMaMaMaMaMOIOJOKOLaMaMaMaMaMaMaMaMaMaMaMaMaMOIOJOKOLaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHEcDgDgEdDgDsDiEeEfDlCPDmEgEhDlCPDGDSDSDSDSDSDSCNEiEjEjElDVDVDVDXDXCNyuyuyuyuyuaMaMAtNXNYAtNWNVEaEaOTAtNTNSAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumumumumuaMaMaMaMaMKXONONKWaMaMaMKXaMaMaMaMaMKWaMaMaMKXONONKWaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHNODgDgDgDgEoDaCPCPCPCPCPCPCPCPCPDGDSDSOQEqOSORCNEtDVDVDVEwExDVDVEyCNaMaMaMaMaMaMaMEAEBEBAtNQEaNREbNPAtEBEBBVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMaMaMaMaMMtMwMxMtaMaMaMKAMyMuMuMuMvKLaMaMaMMtMzMBMtaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHDgECNuDrEDEEEFEGEGEGEHEHEHEIEJMsELEMEHEHEHCNCNCNNvDVDVEwEPEQExERESCNaMaMaMaMaMaMaMETEVEVBVDYDZEaNtNsEAEVEVEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMaMaMaMaMKTMoMpKTaMaMKXKTMnMkMlMmMnKTKWaMaMKTMrMqKTaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHDgDgDgEDEXEYEZEZEZEZEHFaFbFcFdFeFfFgFbFaEHCNCNCNCNCNCNNrFiNqFkERESCNaMaMaMaMaMaMaMaMaMaMETATEUEUEUATEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMaMaMaMaMKTMLMMKTaMaMKAMbLmMJMKMJLmLXKLaMaMKTMHMIKTaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHFlDgEDEXEYEYEZEZEZEZEHFbFmFnFdFeFfFnFoFbEHFpFqFrFsFtCNDVFhFkDVDVEwFuaMaMaMaMaMaMaMaMaMaMaMETEVEVEVEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMaMaMaMaMLfMGLjKNKOKOLiMFLmLmLmLmLmMELfKOKOKNLkMDLiaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHDgEDEXEYEYEYEZEZEZEZEHFvFbFvFdFeFfFvFbFvEHFwDVDVDVDVMCDVDVDVDVDVFyFzaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMaMaMaMaMKTMNOdNZOcOfKTOeLmLmLmLmLmOeKTOgOhOjOiMNKTaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHEDEXEYEYEYEYEYEYEYEYEHFAFbFbFdFeFfFbFbFBEHFCFDFEFFOkCNDVDVDVDVDVFHFIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumuaMaMaMaMaMaMaMaMaMaMaMKTMNKPKPKPMOLfNbNnNBLpNbNnNBLiNMKPKPNUMNKTaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHEHFJFKFKFdFeFfFLFLFMEHFNFOFPFQFRCNFSFTFUFVFWFXCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumuaMaMaMaMaMaMaMaMaMaMaMKZMNKPKPKPKPLpLmLmLmLmLmLmLmLpKPKPOqKPMNKZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeFeFeFeFeEHEHOrEHEHFeEHEHOrEHEHEHEHEHEHEHCNCNCNCNCNCNCNCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumuaMaMaMaMaMaMaMaMaMaMLhKQKPKPKPKPKTOmLmLmLmLmLmOnKTKPOoKPOlMNLhaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHEHEHEHOpEHEHEHFeFeFeFeFeFeEHFeEHFeFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumuaMaMaMaMaMaMaMaMaMaMKzKQKPKPKAKRKNKOKLKDKCKBKAKOKNKMKLKwKxKyKzaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHEHEHEHEHEHEHEHGdEHEHEHEHEHEHEHEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumuaMaMaMaMaMaMaMaMaMKXKTKSLdLdKTLeLeLeKZKDKYKBKZLbLaLcKTKUKVKSKTKWaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHGeGfGgGfGhGiGiGiGiGiGhGiGhGiGjEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumuaMaMaMaMmumuaMaMaMKjKiKcKcLjLiLeLeLeLhKDKCKBLhLcLcLgLfLkKcKcKiKdaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGbGbGbGbGlEHGiGmGmGmGmGmGiGiGiGmGmGmGmGnGoEHFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumuaMaMaMaMmumuaMaMaMaMKjKsKsKdKTLoLnLeKzLmLmLmKzLcLcLlKTKjKsKsKdaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGpGqGqGbGbGrGiGiGsGtGsGiGiGiGiGiGsGtGsGuGiEHFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMKTLeLeLeLfKOLpKOLiLrLcLqKTaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHFeEHEHEHEHEHEHEHEHGiGmGmGmGmGmGiGiGiGmGmGmGmGvGiEHEHEHEHEHEHEHFeEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMKTLeLeLsKTLtLmLwKTLcLcLyKTaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAFeEHEHzazazazazaEHGxGxGxGxGxGxGxGxGxGxGxGxGxGyGxEHzbzbzbzbzbEHFeFeFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMLXKLLWLeKTMfLmMeKTMdMcKAMbaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHEHEHHgHgHgHgHgEHGBGCGCGCGCGCGCGCGCGCGCGCGCGDGBEHHgHgHgHgHgEHEHEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMKjLXKOMgMbMiMhMjLXMgKOMbKdaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGGGGGGGGFGIGCGCGCGCGCGCGCGCGCGCGCGCGDGJGFGKGKGKGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMKjKiKcKcKcKcKcKiKdaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGMGGGMGGGFGIGCGCGCGCGCGCGCGCGCGCGCGCGDGJGFGKGNGKGNGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMKjKsKsKsKsKsKdaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGGOGGGGGFGIGCGCGCGCGCGPGQGPGCGCGCGCGDGJGFGKGKGRGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGGGGGGGGFGIGCGCGCGCGCGSGTGSGCGCGCGCGDGJGFGKGKGKGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGU +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpFtptptptptptptptptppFpFsNpFpFtptptptptptptppFpZqztrtstttttttstuqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvyhyhyhyhyhyhyhtptptptxtxtxtxtxtxpFtytztypFtxtxtxtxtxtxtxtxpZqzqztAtBtBtBtCqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtqtvtDtFtEuytNtGtvtYuhtZtZuiuaujujululyhzdyIyIyItXuuumuxumuntOtPtQtRtSpFtytztypFtTtUtVtWtWtxaMaMpZqzqzqzqzqzqzqzqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvuzuhuhuhuhuhuhuhuhuhyhyByIuAyItXveurururvfueufufufufpFtytztypFtWtWtWtWtWtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvHvbuvuwvguhuhuhuhuhuhuhvytvvkuhuhuhuhuhuhuhuhuhyhyHvpzqyItXuuumuxumunueufufufufpFwmsNwEpFtWtWtWtWtWtxuguguguguguguoupuqtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvbvctvtHuhuhuhuhuhuhuhtvvzuhuhuhuhujvEvAvKvKyhzrzpzEyIyIyhvMvMvMtxuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvgtvtvtvuhuhuhuhuhuhuhuhtvuhuhuhuhvNtvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtxvOxvvlvmvntxufufuftxvlvmvoxvvPtxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvbvJtvvxvQukxovRvSuhuhtvuhuhuhuhvTtvwlwhwhwlwownwqwpxQxQxQxQxQwztxufufvBvCvCvCvCvCvCvCvCvCvDufufwAvqvqvqvqvqugvFuNuotxurururtxvGvGxAvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVwWuXuVuVuVuYwWwivavbvbwjtvwFwGwGwGwItvuhuhtvuhuhuhuhwBtvuhxQxQxQxkxQxQxQxQxQxQxQxQwPtxufufvVvWvXvXvXvXvXvXvXvYueufufugvZwawbwcwdugweuNuptxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutwxvbvbwywowVwYwXxawZwouhuhwouhuhuhuhxbwouhxQxQuwxcxQxQxQwqwqtvtvtvtvtvufufvVwrwsufwtwuwvufwswrueufufugugugugugugugweuNuptxurururtxwwwwuNwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVxduXuVuVuVuYxdxevavbvbxgxkxhuhuhuhxlxkuhuhxkuhuhxnxmxpxkxqxQxQxQtvwFwGwHwGwItvwJwJwJxOufufwKwLwMwNwOxrwQwRwSwLwTufufxYwUwUwUwUwUtxtxuOtxtxtxuOtxtxuNuNuNuNuNvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutxsvbvbxMtvxtuhuhuhuhtvxuxutvOYOYtvtvtvtvxqxQxQuwuWxfxfxfxfxfxwxfxfxfxwufufufxxufufxiufxiufufxxufufufxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVxyuXuVuVuVuYxyxzzsvbvbuwxHuhuhuhuhuhxHuhuhxIuhuhxKxJxLxLuhxQxQvdtvwFwGwHwGwItvxBxBxBztufufvBxCxDwNxEufxFwRxGxCvDufufxjurururururxjurururururururxjwwwwwwwwwwtxuOuOtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvbvbuwxHuhuhuhuhuhxHuhuhxRuhuhxQyayayaxQxQxQzcycybydxQyfyetvtvtvtvtvufufvVwLxSufxiufxiufxSwLueufufxvxTxUxUxUxVtxtxxWtxtxtxuOtxtxtxxXxXxXtxtxurururzuurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvvbvbxNtvwFwGwGwGwItvygygtvyiuhxQyjylykxQxQxQyRymydxQxQxQxQxcxQxnyztvufufvVtxtxynyoufypyqtxtxueufuftxaMaMaMaMaMtxyrystxuNytuNuNyuyvywywywObtxururuQuQururyyaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvyAyDyCyKyGuhuhuhwoyQuhxQylyWySxQxQxQxQxcxQxQxQyYyXwoxQxQyZtvufufvVtxtxvlvmvmvmvotxtxueufuftxaMaMaMaMaMtxysystxyLyLyLuNyuywywywywyMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhxkzeuhxQzgzgzgxQxQxQxQxcxQxQxQyYyXxkyJyEyFtvufufwKyTyTyTyTyTyTyTyTyTwTufuftxaMaMaMaMaMtxyUystxyLyVyLuNyuyuyuyuyuyutxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhtvwCuhuhzhuhuhuhxQxQwCymxQxQxQyYyXtvtvtvtvtvtxxvzixYtxufufufufuftxtxtxtxtxtxaMaMaMaMaMtxzfystxvFuNuNuNyuaMaMaMaMaMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvzkzkzlznzmzCzxwDtvzOzDvMtvAbAbtvvMzDzOycAexQxQyYyXtvzvzwzwzvzFzGDCzHCNtxxvAhxYtxtxaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMzyuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt +mumumumumumumumumumumuAnAnAnAnAnAoArArArAsAnAnAnAnAnAnAnAnAnAnAnmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvzAzBzBzAtvtvtvtvABxQxQyYyXtvzvzIzIzvzJzQDCzHCNApAfDCAqAFCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzKururzLzLururzKaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumumumumumumuAnAnAnAnAnAKAZASBaAKAnAnAnAnAnAnAnAnAnAnAnmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzMzNzNzNzNBvBvzNzNzPaMtvBzxQxQyYyXtvzvzwzwzvAGzQDCzHCNAJDCDCDCAPCNaMaMaMaMaMaMaMaMaMaMaMaMzRzSNaNaNazTzUaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumumumumumumuAnAnAnAnAnAKBMASASAKAnAnAnAnAnAnAnAnAnAnAnmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYzZAaBYAcAcAdCnzNzPtvtvxcxctvtvtvzvzvzvzvAQzQDCzHCNBcBbBcBdBcCNaMaMaMaMaMaMaMaMaMaMaMzRAiNiNjNkNlNmAlzUaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumumuAnAnAnArDEArDIAnDUDEArDIEpDWArArArArArAsAnAnAnAnAnmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYAmAcAcAcAcAcAcEsErwoxQxQxQxQxQxOzvBezvBezFzQDCBtBfAJDCBFDCBGCNaMaMaMaMaMaMaMaMaMaMzRAiAMAvADAvADAvBOAlzUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuAnAnAnAnFYFZASASASASASASASASASASASASASASASASAKAnAnAnAnAnmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYAxAyAzAzAzAzAzzNAAxPxQxQxQxQxQxczvBezvBezJzQDCBtBfBPDCBRBQBSCNaMaMaMaMaMaMaMaMaMaMACADADADBNNcADADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuAnAnASHkFYHkASASASASASASASASASASASASASASASASHmIJIIAnAnAnmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAEzNzNzNzNzNzNzNzNAAaMxkxQxQxQxQxQtvzvBezvBeAGCeCdCfCNBcCgCiChBcCNaMaMaMaMaMaMaMaMaMaMAtADBuNhNeNgNeNfCrADAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuAnAnFYHkFYAnAnAnDUArArAsEpDUArILDIEpISASASASEpIUITAnAnAnmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHCNCNCNCNCNCNCNCNCNCjDCDCCkAPCNCNCNaMaMaMaMaMaMaMaMAtIVACATARAUARATACIVAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuAnFYFYAnAnAnAnAnAnAnAnAKASASBMAKIWASAKASASASEpIUIXAnAnISmumumumumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWAWAWAWAWAWAWAWAWAWAWAWAXAYIYJaClCmCmCmCmCmCNDyCoCpDCDCCuAPCoDyCNaMaMaMaMaMaMaMaMAtADCrAtMQCvMUAtBuADAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuAnFYAnAnAnmumuAnDUArDIJcJbASAZAKJbAZAKASASASISIUIUIUJlAKmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWBlBmBnBlBmBmBoBpBqBmBrBsAYAWAWCwCmCmCmCmCmCNDyCxCpDCDCDCAPCxDyCNCNCNCNCNCNaMaMaMACADCrCCMQMRMPCCBuADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuAnJoJoAnmumumuAnJpJqJqDWArArArDEArArJrASASASAKIUIUIUJyAKmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWBlByJzBABBBCBCBCBCBCBCBDBEAYAWAWClCmCmCmCmCmCNDyCxCpDCDCDCCyCxDyDyDyDyDyDyCNaMaMzRAiADCrDfMQBwMPDfBuADAlzUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuAnFYFYFYFYAnAnmumuAnJAJBJAEpASASASASASASASASASASAKJDJCJEDUJrmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWBIBJBKBJBLBJBJBJBJBJBJBJJFAWAWAWCNCNCNCNCzCACNDyCxCpDCDCDCCFCECGCGCGCGCGCGCGCGCHAtBgADCrAlACJHACAiBuADBgAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuJIFYFYFYFYJJAnmumuISJKJAJAEpASASASASASASASASASASAKAnAnAnAnAnmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWBWBXJLBZBBCaCaCaCaCaCaCbCcAYAWAWCNCJCICKCPCPCNCQCLCRDCDCDCDCDDDCDCCSDCDCCTCVCmCVJNADADADMYCWADADMYADADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuJOJVJUFYJWFYFYmumuHmJXJYAoArArArArArArILArDIEpDUDEILArArArArArArAsmumuaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWBWBmCsBWBmBmBoBpBqBmCtBsAYAWAWCNCYCXDbCPCPDcDCDDDCDCDCDCDCDDDCDCDCDCDCCTDdCGCHAtDeADCrCCBuADCrCCBuADDgAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuJZFYKaFYJUFYFYmumuAnAnAnAKASASASASASASAKKbKcKcKcKdAKASASASASASASAKmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWAWAWAWAWAWAWAWAWAWAWAWAXAYAWAWCNDrDpDFCPCPDcDCDDDCDCDCDCDMDLCGEcDCDCECEdCNaMaMCCBuADCrCMBuADCrCMBuADCrCCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuAnFYKjFYOQFYFYmumuaMaMmuAKASAZASASASASHmKcKcKuKcKcHmASASASASAZASAKmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNEDCOCOCPCPCNEKEEEXDCEYDCCyFlDyFxDCCTGOFGCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuAnKxKwFYFYKyFYmumuaMaMmuAKASASASASASASEpKcKcKzKcKcEpASASASASASASAKmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNGTGRGRGRHfCZDaCPCPCPHQCPCPCPCPCPCPCPCPCPCPNyCPCNDyCxIKDCDCDCCFCECGJMDCDCKvKiCNaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuAnAnFYFYFYFYAnmumumAaMaMAKASASISKAKCKBISKcKLKDKcKcISKAKCKBISASASAKaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMSMSMSMSDhDiDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNDyCxMTDCDCDCDCDDDCDCDCDCDCCTDdCGCHAtBTADCrDfBuADCrDfBuADDqAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuAnAnAnAnKMKNAnmumBmAaMaMHmASASHmaMaMaMDWDIKAKCKBDUJraMaMaMHmASASHmaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMVMSMSMSDsDiDtDuDlCPDmDvDwDlCPCPDxDxDxDxDxDxCNDyDzDADBDCDCDCDDDCDCDCDCDCCTCVCmCVKOADADNCADADADADADNCADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumuAnAnAnAnAnAnmuaMaMaMaMaMKPKQKQKRaMaMaMaMaMaMaMaMaMaMaMaMaMKPKQKQKRaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMWMSMSMSDsDaCPCPCPNyCPCPCPCPCPDGDHDHDHDHDHDHCNCNCNCNMXKSKSCNCNCNCNDdCGCGCGCGCGCHEAACNNATzSzTKTzSzTATNNACBVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumumumumumuaMaMaMaMKPKVKUKRaMaMaMaMaMaMaMaMaMaMaMaMaMKPKVKUKRaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMSMZMSNdDsDiDNDODlCPDmDPDQDlCPDGDRDSDSDSDSDSCNDTDTDTNDDVDVKWDXDXCNDyDyDyDyCNaMaMAtNENFAtNHNIEaNKNJAtNLNGAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumumumumuaMaMaMaMaMKPKVKUKRaMaMaMaMaMaMaMaMaMaMaMaMaMKPKVKUKRaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNNoMSMSNrMSDsDiEeEfDlCPDmEgEhDlCPDGDSDSDSDSDSDSCNEiEjEjElDVDVDVDXDXCNCNCNCNCNCNaMaMAtNuNYAtNwNVEaEaKXAtNTNxAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumumumumuaMaMaMaMaMKYKQKQKZaMaMaMKYaMaMaMaMaMKZaMaMaMKYKQKQKZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNNzMSMSMSMSEoDaCPCPCPCPCPCPCPCPCPDGDSDSLaEqLbLcCNEtDVDVDVEwExDVDVEyCNaMaMaMaMaMaMaMEAEBEBAtNQEaNREbNPAtEBEBBVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMaMaMaMaMMHLfMLMHaMaMaMLgMOMIMIMIMJLkaMaMaMMHNnLmMHaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSNANOMVNWNSEFEGEGEGEHEHEHEIEJLnELEMEHEHEHCNCNCNNvDVDVEwEPEQExERESCNaMaMaMaMaMaMaMETEVEVBVDYDZEaNtNsEAEVEVEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMaMaMaMaMLsMpMwLsaMaMKYLsLrMmMnMoLrLsKZaMaMLsMGMFLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMSMSNWNXEZEZEZEZEZEHFaFbFcFdFeFfFgFbFaEHCNCNCNCNCNCNOmFiNqFkERESCNaMaMaMaMaMaMaMaMaMaMETATEUEUEUATEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMaMaMaMaMLsOoOuLsaMaMLgMfMaOhOROhMaMeLkaMaMLsOfOgLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNPbMSNWNXEZEZEZEZEZEZEHFbFmFnFdFeFfFnFoFbEHFpFqFrFsFtCNDVFhFkDVDVEwFuaMaMaMaMaMaMaMaMaMaMaMETEVEVEVEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMaMaMaMaMLyOeLpLoLpLpLXOdMaMaMaMaMaOcLyLpLpLoLpNBLXaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSNWNXEZEZEZEZEZEZEZEHFvFbFvFdFeFfFvFbFvEHFwDVDVDVDVMqDVDVDVDVDVFyFzaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMaMaMaMaMLsMsMrMuMtMvLsOLMaMaMaMaMaOLLsMyMxMBMzMsLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNNWNXEZEZEZEZEZEZEZEZEHFAFbFbFdFeFfFbFbFBEHFCFDFEFFMCCNDVDVDVDVDVFHFIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumuaMaMaMaMaMaMaMaMaMaMaMLsMsMDMDMDMELsOwOGOHMbOwOGOHLsOKMDMDMKMsLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHCNCNCNCNCNCNCNCNCNCNCNEHFJFKFKFdFeFfFLFLFMEHFNFOFPFQFRCNFSFTFUFVFWFXCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumuaMaMaMaMaMaMaMaMaMaMaMLwMsMDMDMDMDMbMaMaMaMaMaMaMaMbMDMDMMMDMsLwaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeFeFeFeFeEHEHMNEHEHFeEHEHMNEHEHEHEHEHEHEHCNCNCNCNCNCNCNCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuaMaMaMaMaMaMaMaMaMaMLWNbMDMDMDMDLsOOMaMaMaMaMaOPLsMDNMMDNUMsLWaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHEHEHEHNZEHEHEHFeFeFeFeFeFeEHFeEHFeFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuaMaMaMaMaMaMaMaMaMaMLeNbMDMDLgMDLoLpLkLjLiLhLgLpLoLlLkOjOiOkLeaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHEHEHEHEHEHEHEHGdEHEHEHEHEHEHEHEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuaMaMaMaMaMaMaMaMaMKYLsLqOlOlLsOnOnOnLwLjLtLhLwOqOpOrLsOtOsLqLsKZaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHGeGfGgGfGhGiGiGiGiGiGhGiGhGiGjEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuaMaMaMaMmumuaMaMaMOvLdKsKsLYLXOnOnOnLWLjLiLhLWOrOrOxLyLZKsKsLdOyaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGbGbGbGbGlEHGiGmGmGmGmGmGiGiGiGmGmGmGmGnGoEHFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuaMaMaMaMmumuaMaMaMaMOvOzOzOyLsOBOAOnLeMaMaMaLeOrOrOCLsOvOzOzOyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGpGqGqGbGbGrGiGiGsGtGsGiGiGiGiGiGsGtGsGuGiEHFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMLsOnOnOnLyLpMbLpLXODOrOELsaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHFeEHEHEHEHEHEHEHEHGiGmGmGmGmGmGiGiGiGmGmGmGmGvGiEHEHEHEHEHEHEHFeEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMLsOnOnOFLsMcMaMdLsOrOrOILsaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAFeEHEHzazazazazaEHGxGxGxGxGxGxGxGxGxGxGxGxGxGyGxEHzbzbzbzbzbEHFeFeFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMMeLkOJOnLsMhMaMgLsONOMLgMfaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHEHEHHgHgHgHgHgEHGBGCGCGCGCGCGCGCGCGCGCGCGCGDGBEHHgHgHgHgHgEHEHEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMOvMeLpMiMfMkMjMlMeMiLpMfOyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGGGGGGGGFGIGCGCGCGCGCGCGCGCGCGCGCGCGDGJGFGKGKGKGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMOvLdKsKsKsKsKsLdOyaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGMGGGMGGGFGIGCGCGCGCGCGCGCGCGCGCGCGCGDGJGFGKGNGKGNGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMOvOzOzOzOzOzOyaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGPcGGGGGFGIGCGCGCGCGCGPGQGPGCGCGCGCGDGJGFGKGKPdGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGGGGGGGGFGIGCGCGCGCGCGSPeGSGCGCGCGCGDGJGFGKGKGKGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGU mumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGMGGGMGGGFGIGCGCGCGCGCGVGWGXGCGCGCGCGDGJGFGKGNGKGNGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGZGYGYGYHaHaHaGYGYHaHaHaGYGYGYGYGYGU mumumumuaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHFbGHGGGGGGGGGGGFGIGCGCGCGCGCGCHcGCGCGCGCGCGDGJGFGKGKGKGKGKGHFbEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUHdGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYHeGU -mumumumuaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHKuEHHbHbHbHbHbEHGBGCGCGCGCGCGCHcGCGCGCGCGCGDGBEHHbHbHbHbHbEHKuEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHhGYGYGYGYGYGU -mumumumuaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFJHiFbEHGzGzGzGzGzEHGxGxGxGxGxGxKvHlKvGxGxGxGxGyGxEHGEGEGEGEGEEHFbHnFMEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHdGYGYGYGYGYGU +mumumumuaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHOSEHHbHbHbHbHbEHGBGCGCGCGCGCGCHcGCGCGCGCGCGDGBEHHbHbHbHbHbEHOSEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHhGYGYGYGYGYGU +mumumumuaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFJHiFbEHGzGzGzGzGzEHGxGxGxGxGxGxOTHlOTGxGxGxGxGyGxEHGEGEGEGEGEEHFbHnFMEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHdGYGYGYGYGYGU mumuaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHFbEHEHEHEHEHEHEHHoHpHpHpHpHpHqHrHoHpHpHpHpHsHoEHEHEHEHEHEHEHFbEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYHtHhGYGYGYGYGYGYGYGYGYGYGYGYGYGU -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFbFbFeFeFeFeFeEHHoHoHuHoHuHoHoHvHwHoHuHoHuHxHoEHFeFeFeFeFeFbFbEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGU -mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHEHEHEHEHFeOrHoHoHoHyHyHyHoHoHoHyHyHyHyHyHoOrFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYHzHAGYGYGYGYGYGYGYGYGYGYGYGYGU -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHHBHBHBHCHDHEHFHoHGHHHIHJHKHLHMEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYHNHOGYGYGYHtGYHPGYGYGYGYGYGYGU -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGU +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFbFbFeFeFeFeFeEHHoHoHuHoHuHoHoHvHwHoHuHoHuHxHoEHFeFeFeFeFeFbFbEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYPfPfGYGYGYGYGYGYGYGYGYGYGYGYGU +mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHEHEHEHEHFeMNHoHoHoHyHyHyHoHoHoHyHyHyHyHyHoMNFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYPfHzHAPfGYGYGYGYGYGYGYGYGYGYGYGU +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHHBHBHBHCHDHEHFHoHGHHHIHJHKHLHMEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYPfHNHOPfGYGYHtGYHPGYGYGYGYGYGYGU +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYPfPfGYGYGYGYGYGYGYGYGYGYGYGYGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYHhGYGYGYGYGYGYGYGYGYGYGYGYGYHdGYGYGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYHtHhGYGYGYGYGYGYGYGYGYGYGYGYHhGYGYGU -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYHQGYHQGYHQGYHRGYGYGYGYGYGU +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYPgGYPgGYPgGYHRGYGYGYGYGYGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYHSGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTHTGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHUHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHVHU @@ -2361,30 +2368,30 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHZHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIaIbIcIdIeIfHYIgOYIiHYIjIkIlHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIaIbIcIdIeIfHYIgIhIiHYIjIkIlHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcImInIoIpIqIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIsIsIcIcIcItHYIuIvIwHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIxHYIyIyIzHYIAIBICIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIEIEIcIcIcIFHYIyIyIyIGIyIyIyIHHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcOXHYIMINIOHYIPIQIRIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUaMaMaMOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcItHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkGLJmJnHjHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUaMaMOUaMaMOUOUOUOUOUOUOUaMaMOUaMaMOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJsJtJgIcJuJuJuJuJvJwJxJwJxHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUaMOUOUOUOUOUOUOUOUOUaMOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJGOWJgIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUaMOUOUOUOUOUOUOUOUOUaMOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJPJQJgIcJuJuJuJuJuJuJRJSJTHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUaMOUOUOUOUOUOUOUOUOUaMOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKeKfKfKgKfKfKfKgKfKfKfKgKfKfKhHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkKmKoKnJkKpKpKqJkKrOVKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtKKHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUaMaMOUOUOUOUOUOUOUaMaMOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOUOUOUOUOUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcOUHYIMINIOHYIPIQIRIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcItHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkGLJmJnHjHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMOVaMaMOVOVOVOVOVOVOVaMaMOVaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJsJtJgIcJuJuJuJuJvJwJxJwJxHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJGOWJgIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJPJQJgIcJuJuJuJuJuJuJRJSJTHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKeKfKfKgKfKfKfKgKfKfKfKgKfKfKhHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkKmKoKnJkKpKpKqJkKrOXKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtKKHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMaMOVOVOVOVOVOVOVaMaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM "} diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm index 0e2012a824..dc486ee6d4 100644 --- a/maps/exodus-3.dmm +++ b/maps/exodus-3.dmm @@ -84,8 +84,8 @@ "bF" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bG" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bH" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bI" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bJ" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"bI" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"bJ" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bK" = (/obj/machinery/power/apc{dir = 8; name = "west bump-derelict"; operating = 0; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bL" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bM" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) @@ -103,15 +103,15 @@ "bY" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) "bZ" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space) "ca" = (/turf/simulated/floor/plating/airless,/area/space) -"cb" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) -"cc" = (/obj/machinery/camera{c_tag = "North Solars"; dir = 8; network = list("Tcomsat")},/turf/space,/area/space) +"cb" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space) +"cc" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Main Computer Room"},/turf/simulated/floor,/area/tcommsat/computer) "cd" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) "ce" = (/turf/simulated/wall/r_wall,/area/space) "cf" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomsat) "cg" = (/turf/simulated/wall/r_wall,/area/tcommsat/computer) "ch" = (/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "ci" = (/turf/space,/area/turret_protected/tcomsat) -"cj" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera{c_tag = "West Wing North"; dir = 2; network = list("Tcomsat")},/turf/space,/area/turret_protected/tcomsat) +"cj" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Lounge"},/turf/simulated/floor,/area/tcommsat/computer) "ck" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cl" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cm" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/valve/digital/open{dir = 4; name = "Mixed Air Outlet Valve"},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) @@ -121,7 +121,7 @@ "cq" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor,/area/tcommsat/computer) "cr" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/tcommsat/computer) "cs" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor,/area/tcommsat/computer) -"ct" = (/obj/machinery/camera{c_tag = "Lounge"; dir = 2; network = list("Tcomsat")},/turf/simulated/floor,/area/tcommsat/computer) +"ct" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing North"},/turf/space,/area/turret_protected/tcomsat) "cu" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor,/area/tcommsat/computer) "cv" = (/turf/simulated/floor,/area/tcommsat/computer) "cw" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/turret_protected/tcomsat) @@ -132,7 +132,7 @@ "cB" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cC" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) "cD" = (/obj/structure/filingcabinet,/turf/simulated/floor,/area/tcommsat/computer) -"cE" = (/obj/machinery/camera{c_tag = "Main Computer Room"; dir = 2; network = list("Tcomsat")},/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/tcommsat/computer) +"cE" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Solars"; dir = 8},/turf/space,/area/space) "cF" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor,/area/tcommsat/computer) "cG" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor,/area/tcommsat/computer) "cH" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/turf/simulated/floor/engine,/area/tcommsat/computer) @@ -165,7 +165,7 @@ "di" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/tcommsat/computer) "dj" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) "dk" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor,/area/tcommsat/computer) -"dl" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/tcommsat/computer) +"dl" = (/obj/structure/bed/chair{dir = 8},/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor,/area/tcommsat/computer) "dm" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "dn" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "do" = (/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) @@ -215,7 +215,7 @@ "eg" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ei" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ej" = (/obj/machinery/camera{c_tag = "Central Compartment North"; dir = 2; network = list("Tcomsat")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"ej" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing Central"; dir = 8},/turf/space,/area/turret_protected/tcomsat) "ek" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "el" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "em" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) @@ -236,10 +236,10 @@ "eB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "eC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "eD" = (/obj/structure/table,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/turf/simulated/floor,/area/turret_protected/tcomsat) -"eE" = (/obj/machinery/camera{c_tag = "Telecoms Storage"; network = list("Tcomsat")},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/turret_protected/tcomsat) +"eE" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms East Solars"; dir = 4},/turf/space,/area/space) "eF" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/turf/simulated/floor,/area/turret_protected/tcomsat) -"eG" = (/obj/machinery/camera{c_tag = "West Solars"; dir = 8; network = list("Tcomsat")},/turf/space,/area/space) -"eH" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/camera{c_tag = "West Wing Middle"; dir = 8; network = list("Tcomsat")},/turf/space,/area/turret_protected/tcomsat) +"eG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment North"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eH" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Storage"},/turf/simulated/floor,/area/turret_protected/tcomsat) "eI" = (/obj/machinery/telecomms/broadcaster/preset_left,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eJ" = (/obj/machinery/telecomms/broadcaster/preset_right,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/space,/area/turret_protected/tcomsat) @@ -249,7 +249,7 @@ "eO" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/turf/simulated/floor,/area/turret_protected/tcomsat) "eP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomsat) "eQ" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/turf/simulated/floor,/area/turret_protected/tcomsat) -"eR" = (/obj/machinery/camera{c_tag = "East Solars"; dir = 4; network = list("Tcomsat")},/turf/space,/area/space) +"eR" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms North Solars"; dir = 8},/turf/space,/area/space) "eS" = (/turf/simulated/floor/plating,/area/space) "eT" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light{dir = 4},/turf/space,/area/turret_protected/tcomsat) "eU" = (/obj/structure/sign/nosmoking_2{pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) @@ -269,129 +269,130 @@ "fi" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/turret_protected/tcomsat) "fj" = (/obj/machinery/telecomms/bus/preset_one,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fk" = (/obj/machinery/telecomms/processor/preset_one,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fl" = (/obj/machinery/telecomms/receiver/preset_left,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fm" = (/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fn" = (/obj/machinery/telecomms/processor/preset_three,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fo" = (/obj/machinery/telecomms/bus/preset_three,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fp" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) -"fq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"fr" = (/turf/simulated/floor,/area/turret_protected/tcomsat) -"fs" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/turret_protected/tcomsat) -"ft" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/turf/simulated/floor,/area/turret_protected/tcomsat) -"fu" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/turf/simulated/floor,/area/turret_protected/tcomsat) -"fv" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/turf/simulated/floor,/area/turret_protected/tcomsat) -"fw" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor,/area/turret_protected/tcomsat) -"fx" = (/obj/machinery/telecomms/server/presets/science,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fy" = (/obj/machinery/telecomms/server/presets/medical,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fz" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fB" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fD" = (/obj/machinery/telecomms/server/presets/command,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fE" = (/obj/machinery/telecomms/server/presets/security,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"fG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; use_power = 1; pressure_checks = 0; pressure_checks_default = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fH" = (/obj/machinery/camera{c_tag = "Central Compartment South"; dir = 1; network = list("Tcomsat")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/tcommsat/chamber) -"fK" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) -"fL" = (/obj/structure/window/reinforced,/obj/structure/lattice,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) -"fM" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomfoyer) -"fN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/turret_protected/tcomfoyer) -"fO" = (/obj/machinery/porta_turret{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/turret_protected/tcomfoyer) -"fP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/turret_protected/tcomfoyer) -"fQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera{c_tag = "Telecoms Foyer"; dir = 2; network = list("Tcomsat")},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Satellite"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms lethal turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/turret_protected/tcomfoyer) -"fR" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/turret_protected/tcomfoyer) -"fS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"fl" = (/obj/machinery/bluespacerelay,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fm" = (/obj/machinery/telecomms/receiver/preset_left,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fn" = (/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fo" = (/obj/machinery/telecomms/processor/preset_three,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fp" = (/obj/machinery/telecomms/bus/preset_three,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) +"fr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"fs" = (/turf/simulated/floor,/area/turret_protected/tcomsat) +"ft" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/turret_protected/tcomsat) +"fu" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/turf/simulated/floor,/area/turret_protected/tcomsat) +"fv" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/turf/simulated/floor,/area/turret_protected/tcomsat) +"fw" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/turf/simulated/floor,/area/turret_protected/tcomsat) +"fx" = (/obj/structure/table,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor,/area/turret_protected/tcomsat) +"fy" = (/obj/machinery/telecomms/server/presets/science,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fz" = (/obj/machinery/telecomms/server/presets/medical,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fB" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fE" = (/obj/machinery/telecomms/server/presets/command,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fF" = (/obj/machinery/telecomms/server/presets/security,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) +"fH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; use_power = 1; pressure_checks = 0; pressure_checks_default = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fI" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms South Solars"; dir = 4},/turf/space,/area/space) +"fJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"fK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/tcommsat/chamber) +"fL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) +"fM" = (/obj/structure/window/reinforced,/obj/structure/lattice,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) +"fN" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomfoyer) +"fO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"fP" = (/obj/machinery/porta_turret{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/turret_protected/tcomfoyer) +"fQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/turret_protected/tcomfoyer) +"fR" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance South"; dir = 1},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/tcommsat/entrance) +"fS" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/turret_protected/tcomfoyer) "fT" = (/obj/machinery/porta_turret{dir = 10},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/turret_protected/tcomfoyer) -"fU" = (/obj/structure/window/reinforced,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) -"fV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) -"fW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) -"fX" = (/obj/machinery/door/airlock/hatch{name = "Telecoms West Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer) -"fY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/turret_protected/tcomfoyer) -"fZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/turret_protected/tcomfoyer) -"ga" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer) -"gb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/turret_protected/tcomfoyer) -"gc" = (/obj/machinery/door/airlock/hatch{name = "Telecoms East Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer) -"gd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) -"ge" = (/obj/machinery/camera{c_tag = "East Wing South"; dir = 8; network = list("Tcomsat")},/turf/space,/area/turret_protected/tcomsat) -"gf" = (/obj/machinery/camera{c_tag = "West Wing South"; dir = 4; network = list("Tcomsat")},/turf/space,/area/turret_protected/tcomsat) -"gg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) -"gh" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/turret_protected/tcomfoyer) -"gi" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/turret_protected/tcomfoyer) -"gj" = (/turf/simulated/floor,/area/turret_protected/tcomfoyer) -"gk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer) -"gl" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/turret_protected/tcomfoyer) -"gm" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/turret_protected/tcomfoyer) -"gn" = (/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"go" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer) -"gp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/tcommsat/entrance) -"gq" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance) -"gr" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/entrance) -"gs" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"gt" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor,/area/tcommsat/entrance) -"gu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance) -"gv" = (/obj/machinery/turretid/stun{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor,/area/tcommsat/entrance) -"gw" = (/turf/simulated/floor,/area/tcommsat/entrance) -"gx" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/computer/power_monitor{name = "telecoms power monitoring"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{long_range = 1; name = "Powernet Sensor - Telecommunications Grid"; name_tag = "Telecommunications Grid"},/turf/simulated/floor{icon_state = "bot"},/area/tcommsat/entrance) -"gy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/tcommsat/entrance) -"gz" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/fractal_reactor{mapped_in = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/tcommsat/entrance) -"gA" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Telecommunications Main Breaker"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/entrance) -"gB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/camera{c_tag = "Power Room West"; dir = 1; network = list("Tcomsat")},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/tcommsat/entrance) -"gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/tcommsat/entrance) -"gD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance) -"gE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/camera{c_tag = "Power Room East"; dir = 1; network = list("Tcomsat")},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/tcommsat/entrance) -"gF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/tcommsat/entrance) -"gG" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"gH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance) -"gI" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance) -"gJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/entrance) -"gK" = (/obj/machinery/camera{c_tag = "Entrance North"; dir = 2; network = list("Tcomsat")},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/tcommsat/entrance) -"gL" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance) -"gM" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/tcommsat/entrance) -"gN" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/tcommsat/entrance) -"gO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/tcommsat/entrance) -"gP" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/entrance) -"gQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor,/area/tcommsat/entrance) -"gR" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"gS" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance) -"gT" = (/obj/item/weapon/cell,/turf/simulated/floor,/area/tcommsat/entrance) -"gU" = (/obj/structure/closet/malf/suits,/turf/simulated/floor,/area/tcommsat/entrance) -"gV" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/space) -"gW" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_outer"; locked = 1; name = "External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/tcommsat/entrance) -"gX" = (/obj/machinery/camera/xray{c_tag = "External Airlock"; network = list("Tcomsat")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1381; id_tag = "telecoms_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "telecoms_pump"; tag_exterior_door = "telecoms_outer"; frequency = 1381; id_tag = "telecoms_airlock"; tag_interior_door = "telecoms_inner"; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "telecoms_sensor"},/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "telecoms_sensor"; pixel_x = 12; pixel_y = -25},/turf/simulated/floor/plating,/area/tcommsat/entrance) -"gY" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_inner"; locked = 1; name = "External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/entrance) -"gZ" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/entrance) -"ha" = (/obj/machinery/bluespace_beacon,/turf/simulated/floor,/area/tcommsat/entrance) -"hb" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/entrance) -"hc" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"hd" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/tcommsat/entrance) -"he" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/tcommsat/entrance) -"hf" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/machinery/camera{c_tag = "Entrance South"; dir = 1; network = list("Tcomsat")},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/tcommsat/entrance) -"hg" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/tcommsat/entrance) -"hh" = (/obj/machinery/light{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/tcommsat/entrance) -"hi" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/tcommsat/entrance) -"hj" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/tcommsat/entrance) -"hk" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/tcommsat/entrance) -"hl" = (/obj/machinery/camera{c_tag = "South Solars"; dir = 4; network = list("Tcomsat")},/turf/space,/area/space) -"hm" = (/turf/space,/area/syndicate_station/commssat) -"hn" = (/turf/simulated/wall/r_wall,/area/AIsattele) -"ho" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) -"hp" = (/obj/machinery/teleport/station,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) -"hq" = (/turf/simulated/floor/plating/airless,/area/AIsattele) -"hr" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/AIsattele) -"hs" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/AIsattele) -"ht" = (/obj/structure/table/rack,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/plating/airless,/area/AIsattele) -"hu" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/AIsattele) -"hv" = (/obj/item/weapon/cell,/turf/simulated/floor/plating/airless,/area/AIsattele) -"hw" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/AIsattele) -"hx" = (/turf/space,/area/AIsattele) -"hy" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating/airless,/area/AIsattele) -"hz" = (/obj/structure/lattice,/turf/space,/area/AIsattele) -"hA" = (/obj/structure/closet,/turf/simulated/floor/plating/airless,/area/AIsattele) -"hB" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/AIsattele) -"hC" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/AIsattele) -"hD" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating/airless,/area/AIsattele) +"fU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"fV" = (/obj/structure/window/reinforced,/obj/machinery/light{dir = 1},/turf/space,/area/turret_protected/tcomsat) +"fW" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) +"fX" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"fY" = (/obj/machinery/door/airlock/hatch{name = "Telecoms West Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer) +"fZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"ga" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/turret_protected/tcomfoyer) +"gb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer) +"gc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"gd" = (/obj/machinery/door/airlock/hatch{name = "Telecoms East Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer) +"ge" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"gf" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance North"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/tcommsat/entrance) +"gg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room East"},/turf/simulated/floor,/area/tcommsat/entrance) +"gh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) +"gi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"gj" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/turret_protected/tcomfoyer) +"gk" = (/turf/simulated/floor,/area/turret_protected/tcomfoyer) +"gl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer) +"gm" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/turret_protected/tcomfoyer) +"gn" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"go" = (/turf/simulated/wall/r_wall,/area/tcommsat/entrance) +"gp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer) +"gq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/tcommsat/entrance) +"gr" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/fractal_reactor{mapped_in = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/tcommsat/entrance) +"gs" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Telecommunications Main Breaker"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/entrance) +"gt" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) +"gu" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor,/area/tcommsat/entrance) +"gv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance) +"gw" = (/obj/machinery/turretid/stun{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor,/area/tcommsat/entrance) +"gx" = (/turf/simulated/floor,/area/tcommsat/entrance) +"gy" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/computer/power_monitor{name = "telecoms power monitoring"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{long_range = 1; name = "Powernet Sensor - Telecommunications Grid"; name_tag = "Telecommunications Grid"},/turf/simulated/floor{icon_state = "bot"},/area/tcommsat/entrance) +"gz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/tcommsat/entrance) +"gA" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/entrance) +"gB" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance) +"gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room West"},/turf/simulated/floor,/area/tcommsat/entrance) +"gD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/tcommsat/entrance) +"gE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance) +"gF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment South"; dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"gG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/tcommsat/entrance) +"gH" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) +"gI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance) +"gJ" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance) +"gK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/entrance) +"gL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Satellite"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms lethal turret control"; pixel_y = 29; req_access = list(61)},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Foyer"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/turret_protected/tcomfoyer) +"gM" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance) +"gN" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/tcommsat/entrance) +"gO" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/tcommsat/entrance) +"gP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/tcommsat/entrance) +"gQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/entrance) +"gR" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor,/area/tcommsat/entrance) +"gS" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) +"gT" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance) +"gU" = (/obj/item/weapon/cell,/turf/simulated/floor,/area/tcommsat/entrance) +"gV" = (/obj/structure/closet/malf/suits,/turf/simulated/floor,/area/tcommsat/entrance) +"gW" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/space) +"gX" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_outer"; locked = 1; name = "External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/tcommsat/entrance) +"gY" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing South"; dir = 4},/turf/space,/area/turret_protected/tcomsat) +"gZ" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_inner"; locked = 1; name = "External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/entrance) +"ha" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/entrance) +"hb" = (/obj/machinery/bluespace_beacon,/turf/simulated/floor,/area/tcommsat/entrance) +"hc" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/entrance) +"hd" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless,/area/space) +"he" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/tcommsat/entrance) +"hf" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/tcommsat/entrance) +"hg" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1381; id_tag = "telecoms_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "telecoms_pump"; tag_exterior_door = "telecoms_outer"; frequency = 1381; id_tag = "telecoms_airlock"; tag_interior_door = "telecoms_inner"; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "telecoms_sensor"},/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "telecoms_sensor"; pixel_x = 12; pixel_y = -25},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Airlock"},/turf/simulated/floor/plating,/area/tcommsat/entrance) +"hh" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/tcommsat/entrance) +"hi" = (/obj/machinery/light{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/tcommsat/entrance) +"hj" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/tcommsat/entrance) +"hk" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/tcommsat/entrance) +"hl" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/tcommsat/entrance) +"hm" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms East Wing South"; dir = 8},/turf/space,/area/turret_protected/tcomsat) +"hn" = (/turf/space,/area/syndicate_station/commssat) +"ho" = (/turf/simulated/wall/r_wall,/area/AIsattele) +"hp" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) +"hq" = (/obj/machinery/teleport/station,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele) +"hr" = (/turf/simulated/floor/plating/airless,/area/AIsattele) +"hs" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/AIsattele) +"ht" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hu" = (/obj/structure/table/rack,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hv" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hw" = (/obj/item/weapon/cell,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hx" = (/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hy" = (/turf/space,/area/AIsattele) +"hz" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hA" = (/obj/structure/lattice,/turf/space,/area/AIsattele) +"hB" = (/obj/structure/closet,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/AIsattele) +"hD" = (/obj/structure/grille/broken,/turf/space,/area/AIsattele) +"hE" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating/airless,/area/AIsattele) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -433,7 +434,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQagagagagagaEagagajacacaNafagagaEagagagaMapbsaabtakacacacacacacacakbsaaaaaUbjbublblblblbvblblbwbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxagagagagbyavatagagagagagagagagaEagagadakbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaabzbAbdbdbdbdbdbdbdbAbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEbCbDbEagaMapakacacadatagagagagavacapbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavatbFbGaMapafbHbJbIajambKbLaGbMaHawbNacalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavatbFbGaMapafbHbIbJajambKbLaGbMaHawbNacalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakadacapafagagagagagaEagagaMadamawawarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbRagagagagagagbSbTaMapbsbtbUawarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtacambVagagagagagavadapbsaaaabtbUarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -500,53 +501,53 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZccbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZeRbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUaUcacacacacacacaaUaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaacaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYbYbYcdbYbYbYbYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececececececececececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfcfcfcecececececececececgcgcgcgcgcgcgcgcebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcicjckclcmcncocfcgcgcgcgcgcgcgcgcpcgcqcrcsctcucvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchcwcxcyczcAcBcCcgcvcDcEcFcvcGcgcHcgcIcvcvcvcvcvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcictckclcmcncocfcgcgcgcgcgcgcgcgcpcgcqcrcscjcucvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchcwcxcyczcAcBcCcgcvcDcccFcvcGcgcHcgcIcvcvcvcvcvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJcKcLcMcNcOcPcgcQcvcRcvcvcScgcHcgcTcvcvcvcvcvcgceceaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicUcVcWcXcYcZdadbdccvcvdddecgdfcgdgdhdidjdkdlcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJdmdndodpdpdpdqdrdsdtdudvdwdwdwcgdxdydzdAdBdCdDdEdEdFdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYcbbYbYbYbYbYbYbYbYbYbYbYcecfcichcicJdIdJdKdLdLdLcgdMdNdOcvdPdQdRdwcgcgcgdScgcgcgcgcecebYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYcbbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUbYcecfchdTchdUdIcCdwdwdwdwdwdVdWdXdWdYdZeadZdwdwdUebecchdTchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJedeedwefefefegeheiejefekefelefefdwdUebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJedeedwefefefegeheieGefekefelefefdwdUebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacacacacacacacacacacacacacacacacaaabYcecfcichcicJemendwefeleleleoelepeleoelelelefdwdUebcPeqerescfcecebYaUcacacacacacacacacacacacacacacacacaaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJeteudwefeveweleoelexeleoeleyezefdweAeBcPeCeDeEeFcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaeGbYcecfcichcicJebeHdwefeleleleoeIexeJeoelelelefdweKeLeMeNeOePeQcfcebYeRcaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJeteudwefeveweleoelexeleoeleyezefdweAeBcPeCeDeHeFcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacacEbYcecfcichcicJebejdwefeleleleoeIexeJeoelelelefdweKeLeMeNeOePeQcfcebYeEcaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaeScdcecfchchchdUdIeTdweUeVeWeXekefeYefekeZfafbfcdwfdfednfffgfhficfcecdeScaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaaabYcecfcichcicJdIcPdweffjfkeleoflexfmeoelfnfoefdwcJebfpfqfrfsftcfcebYaacaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJebcPdwefeleleleoelexeleoelelelefdwcJebcPeCfufvfwcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacacacacacacacacacacacacacacacacaaabYcecfcichcicJdIcPdweffxfyfzfAelepelfBfCfDfEefdwcJebcPfFerescfcecebYaUcacacacacacacacacacacacacacacacacaaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJdIcPdwefefeffGefeffHefeffIefefefdwcJebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcecfchdTchdUebcCdwdwdwdwdwdwdwfJdwdwdwdwdwdwdwdUebcCchdTchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYcbbYbYbYbYbYbYbYbYcecfcichcicJebfKfLcZcZfMfNfOfPfQfRfTfSfMcZcZfUfVebcPcichcicfcebYbYbYbYbYbYbYcbbYbYbYbYbYbYbYbYbYbYcbbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJfWdndndndnfXfYfZfZgafZfZgbgcdndndndngdcPcichgecfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfgfchcicidLdLggdLdLfMghgigjgkgjglgmfMdLdLdLdLdLcicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicicichcignfMfMfMfMgofMfMfMfMgncicicicicicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchchchchchchgpgzgAgsgtgugvgsgwgxgychchchchchchchchcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcicicicicicfgngrgqgBgCgDgCgEgCgFgncfcicicicicichcfcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfgngngngngGgHgGgngngngncfcfcfcfcfcfcfcecebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececegngIgJgKgncececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYgngngLgugMgngnbYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgngngNgOgPgCgQgngnbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacagngngRgSgTgwgwgwgwgUgnbYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacagVgWgXgYgZgwgwhagwgwhbgnbYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacahcgGgngnhdhegwgwgwgwgUgnbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgngnhfhghghghhgngnbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYgngnhihjhkgngnbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYgngngngngnbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaaabYcecfcichcicJdIcPdweffjfkfleofmexfneoflfofpefdwcJebfqfrfsftfucfcebYaacaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJebcPdwefeleleleoelexeleoelelelefdwcJebcPeCfvfwfxcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacacacacacacacacacacacacacacacacaaabYcecfcichcicJdIcPdweffyfzfAfBelepelfCfDfEfFefdwcJebcPfGerescfcecebYaUcacacacacacacacacacacacacacacacacaaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJdIcPdwefefeffHefefgFefeffJefefefdwcJebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcecfchdTchdUebcCdwdwdwdwdwdwdwfKdwdwdwdwdwdwdwdUebcCchdTchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYcbbYbYbYbYbYbYbYbYcecfcichcicJebfLfMcZcZfNfOfPfQgLfSfTfUfNcZcZfVfWebcPcichcicfcebYbYbYbYbYbYbYcbbYbYbYbYbYbYbYbYbYbYcbbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJfXdndndndnfYfZgagagbgagagcgddndndndngecPcichhmcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfgYchcicidLdLghdLdLfNgigjgkglgkgmgnfNdLdLdLdLdLcicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicicichcigofNfNfNfNgpfNfNfNfNgocicicicicicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchchchchchchgqgrgsgtgugvgwgtgxgygzchchchchchchchchcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcicicicicicfgogAgBgCgDgEgDgggDgGgocfcicicicicichcfcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfgogogogogHgIgHgogogogocfcfcfcfcfcfcfcecebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececegogJgKgfgocececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYgogogMgvgNgogobYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgogogOgPgQgDgRgogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacagogogSgTgUgxgxgxgxgVgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacagWgXhggZhagxgxhbgxgxhcgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacahdgHgogohehfgxgxgxgxgVgobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgogofRhhhhhhhigogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYgogohjhkhlgogobYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYgogogogogobYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaabYbYbYcdbYbYbYaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaacaaaaaaUaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaUcacacacacacacaaUaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYhlbZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYfIbZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbaabZcabZaUaUaUbZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -573,33 +574,33 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhnhnhohphqhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhnhnhrhqhshqhthnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahuhvhqhwhxhqhqhyhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahqhqhqhzhzhzhqhqhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhqhzhzhxhzhxhAhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhnhnhBhChxhzhDhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhnhnhqhzhqhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhqhnhnaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaUaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmaahmhmhmhmhmaahmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmaahmhmhmhmhmaahmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmhmhmhmhmaaaaaaaaaaaaaahmhmhmhmhmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohohohohoaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhohohphqhrhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhohohshrhthrhuhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhwhrhxhyhrhrhzhoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahrhrhrhAhAhAhrhrhoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohrhAhAhyhAhyhBhoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhohohChDhyhAhEhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhohohrhAhrhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohohrhohoaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaUaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnaahnhnhnhnhnaahnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnaahnhnhnhnhnaahnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnaaaaaaaaaaaaaahnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-4.dmm b/maps/exodus-4.dmm index 0d9ffaf86b..cc39edcc6e 100644 --- a/maps/exodus-4.dmm +++ b/maps/exodus-4.dmm @@ -38,7 +38,7 @@ "aL" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) "aM" = (/obj/structure/table/reinforced,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) "aN" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) -"aO" = (/obj/structure/table/reinforced,/obj/machinery/camera/autoname,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) +"aO" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/network/engineering_outpost{c_tag = "Construction Site Teleporter"},/turf/simulated/floor,/area/constructionsite/teleporter) "aP" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) "aQ" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) "aR" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload Access"; req_access = list(16)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) @@ -82,9 +82,17 @@ "bD" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) "bE" = (/obj/structure/cable/blue,/obj/machinery/power/port_gen/pacman,/obj/machinery/power/terminal,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) "bF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{id_tag = "constructionsite_vent"},/turf/simulated/floor,/area/constructionsite/teleporter) -"bG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{id_tag = "constructionsite_vent"},/obj/machinery/camera/autoname,/turf/simulated/floor,/area/constructionsite/teleporter) +"bG" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{id_tag = "constructionsite_vent"},/obj/machinery/camera/network/engineering_outpost{c_tag = "Construction Site Teleporter Airlock"},/turf/simulated/floor,/area/constructionsite/teleporter) "bH" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "constructionsite_inner"; locked = 1; req_access = list(10)},/turf/simulated/floor,/area/constructionsite/teleporter) +"bI" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) "bJ" = (/turf/simulated/floor/airless{tag = "icon-gcircuit"; icon_state = "gcircuit"},/area/constructionsite/ai) +"bK" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating/airless,/area/constructionsite/ai) +"bL" = (/obj/machinery/drone_fabricator/derelict,/turf/simulated/floor/plating/airless,/area/constructionsite/ai) +"bM" = (/obj/machinery/power/apc/high{dir = 2; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "south bump"; pixel_y = -24},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) +"bN" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; id = "EngineEmitter"; state = 2},/turf/simulated/floor/plating/airless,/area/space) +"bO" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/plating/airless,/area/space) +"bP" = (/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) +"bQ" = (/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) "cj" = (/obj/structure/lattice,/turf/space,/area/constructionsite/maintenance) "ck" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) "cl" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) @@ -253,9 +261,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababalababalalalalalalalalalalalacaeapaoaoapacacaeapapauaoaoaoapabababaWaWaWbtaWaWaWabababapauauaoauapapaeacacapauaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabalalalalalalalalalalalalalalalalalalacaeapaoaoapaeaeaeapauauaoaoapapababaWaWbJbJaXbJbJaWaWababapapauaoauauapaeaeaeapauauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababababavavavavavabalabalabalabalabalacacacacacacacacacacacaeapaoaoapaqapapapauauauauapaWaWaWaWaXbJaXaXaXbJaXaWaWaWaWapauauaoauapapapaqapauauapacacavavavababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalabalalalalalalalalalalalalalaeaeaeaeaeaeaeaeaeaeaeaeapaoaoauauauauauauaoauauapaXaXaXaWbJbJaXaYaXbJbJaWaXaXaXapauauaoauauauauaoauauaoapaeaealalalalalalalalalalalalaaaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababalalalalalababalalabalabalabalabalabalcjaecjaeaeaeaeaeaeaeaeaeapauauauauauauauaoauauauckaYaYaYclaXaXaXaYaXaXaXcmaYaYaYcnaoauaoaoaoaoaoaoauauauapaeaealalalalalalalalalabalabalabalalalabalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababalalalalalalalabalabalalalalalaeaeaecjaeaeaeaeaeaeaeaeapaoaoauaoaoaoaoaoaoaoaoapaXaXaXaWbJbJaXaYaXbJbJaWcscscsapauauaoauauauauauauaoaoapaeaealalalalalalalalalalalalalalalalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalabalalalalalalalalalalalalalaeaeaeaeaeaeaeaeaeaeaeaeaoaoaoauauauauauauaoauauapaXaXaXaWbJbJaXaYaXbJbJaWbLbIbKapauauaoauauauauaoauauaoaoaeaealalalalalalalalalalalalaaaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababalalalalalababalalabalabalabalabalabalcjaecjaeaeaeaeaeaeaeaeaeauauauauauauauauaoauauauckaYaYaYclaXaXaXaYaXaXaXcmaYaYaYcnaoauaoaoaoaoaoaoauauauauaeaealalalalalalalalalabalabalabalalalabalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababalalalalalalalabalabalalalalalaeaeaecjaeaeaeaeaeaeaeaeaoaoaoauaoaoaoaoaoaoaoaoapaXaXaXaWbJbJaXaYaXbJbJaWcscscsapauauaoauauauauauauaoaoaoaeaealalalalalalalalalalalalalalalalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavavabababababavavavavavavavavavavavacacacacacacacacacacacacapaoaoapcIapapapcJaucJauapaWaWaWaWaXbJaXaXaXbJaXaWaWaWaWapauauaoauapapapaqapauaoapacacavavavavavababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababaccjcVcWcWcVaeaeaecVcXcXcXcXcVcVababaWaWbJbJaXbJbJaWaWababcVcVcXcXcXcXcVaeaeaecVcWcWcXaeacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWcVacacaecVcVcXdmcXdmcVabababaWaWaWbtaWaWaWabababcVcXcXcWcXcVcVaeacaccVcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -277,7 +285,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcXcXcXcXcVdydydydydydydydydydydydycVcWcWcXcXcWcVdydydydydydydydydydydydycVcWcWcWcWdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcVcVcVcVcVeZeZeZeZfaeZfbeZfbeZfbeZcVcWcWcWcWcXcVfcfcfdfdfdfdfdfdfdfdfcfccVcVcWcWcVcVabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVfefefeeZeZfaeZeZeZeZeZeZeZcVcXcXcXcXcXcVfdfdfcfcfcfdfdfdfdfdfcfcfccVcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVfefeeZfefefafafafafafaffffcVcVcVcVcVcVcVfdfdfcfcfcfdfdfdfdfdfcfdfccVcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVfefeeZfefefafafafafafaffffcVcVcXcXcXcVcVfdfdfcfcfcfdfdfdfdfdfcfdfccVcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVfefefefefefaeZeZfefefeeZeZeZdycXcXcXdyfcfcfdfdfdfdfdfdfdfcfcfcfdfccVcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfefefefefefeeZfefefefeeZfefedycXcXcXdyfcfcfdfdfdfdfdfdfdfcfcfcfdfccVcWcWdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfefefefefefefefefefefedycXcXcXdyfcfcfdfdfdfdfdfdfdfdfdfdfdfccVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -296,7 +304,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhfhfhfhfefefefefefefvcWcWcWcWcWcWcWcWcWfjfdfdfdfdfdfdfdfwfsfpfBcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhfhfhfhfhfhfhfhfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdfdfdfdfdfdflflflcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfDfDfDfDfDfDfDfDfDfDfDfCfgfgfgfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdfdfdfdfwfEfofFfGcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfIfHfIfHfHfHfHfHfHfIfDfhfgfhfefecVcVcWcWcWcWcWcWcWcVcVflflfdfdfLfwfdfwfsfAfNcVdmdmdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfIfHfIfHfHfHfHfHfHfIfDfhfgfhfefecVcVcWcWcWcWcWcWcWcVcVflflfdbMfLfwfdfwfsfAfNcVdmdmdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfHfHfHfHfIfHfIfCfIfIfDaaabaafIfHfIcVcVcVcWcWcWcVcVcVababflflflflflflflflflflcVcXcXdyalabalabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfIfHfIfHfHfHfHfHfHfOfDabababfHfHfHfHfHcVcWcWcWcVfIfIfHfHfIfHfIfHfHfHfHfIfHfIcXdmdmcXabababalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfHfHfHfHfOfHfHfOfOfOfDaaabaafIfHfIfHfIcVcXcWcWcVfIfHfHfHfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfIfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -348,13 +356,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRfRfTfTfTfTfTfRfRfRfSfRfRfRfTfTfTfTfTfRfRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRfRfRfYfRfRfRfTfTfTfTfTfRfRfRfSfRfRfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXfTfTfTfTfTfTfTfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXfZfTfTfTfTfTfZfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXfZfTfTfTfTfTfZfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXfZbPfTfTfTbQfZfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXfZbPfTfTfTbQfZfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXfTfTfTfTfTfTfTfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfRfRfRfRfRfRfTfTfTfTfTfRfRfRfRfRfRfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfWfTfTfTfTfRfRfXfXfXfRfRfTfTfTfTfWfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabababalabababalabababalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalalgealalalgealalalgealalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalbOalgealalalgealalalgealbNalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabababalabababalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabaaabalabaaabalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabababalabababalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -362,7 +370,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabababalabababalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabaaabalabaaabalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalalalabababalabababalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalalgealalalgealalalgealalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalbOalgealalalgealalalgealbNalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalalalalalalalalalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index 98aae30971..cf6158a1fc 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -50,29 +50,29 @@ "aX" = (/obj/structure/cable/blue,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) "aY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) "aZ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) -"ba" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Loading"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/lab) -"bb" = (/turf/simulated/wall/r_wall,/area/outpost/research/lab) -"bc" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/outpost/research/lab) +"ba" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) +"bb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) +"bc" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/outpost/research/chemistry) "bd" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) "be" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) "bf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) "bg" = (/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) "bh" = (/obj/structure/table,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"bi" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/autoname/research_outpost{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/outpost/research/analysis) +"bi" = (/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor/plating,/area/outpost/research/chemistry) "bj" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) "bk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) "bl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/abandoned) "bm" = (/turf/simulated/floor,/area/outpost/abandoned) "bn" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) "bo" = (/turf/simulated/floor{icon_state = "white"},/area/outpost/research/analysis) -"bp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/outpost/research/analysis) +"bp" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_y = 32},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/outpost/research/chemistry) "bq" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) "br" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) "bs" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) "bt" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rbath"; name = "Kitchen"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) "bu" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5},/obj/structure/curtain/open/shower,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/research/hallway) "bv" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rbath"; name = "Bathroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/research/hallway) -"bw" = (/obj/machinery/door_control{id = "rbath"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; specialfunctions = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/research/hallway) +"bw" = (/obj/machinery/button/remote/airlock{id = "rbath"; name = "Door Bolt Control"; pixel_x = 0; pixel_y = -25; specialfunctions = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/research/hallway) "bx" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 2},/turf/simulated/wall/r_wall,/area/outpost/research/chemistry) "by" = (/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/outpost/research/chemistry) "bz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/chemistry) @@ -99,12 +99,12 @@ "bU" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Spectrometry Lab"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "bV" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) "bW" = (/obj/item/stack/rods,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"bX" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Research Outpost Sample Preparation"; dir = 1; network = list("Research","SS13")},/obj/item/weapon/reagent_containers/glass/beaker/water,/obj/item/weapon/reagent_containers/glass/beaker/fuel,/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) +"bX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hallway Fore"; dir = 4},/turf/simulated/floor,/area/outpost/research/hallway) "bY" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) "bZ" = (/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) "ca" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) "cb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor{dir = 2; icon_state = "whitepurplecorner"},/area/outpost/research/lab) -"cc" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access = list(65)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) +"cc" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hydroponics"; dir = 8},/turf/simulated/floor,/area/outpost/research/chemistry) "cd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/lab) "ce" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/lab) "cf" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 6; icon_state = "whitepurple"},/area/outpost/research/lab) @@ -149,7 +149,7 @@ "cS" = (/obj/structure/sign/science{desc = "A warning sign which reads 'MASS SPECTROMETRY'"; name = "\improper MASS SPECTROMETRY"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/outpost/research/hallway) "cT" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/outpost/research/hallway) "cU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"cV" = (/obj/machinery/camera{c_tag = "Research Outpost Lobby"; dir = 2; network = list("Research","SS13")},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/outpost/research/hallway) +"cV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Sample Analysis"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/outpost/research/analysis) "cW" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "cX" = (/obj/structure/noticeboard/anomaly{icon_state = "nboard05"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "cY" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/outpost/research/lab) @@ -157,7 +157,7 @@ "da" = (/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) "db" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/research/hallway) "dc" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/outpost/research/hallway) -"dd" = (/obj/structure/sign/chemistry{desc = "A warning sign which reads 'SAMPLE PREPARATION'"; name = "\improper SAMPLE PREPARATION"; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/camera{c_tag = "Research Outpost Hallway Port"; dir = 2; network = list("Research","SS13")},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/research/hallway) +"dd" = (/obj/structure/table,/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) "de" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/research/hallway) "df" = (/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/outpost/research/hallway) "dg" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "whitepurplecorner"},/area/outpost/research/hallway) @@ -172,14 +172,14 @@ "dp" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/plating,/area/outpost/research/disposal) "dq" = (/turf/simulated/floor/plating/airless/asteroid,/area/outpost/research/disposal) "dr" = (/obj/machinery/mass_driver{dir = 4; id = "research"},/turf/simulated/floor/plating/airless/asteroid,/area/outpost/research/disposal) -"ds" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access = list(65)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) +"ds" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/outpost/research/analysis) "dt" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plating,/area/outpost/research/disposal) "du" = (/turf/simulated/floor{dir = 4; icon_state = "whiteyellowcorner"},/area/outpost/research/hallway) "dv" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) "dw" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/outpost/research/hallway) "dx" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "dy" = (/obj/machinery/vending/snack,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/outpost/research/hallway) -"dz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Anomalous Materials Locker Room"; req_access = list(65)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) +"dz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Loading"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/chemistry) "dA" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "dB" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/wood,/area/outpost/research/hallway) "dC" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/wood,/area/outpost/research/hallway) @@ -195,7 +195,7 @@ "dM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) "dN" = (/obj/machinery/light/small,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) "dO" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/item/weapon/melee/baton/loaded,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"dP" = (/obj/machinery/camera{c_tag = "Research Outpost Anomalous Materials Lab"; dir = 8; network = list("Research","SS13")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) +"dP" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/water,/obj/item/weapon/reagent_containers/glass/beaker/fuel,/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Sample Preparation"; dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) "dQ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/turf/simulated/floor/plating/airless,/area/shuttle/alien/mine) "dR" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/alien/mine) "dS" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/alien/mine) @@ -237,7 +237,7 @@ "eC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/outpost/research/hallway) "eD" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/machinery/disposal/deliveryChute{dir = 8; name = "disposal inlet"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"; nitrogen = 0.01; oxygen = 0.01},/area/outpost/research/disposal) "eE" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/outpost/research/disposal) -"eF" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/button/driver{id = "research"; pixel_x = -24; pixel_y = -24},/turf/simulated/floor/plating,/area/outpost/research/disposal) +"eF" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/button/remote/driver{id = "research"; pixel_x = -24; pixel_y = -24},/turf/simulated/floor/plating,/area/outpost/research/disposal) "eG" = (/obj/machinery/conveyor{dir = 4; id = "archgunc"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/outpost/research/disposal) "eH" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating,/area/outpost/research/disposal) "eI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) @@ -333,7 +333,7 @@ "gu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) "gv" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) "gw" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/eva) -"gx" = (/obj/machinery/camera{c_tag = "Research Outpost Hallway Central"; dir = 4; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) +"gx" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access = list(65)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) "gy" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "gz" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space) "gA" = (/obj/structure/closet/secure_closet/xenoarchaeologist{req_access = list(47)},/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced,/turf/simulated/floor,/area/outpost/research/hallway) @@ -368,7 +368,7 @@ "hd" = (/obj/effect/gibspawner/human,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) "he" = (/obj/effect/gibspawner/robot,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) "hf" = (/obj/structure/table,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/outpost/research/dock) -"hg" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/outpost/research/dock) +"hg" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Kitchen"; dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) "hh" = (/obj/structure/closet/emcloset,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor,/area/outpost/research/dock) "hi" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "bluecorner"},/area/outpost/research/dock) "hj" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/outpost/research/dock) @@ -377,7 +377,7 @@ "hm" = (/obj/machinery/door/window/westleft,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/eva) "hn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/research/dock) "ho" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/blue,/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor,/area/outpost/research/dock) -"hp" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/camera{c_tag = "Research Outpost Medbay"; dir = 1; network = list("Research","SS13")},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) +"hp" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "hq" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/outpost/research/medical) "hr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/dock) "hs" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Long Term Storage"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) @@ -409,7 +409,7 @@ "hS" = (/obj/item/weapon/shard,/obj/structure/lattice,/turf/space,/area/space) "hT" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) "hU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/dock) -"hV" = (/obj/machinery/camera{c_tag = "Research Outpost Shuttle Dock"; dir = 8; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/outpost/research/dock) +"hV" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/wood,/area/outpost/research/kitchen) "hW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/outpost/research/dock) "hX" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/westleft{base_state = "right"; icon_state = "right"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/outpost/research/eva) "hY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24; pixel_y = -32},/obj/structure/cable/blue,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) @@ -464,14 +464,14 @@ "iV" = (/turf/simulated/wall,/area/outpost/research/chemistry) "iW" = (/obj/structure/table,/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/outpost/research/chemistry) "iX" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"iY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/autoname/research_outpost{dir = 4},/turf/simulated/floor,/area/outpost/research/hallway) +"iY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "iZ" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/carpet,/area/outpost/research/hallway) -"ja" = (/obj/machinery/door_control{id = "rdorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; specialfunctions = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/research/hallway) +"ja" = (/obj/machinery/button/remote/airlock{id = "rdorm2"; name = "Door Bolt Control"; pixel_x = -25; pixel_y = 0; specialfunctions = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/research/hallway) "jb" = (/obj/structure/table/rack,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 5; pixel_y = 5},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/storage/belt/utility{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plating,/area/outpost/research/chemistry) "jc" = (/obj/structure/table,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/outpost/research/hallway) "jd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/chemistry) -"je" = (/obj/machinery/camera/autoname/research_outpost{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"jf" = (/obj/machinery/door_control{id = "rddorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/research/hallway) +"je" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/research/kitchen) +"jf" = (/obj/machinery/button/remote/airlock{id = "rddorm1"; name = "Door Bolt Control"; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/research/hallway) "jg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/outpost/research/chemistry) "jh" = (/obj/machinery/light/small,/obj/structure/closet/walllocker/emerglocker/north{dir = 1; pixel_y = -32},/turf/simulated/floor/plating,/area/outpost/research/chemistry) "ji" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rdorm2"; name = "Dorm 2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/outpost/research/hallway) @@ -493,14 +493,14 @@ "jy" = (/obj/machinery/mineral/input,/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_north"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jz" = (/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jA" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"jB" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/outpost/mining_north) +"jB" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Lobby Port"},/turf/simulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/outpost/research/hallway) "jC" = (/obj/item/weapon/table_parts,/obj/structure/table/rack,/obj/item/stack/sheet/glass/reinforced{amount = 8},/obj/item/stack/rods{amount = 6},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jD" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/outpost/mining_north) "jE" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/outpost/mining_north) "jF" = (/turf/simulated/wall,/area/outpost/mining_north) "jG" = (/obj/item/weapon/shovel,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating,/area/outpost/mining_north) "jH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"jI" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera{c_tag = "North Outpost"; dir = 8; network = list("MINE")},/obj/effect/decal/cleanable/blood/oil,/obj/structure/cable,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) +"jI" = (/obj/structure/sign/chemistry{desc = "A warning sign which reads 'SAMPLE PREPARATION'"; name = "\improper SAMPLE PREPARATION"; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Lobby Starboard"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/research/hallway) "jJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jK" = (/obj/machinery/conveyor_switch{id = "mining_north"; pixel_x = -5},/obj/effect/decal/cleanable/dirt,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jL" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_north) @@ -508,7 +508,7 @@ "jN" = (/obj/structure/closet/walllocker/emerglocker/south,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jO" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_north_outpost_outer"; locked = 1; name = "Mining External Access"; req_access = list(10,13)},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jP" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_north_outpost_inner"; locked = 1; name = "Mining External Access"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"jQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) +"jQ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Anomalous Materials Lab"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) "jR" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/outpost/mining_north) "jS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) "jT" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/outpost/mining_north) @@ -518,7 +518,7 @@ "jX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_north) "jY" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_north_outpost_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_north_outpost_pump"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "jZ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"ka" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera{c_tag = "North Outpost - Airlock"; dir = 2; network = list("MINE")},/turf/simulated/floor/plating,/area/outpost/mining_north) +"ka" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Anomalous Materials Locker Room"; req_access = list(65)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "kb" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/outpost/mining_north) "kc" = (/obj/effect/decal/cleanable/cobweb,/obj/item/stack/sheet/metal{amount = 10},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/outpost/mining_north) "kd" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/microwave{pixel_y = 6},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) @@ -532,7 +532,7 @@ "kl" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_north"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "km" = (/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "kn" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"ko" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/wall/r_wall,/area/outpost/research/power) +"ko" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hallway Central"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) "kp" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (NORTHEAST)"; icon_state = "intact-supply"; dir = 5},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (NORTHEAST)"; icon_state = "intact-scrubbers"; dir = 5},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/power) "kq" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_north_outpost_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_one_access = list(13,54)},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "kr" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/light,/turf/simulated/floor/wood,/area/outpost/research/kitchen) @@ -565,14 +565,14 @@ "kS" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/structure/cable/blue,/obj/machinery/power/sensor{long_range = 1; name_tag = "Research Outpost"},/turf/simulated/floor,/area/outpost/research/power) "kT" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/outpost/research/power) "kU" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_a) -"kV" = (/obj/machinery/door_control{id = "riso1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; specialfunctions = 4},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"kV" = (/obj/machinery/button/remote/airlock{id = "riso1"; name = "Door Bolt Control"; pixel_x = -25; pixel_y = 0; specialfunctions = 4},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "kW" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/outpost/research/isolation_a) "kX" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/outpost/research/isolation_a) -"kY" = (/obj/machinery/door_control{id = "riso2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; specialfunctions = 4},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"kY" = (/obj/machinery/button/remote/airlock{id = "riso2"; name = "Door Bolt Control"; pixel_x = 0; pixel_y = -25; specialfunctions = 4},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "kZ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/outpost/research/isolation_b) "la" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/outpost/research/isolation_b) "lb" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_c) -"lc" = (/obj/machinery/door_control{id = "riso3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; specialfunctions = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"lc" = (/obj/machinery/button/remote/airlock{id = "riso3"; name = "Door Bolt Control"; pixel_x = 0; pixel_y = -25; specialfunctions = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "ld" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/outpost/research/isolation_c) "le" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/outpost/research/isolation_c) "lf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "research_pump"},/obj/structure/closet/walllocker/emerglocker/east,/turf/simulated/floor,/area/outpost/research/eva) @@ -584,7 +584,7 @@ "ll" = (/turf/simulated/floor,/area/outpost/research/eva) "lm" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/outpost/research/eva) "ln" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/eva) -"lo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/eva) +"lo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hallway Port"; dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) "lp" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/research/eva) "lq" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/research/eva) "lr" = (/obj/machinery/conveyor_switch{id = "anotempload"; name = "conveyor switch"; pixel_x = 0; pixel_y = 0; req_access = list(65)},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -594,8 +594,8 @@ "lv" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 5},/obj/item/weapon/storage/box/samplebags{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "lw" = (/obj/structure/closet/hydrant{pixel_x = -32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "lx" = (/obj/machinery/atmospherics/unary/heater{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"ly" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/autoname/research_outpost{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"lz" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/camera/autoname/research_outpost,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"ly" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hallway Starboard"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"lz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Shuttle Dock"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "arrival"},/area/outpost/research/dock) "lA" = (/obj/machinery/conveyor_switch{id = "anosample"; req_access = list(65)},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "lB" = (/obj/machinery/power/emitter,/turf/simulated/floor{icon_state = "delivery"},/area/outpost/research/isolation_monitoring) "lC" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/isolation_monitoring) @@ -612,7 +612,7 @@ "lN" = (/obj/effect/decal/remains/human,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) "lO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/eva) "lP" = (/obj/machinery/floodlight,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/research/eva) -"lQ" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/outpost/research/eva) +"lQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) "lR" = (/obj/machinery/suspension_gen,/turf/simulated/floor,/area/outpost/research/eva) "lS" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/research/eva) "lT" = (/obj/structure/table,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/green,/turf/simulated/floor,/area/outpost/research/eva) @@ -639,7 +639,7 @@ "mo" = (/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/outpost/research/anomaly_storage) "mp" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) "mq" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) -"mr" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/camera/autoname/research_outpost{dir = 8},/turf/simulated/floor,/area/outpost/research/chemistry) +"mr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hallway Aft"; dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) "ms" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/device/camera,/obj/item/weapon/pen,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "mt" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) "mu" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) @@ -653,7 +653,7 @@ "mC" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/plating,/area/outpost/research/eva) "mD" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/outpost/research/eva) "mE" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"mF" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/camera/autoname/research_outpost,/turf/simulated/floor,/area/outpost/research/power) +"mF" = (/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis) "mG" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "mH" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/research/eva) "mI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/outpost/research/eva) @@ -728,7 +728,7 @@ "nZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) "oa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor,/area/outpost/research/eva) "ob" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 2; tag_west = 3},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"oc" = (/obj/machinery/camera{c_tag = "Research Outpost Expedition Prep"; dir = 2; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 22},/turf/simulated/floor,/area/outpost/research/eva) +"oc" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{dir = 2; icon_state = "cmo"},/area/outpost/research/dock) "od" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor,/area/outpost/research/eva) "oe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/eva) "of" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/archaeology,/obj/item/clothing/suit/space/anomaly,/obj/item/clothing/head/helmet/space/anomaly,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/outpost/research/eva) @@ -763,15 +763,15 @@ "oI" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/outpost/abandoned) "oJ" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/outpost/abandoned) "oK" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/outpost/research/power) -"oL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned) -"oM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) +"oL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned) +"oM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) "oN" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) "oO" = (/obj/machinery/artifact_scanpad,/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a) "oP" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a) "oQ" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) "oR" = (/obj/machinery/artifact_scanpad,/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b) "oS" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b) -"oT" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/research/power) +"oT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/outpost/research/power) "oU" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/outpost/research/power) "oV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) "oW" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a) @@ -781,7 +781,7 @@ "pa" = (/obj/structure/bed,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) "pb" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/machinery/light,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) "pc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"pd" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) +"pd" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Medbay"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) "pe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) "pf" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_b) "pg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) @@ -790,7 +790,7 @@ "pj" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/explored) "pk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/eva) "pl" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "research_sensor"; pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor{icon_state = "warning"},/area/outpost/research/eva) -"pm" = (/obj/structure/ore_box,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor{icon_state = "warning"},/area/outpost/research/eva) +"pm" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/outpost/research/power) "pn" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/outpost/research/eva) "po" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/space,/area/mine/explored) "pp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/structure/cable/blue,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_c) @@ -811,15 +811,15 @@ "pE" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_c) "pF" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/eva) "pG" = (/obj/machinery/door/airlock/glass_mining{name = "Equipment storage"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) -"pH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera{c_tag = "Research Outpost Expedition Airlock"; dir = 4; network = list("Research","SS13")},/turf/simulated/floor/plating,/area/outpost/research/eva) +"pH" = (/obj/structure/sign/nosmoking_2{pixel_y = -32},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Anomaly Analysis"; dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/anomaly_analysis) "pI" = (/obj/structure/disposalpipe/segment,/turf/unsimulated/mask,/area/mine/unexplored) "pJ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Temporary Storage Loading"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/eva) "pK" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) -"pL" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) +"pL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 22},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Expedition Prep"},/turf/simulated/floor,/area/outpost/research/eva) "pM" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Expedition Prep"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/dock) "pN" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) "pO" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a) -"pP" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera/autoname/research_outpost{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"pP" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Port"; dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "pQ" = (/obj/structure/table/rack,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "pR" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) "pS" = (/obj/structure/table,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -850,7 +850,7 @@ "qr" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) "qs" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) "qt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) -"qu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera/autoname/research_outpost{dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"qu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Starboard"; dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "qv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) "qw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/explored) "qx" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/space) @@ -878,10 +878,10 @@ "qT" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/carbon_dioxide,/turf/simulated/floor,/area/outpost/engineering/atmospherics) "qU" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/sleeping_agent,/turf/simulated/floor,/area/outpost/engineering/atmospherics) "qV" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/phoron,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"qW" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on{dir = 1; frequency = 1441; id_tag = "outpost_n2_out"},/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/outpost/engineering/atmospherics) +"qW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/floodlight,/turf/simulated/floor,/area/outpost/research/eva) "qX" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "outpost_n2_in"; pixel_y = 1; use_power = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/outpost/engineering/atmospherics) "qY" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "outpost_o2_in"; pixel_y = 1; use_power = 1},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/outpost/engineering/atmospherics) -"qZ" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on{dir = 1; frequency = 1441; id_tag = "outpost_o2_out"},/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/outpost/engineering/atmospherics) +"qZ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/outpost/research/eva) "ra" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) "rb" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "eoutpost_dock_pump"},/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "eoutpost_solar_sensor"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "rc" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) @@ -929,7 +929,7 @@ "rS" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "research_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_one_access = list(13,65)},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "rT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) "rU" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_outer"; locked = 1; name = "Research Outpost External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/outpost/research/eva) -"rV" = (/obj/structure/sign/nosmoking_2{pixel_y = -32},/obj/machinery/camera/autoname/research_outpost{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/anomaly_analysis) +"rV" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/explored) "rW" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_one_access = list(54,65)},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "rX" = (/obj/machinery/door/airlock/engineering{name = "Restrooms"; req_access = list(10)},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) "rY" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/outpost/engineering/atmospherics) @@ -938,7 +938,7 @@ "sb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) "sc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) "sd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) -"se" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/outpost/research/power) +"se" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Maintenance"},/turf/simulated/floor,/area/outpost/research/power) "sf" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/outpost/engineering/atmospherics) "sg" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_inner"; locked = 1; name = "Engineering Dock Airlock"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "sh" = (/turf/simulated/floor,/area/outpost/engineering/hallway) @@ -968,7 +968,7 @@ "sF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/outpost/engineering/hallway) "sG" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) "sH" = (/turf/simulated/floor/airless,/area/space) -"sI" = (/obj/machinery/camera{c_tag = "Isolation Cell C"; dir = 8; network = list("Anomaly Isolation")},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) +"sI" = (/obj/structure/ore_box,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "research_pump"},/obj/structure/sign/vacuum{pixel_x = 32},/turf/simulated/floor{icon_state = "warning"},/area/outpost/research/eva) "sJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/outpost/engineering/hallway) "sK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eoutpost_main_airlock"; pixel_x = 0; pixel_y = -25; req_access = list(10); tag_airpump = "eoutpost_main_pump"; tag_chamber_sensor = "eoutpost_main_sensor"; tag_exterior_door = "eoutpost_main_outer"; tag_interior_door = "eoutpost_main_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eoutpost_main_pump"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) "sL" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -997,7 +997,7 @@ "ti" = (/obj/structure/lattice,/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored) "tj" = (/obj/structure/lattice,/turf/space,/area/mine/explored) "tk" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/outpost/engineering/hallway) -"tl" = (/obj/machinery/camera{c_tag = "Isolation Cell B"; dir = 8; network = list("Anomaly Isolation")},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) +"tl" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Expedition Airlock"; dir = 4},/turf/simulated/floor/plating,/area/outpost/research/eva) "tm" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor,/area/outpost/engineering/hallway) "tn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) "to" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) @@ -1010,7 +1010,7 @@ "tv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) "tw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) "tx" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/space,/area/mine/explored) -"ty" = (/obj/machinery/camera{c_tag = "Isolation Cell A"; dir = 8; network = list("Anomaly Isolation")},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a) +"ty" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell A"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a) "tz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) "tA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/hallway) "tB" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) @@ -1037,7 +1037,7 @@ "tW" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) "tX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/outpost/engineering/atmospherics) "tY" = (/obj/machinery/light,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = -6; pixel_y = -28},/turf/simulated/floor,/area/outpost/engineering/hallway) -"tZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eoutpost_main_pump"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/autoname/engineering_outpost{dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) +"tZ" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell B"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) "ua" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) "ub" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) "uc" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 1; tag_east_con = 0.79; tag_south = 1; tag_south_con = 0.21; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics) @@ -1082,17 +1082,17 @@ "uP" = (/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) "uQ" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil,/turf/simulated/floor,/area/outpost/engineering/storage) "uR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/storage) -"uS" = (/obj/structure/cable/blue,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor,/area/outpost/engineering/storage) +"uS" = (/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) "uT" = (/turf/simulated/wall,/area/outpost/engineering/storage) "uU" = (/obj/machinery/floodlight,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "uV" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"uW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/autoname/engineering_outpost{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uX" = (/obj/machinery/light{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/outpost/engineering/hallway) +"uW" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell C"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) +"uX" = (/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "uY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/outpost/engineering/hallway) "uZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/engineering/storage) "va" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor,/area/outpost/engineering/hallway) "vb" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/cable_coil/yellow,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/engineering/storage) -"vc" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"vc" = (/obj/machinery/light{dir = 1},/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) "vd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor,/area/outpost/engineering/hallway) "ve" = (/turf/simulated/wall,/area/outpost/engineering/meeting) "vf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_outer"; locked = 1; name = "Engineering Dock Airlock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) @@ -1109,7 +1109,7 @@ "vq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "eoutpost_dock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "edock_airlock"; pixel_x = 30; pixel_y = 0; req_access = list(10); tag_airpump = "edock_pump"; tag_chamber_sensor = "edock_sensor"; tag_exterior_door = "edock_outer"; tag_interior_door = "edock_inner"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "vr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "vs" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"vt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/autoname/engineering_outpost{dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) +"vt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost North - Airlock"},/turf/simulated/floor/plating,/area/outpost/mining_north) "vu" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/space) "vv" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/power) "vw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/power) @@ -1123,7 +1123,7 @@ "vE" = (/obj/structure/cable/blue,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/sensor{long_range = 1; name_tag = "Engineering Outpost"},/turf/simulated/floor,/area/outpost/engineering/power) "vF" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor,/area/outpost/engineering/power) "vG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/power) -"vH" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/weapon/pickaxe,/turf/simulated/floor,/area/outpost/engineering/storage) +"vH" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/sign/vacuum{pixel_y = -32},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "vI" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/outpost/engineering/storage) "vJ" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/turf/simulated/floor,/area/outpost/engineering/storage) "vK" = (/obj/machinery/light{dir = 8},/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) @@ -1182,7 +1182,7 @@ "wL" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/space) "wM" = (/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "wN" = (/turf/simulated/wall,/area/outpost/mining_main/east_hall) -"wO" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_main/east_hall) +"wO" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/effect/decal/cleanable/blood/oil,/obj/structure/cable,/obj/machinery/camera/network/mining{c_tag = "Mining Outpost North"; dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) "wP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/east_hall) "wQ" = (/turf/simulated/wall,/area/outpost/mining_main/refinery) "wR" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/turf/simulated/floor,/area/outpost/engineering/hallway) @@ -1194,8 +1194,8 @@ "wX" = (/turf/simulated/wall,/area/outpost/mining_main/maintenance) "wY" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay) "wZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay) -"xa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) -"xb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"xa" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/outpost/mining_north) +"xb" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/table,/obj/random/tech_supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "xc" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "xd" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/sensor{long_range = 1; name_tag = "Mining Outpost"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "xe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/plating/airless,/area/outpost/engineering/hallway) @@ -1207,7 +1207,7 @@ "xk" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "xl" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/engineering/hallway) "xm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_solar_inner"; locked = 1; name = "Solar Access"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"xn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "eoutpost_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eoutpost_solar_airlock"; pixel_x = 0; pixel_y = -25; req_access = list(10); tag_airpump = "eoutpost_solar_pump"; tag_chamber_sensor = "eoutpost_solar_sensor"; tag_exterior_door = "eoutpost_solar_outer"; tag_interior_door = "eoutpost_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_solar_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/autoname/engineering_outpost,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"xn" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{pixel_y = 32},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Meeting Room"},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "xo" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/east_hall) "xp" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) "xq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_solar_outer"; locked = 1; name = "Solar Access"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) @@ -1218,12 +1218,12 @@ "xv" = (/obj/structure/ore_box,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "xw" = (/obj/machinery/sleeper,/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/outpost/mining_main/medbay) "xx" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay) -"xy" = (/obj/machinery/camera{c_tag = "Sleeper Room"; dir = 1; network = list("MINE")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay) +"xy" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "xz" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "xA" = (/obj/machinery/atmospherics/valve/digital/open{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "xB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "xC" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/outpost/engineering/hallway) -"xD" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"xD" = (/obj/structure/cable/blue,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/weapon/pickaxe,/turf/simulated/floor,/area/outpost/engineering/storage) "xE" = (/obj/structure/ore_box,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/outpost/mining_main/west_hall) "xF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/outpost/mining_main/west_hall) "xG" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/outpost/mining_main/west_hall) @@ -1231,8 +1231,8 @@ "xI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) "xJ" = (/obj/machinery/conveyor_switch{id = "mining_external"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "xK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"xL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) -"xM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/camera/autoname/engineering_outpost,/turf/simulated/floor,/area/outpost/engineering/hallway) +"xL" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"xM" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "xN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "xO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/east_hall) "xP" = (/turf/simulated/floor,/area/outpost/mining_main/east_hall) @@ -1241,9 +1241,9 @@ "xS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/east_hall) "xT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) "xU" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"xV" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"xV" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/outpost/research/power) "xW" = (/obj/machinery/mineral/input,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/outpost/mining_main/refinery) -"xX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"xX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "xY" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) "xZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "ya" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/outpost/mining_main/east_hall) @@ -1261,8 +1261,8 @@ "ym" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_outer"; locked = 1; name = "Mining External Access"},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) "yn" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "yo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"yp" = (/obj/machinery/camera{c_tag = "Shuttle Airlock"; dir = 8; network = list("MINE")},/obj/machinery/conveyor_switch/oneway{id = "mining_internal"; name = "mining conveyor"},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"yq" = (/obj/machinery/camera{c_tag = "Production Room"; dir = 8; network = list("MINE")},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/mining_main/refinery) +"yp" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/meeting) +"yq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Power Distribution"},/turf/simulated/floor,/area/outpost/engineering/power) "yr" = (/turf/simulated/floor,/area/outpost/mining_main/refinery) "ys" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "yt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) @@ -1312,12 +1312,12 @@ "zl" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_west_outpost_pump"},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/mining_west) "zm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_west) "zn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_west) -"zo" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_west_outpost_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_west) +"zo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "eoutpost_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eoutpost_solar_airlock"; pixel_x = 0; pixel_y = -25; req_access = list(10); tag_airpump = "eoutpost_solar_pump"; tag_chamber_sensor = "eoutpost_solar_sensor"; tag_exterior_door = "eoutpost_solar_outer"; tag_interior_door = "eoutpost_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_solar_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Solar Access"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "zp" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor,/area/outpost/mining_west) "zq" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor,/area/outpost/mining_west) "zr" = (/obj/machinery/recharge_station,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/outpost/mining_west) "zs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_west) -"zt" = (/obj/structure/table/rack,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/mining_west) +"zt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost TeleCommunications"; dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) "zu" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/outpost/mining_west) "zv" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_west) "zw" = (/obj/structure/table/rack,/turf/simulated/floor,/area/outpost/mining_west) @@ -1355,7 +1355,7 @@ "Ac" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_west) "Ad" = (/obj/structure/table,/obj/item/weapon/shovel,/turf/simulated/floor,/area/outpost/mining_west) "Ae" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"Af" = (/obj/machinery/conveyor_switch{id = "mining_west"; pixel_y = 10},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"Af" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/outpost/engineering/storage) "Ag" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/void/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/mining,/obj/item/weapon/mining_scanner,/turf/simulated/floor,/area/outpost/mining_main/eva) "Ah" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "Ai" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor,/area/outpost/mining_main/eva) @@ -1374,11 +1374,11 @@ "Av" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) "Aw" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) "Ax" = (/obj/structure/ore_box,/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_outpost_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_west_outpost_pump"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/mining_west) -"Ay" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera{c_tag = "West Outpost - Airlock"; dir = 1; network = list("MINE")},/turf/simulated/floor/plating,/area/outpost/mining_west) +"Ay" = (/obj/structure/table/rack,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/shoes/magboots,/obj/item/clothing/gloves/yellow,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/item/weapon/storage/briefcase/inflatable,/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Storage"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/storage) "Az" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "AA" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/mining_west) "AB" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"AC" = (/obj/machinery/camera{c_tag = "Crew Area"; dir = 1; network = list("MINE")},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) +"AC" = (/obj/machinery/light/small{dir = 4},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Airlock Entry"; dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "AD" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) "AE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/mining_west) "AF" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_west) @@ -1396,14 +1396,14 @@ "AR" = (/obj/item/weapon/cigbutt,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) "AS" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) "AT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) -"AU" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/rack,/obj/item/weapon/rig/industrial,/turf/simulated/floor,/area/outpost/mining_main/west_hall) +"AU" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/rack,/obj/item/weapon/rig/industrial/equipped,/turf/simulated/floor,/area/outpost/mining_main/west_hall) "AV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"AW" = (/obj/machinery/camera{c_tag = "Storage Room"; dir = 1; network = list("MINE")},/turf/simulated/floor,/area/outpost/mining_main/west_hall) +"AW" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) "AX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) "AY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/mining_main/eva) "AZ" = (/turf/simulated/floor,/area/outpost/mining_main/eva) -"Ba" = (/obj/machinery/light_switch{pixel_x = 25; pixel_y = -9},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/outpost/mining_main/eva) -"Bb" = (/obj/machinery/camera{c_tag = "EVA"; dir = 4; network = list("MINE")},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/outpost/mining_main/eva) +"Ba" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/outpost/engineering/hallway) +"Bb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Hallway East"},/turf/simulated/floor,/area/outpost/engineering/hallway) "Bc" = (/obj/machinery/conveyor_switch{id = "mining_west"; pixel_x = 5},/turf/simulated/floor,/area/outpost/mining_west) "Bd" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_outpost_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/outpost/mining_west) "Be" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/outpost/mining_west) @@ -1427,7 +1427,7 @@ "Bw" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/pickaxe,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "Bx" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "By" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/eva) -"Bz" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/eva) +"Bz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eoutpost_main_pump"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Airlock"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) "BA" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/mining_main/eva) "BB" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/outpost/mining_west) "BC" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/outpost/mining_west) @@ -1439,8 +1439,8 @@ "BI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/mining_west) "BJ" = (/obj/machinery/door/airlock/glass{name = "Crew Area"; req_access = list(48)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/dorms) "BK" = (/obj/machinery/door/airlock/mining{name = "Mining Station Storage"; req_access = list(48)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BL" = (/obj/machinery/camera{c_tag = "West Outpost"; dir = 1; network = list("MINE")},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor,/area/outpost/mining_west) -"BM" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/outpost/mining_west) +"BL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Hallway West"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) +"BM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Hallway Central"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) "BN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_west) "BO" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/eva) "BP" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/mining_main/eva) @@ -1453,7 +1453,7 @@ "BW" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/mining_main/eva) "BX" = (/obj/machinery/mineral/input,/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/turf/simulated/floor,/area/outpost/mining_west) "BY" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_west) -"BZ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "outpost_o2_in"; name = "O2 Tank Monitor"; output_tag = "outpost_o2_out"; sensors = list("outpost_o2_sensor" = "Tank")},/obj/machinery/camera/autoname/engineering_outpost{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"BZ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "outpost_o2_in"; name = "O2 Tank Monitor"; output_tag = "outpost_o2_out"; sensors = list("outpost_o2_sensor" = "Tank")},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Atmospherics"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) "Ca" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/east_hall) "Cb" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/outpost/mining_main/east_hall) "Cc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) @@ -1465,13 +1465,13 @@ "Ci" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/outpost/mining_main/west_hall) "Cj" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor,/area/outpost/mining_main/west_hall) "Ck" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Cl" = (/obj/machinery/camera{c_tag = "Crew Area Hallway"; network = list("MINE")},/turf/simulated/floor,/area/outpost/mining_main/west_hall) +"Cl" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on{dir = 1; frequency = 1441; id_tag = "outpost_o2_out"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/outpost/engineering/atmospherics) "Cm" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/mining_main/west_hall) "Cn" = (/obj/structure/sink{pixel_y = 30},/obj/machinery/light/small,/obj/structure/mirror{pixel_y = -32},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/mining_main/west_hall) "Co" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/mining_main/west_hall) "Cp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/west_hall) "Cq" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/outpost/mining_west) -"Cr" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/blue,/turf/simulated/floor,/area/outpost/mining_main/eva) +"Cr" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on{dir = 1; frequency = 1441; id_tag = "outpost_n2_out"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/outpost/engineering/atmospherics) "Cs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/eva) "Ct" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "Cu" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor,/area/outpost/mining_main/eva) @@ -1481,7 +1481,7 @@ "Cy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "Cz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) "CA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/mining_main/east_hall) -"CB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera{c_tag = "Production Line External"; dir = 1; network = list("MINE")},/turf/simulated/floor/plating,/area/outpost/mining_main/eva) +"CB" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/outpost/engineering/atmospherics) "CC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "CD" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_east_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) "CE" = (/obj/structure/ore_box,/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_east_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/mining_main/eva) @@ -1497,7 +1497,7 @@ "CO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/mining_main/west_hall) "CP" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access = list(54)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/mining_main/eva) "CQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/outpost/engineering/hallway) -"CR" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/outpost/mining_main/west_hall) +"CR" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/outpost/engineering/atmospherics) "CS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) "CT" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_east_inner"; locked = 1; name = "Mining External Access"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/mining_main/eva) "CU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) @@ -1506,7 +1506,7 @@ "CX" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/west_hall) "CY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/west_hall) "CZ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Da" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) +"Da" = (/obj/machinery/light{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/outpost/mining_west) "Db" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/east_hall) "Dc" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/outpost/mining_main/east_hall) "Dd" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor,/area/outpost/engineering/atmospherics) @@ -1570,25 +1570,25 @@ "Ej" = (/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/outpost/mining_main/refinery) "Ek" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/structure/plasticflaps,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) "El" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Em" = (/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "miningdorm1"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"Em" = (/obj/machinery/light/small{dir = 4},/obj/machinery/button/remote/airlock{id = "miningdorm1"; name = "Door Bolt Control"; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) "En" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access = list(54)},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "Eo" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "Ep" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "Eq" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/outpost/engineering/storage) -"Er" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/camera/autoname/engineering_outpost,/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"Er" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_west_outpost_pump"},/obj/structure/sign/vacuum{pixel_y = 32},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_west) "Es" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/vacuum{pixel_x = 32},/turf/simulated/floor,/area/outpost/engineering/hallway) "Et" = (/obj/structure/sign/electricshock,/turf/simulated/wall,/area/outpost/engineering/hallway) -"Eu" = (/obj/machinery/light/small{dir = 4},/obj/machinery/camera/autoname/engineering_outpost{dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"Eu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost West - Airlock"; dir = 1},/turf/simulated/floor/plating,/area/outpost/mining_west) "Ev" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/outpost/engineering/hallway) -"Ew" = (/obj/structure/table/rack,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/shoes/magboots,/obj/item/clothing/gloves/yellow,/obj/machinery/camera/autoname/engineering_outpost{dir = 1},/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor,/area/outpost/engineering/storage) -"Ex" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/camera/autoname/engineering_outpost{dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"Ey" = (/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "miningdorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) -"Ez" = (/obj/machinery/light/small{dir = 4},/obj/machinery/door_control{id = "miningdorm3"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) -"EA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/camera/autoname/engineering_outpost,/turf/simulated/floor,/area/outpost/engineering/power) +"Ew" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Crew Area"; dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) +"Ex" = (/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Storage Room"; dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) +"Ey" = (/obj/machinery/light/small{dir = 4},/obj/machinery/button/remote/airlock{id = "miningdorm2"; name = "Door Bolt Control"; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"Ez" = (/obj/machinery/light/small{dir = 4},/obj/machinery/button/remote/airlock{id = "miningdorm3"; name = "Door Bolt Control"; pixel_x = 25; pixel_y = 0; specialfunctions = 4},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"EA" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost EVA"; dir = 4},/turf/simulated/floor,/area/outpost/mining_main/eva) "EB" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "EC" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/outpost/engineering/hallway) "ED" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall,/area/space) -"EE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/camera/autoname/mining_outpost{dir = 8},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"EE" = (/obj/machinery/light_switch{pixel_x = 25; pixel_y = -9},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 10},/turf/simulated/floor,/area/outpost/mining_main/eva) "EF" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) "EG" = (/obj/structure/window/reinforced,/obj/structure/lattice,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/space) "EH" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space) @@ -1600,6 +1600,27 @@ "EN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating/airless,/area/space) "EO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/east_hall) "EP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/outpost/mining_main/east_hall) +"EQ" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/obj/structure/sign/vacuum{pixel_y = 32},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/eva) +"ER" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/camera/network/mining{c_tag = "Mining Outpost West"; dir = 1},/turf/simulated/floor,/area/outpost/mining_west) +"ES" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/outpost/mining_west) +"ET" = (/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Crew Area Hallway"},/turf/simulated/floor,/area/outpost/mining_main/west_hall) +"EU" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/blue,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/outpost/mining_main/eva) +"EV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Airlock East"; dir = 1},/turf/simulated/floor/plating,/area/outpost/mining_main/eva) +"EW" = (/obj/machinery/conveyor_switch{id = "mining_west"; pixel_y = 10},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"EX" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/outpost/mining_main/west_hall) +"EY" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"EZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"Fa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"Fb" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor,/area/outpost/mining_main/east_hall) +"Fc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Medical"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay) +"Fd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Maintenance"; dir = 8},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"Fe" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"Ff" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"Fg" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"Fh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Airlock West"; dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) +"Fi" = (/obj/machinery/conveyor_switch/oneway{id = "mining_internal"; name = "mining conveyor"},/obj/machinery/light{dir = 4},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost - Shuttle Airlock"; dir = 8},/turf/simulated/floor,/area/outpost/mining_main/east_hall) +"Fj" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Production Room"; dir = 8},/turf/simulated/floor,/area/outpost/mining_main/refinery) +"Fk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1643,39 +1664,39 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababiLiKiKiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaJaJaJaJaJababababababababiMeOeOdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababaJiNiOiPaJaJaJaJaJaJaGaGaGaGiQiRaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababaJjbiTiUiViWaKaKaKiSaiiZjfaiiYeOaijaiZaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababaAaAaAaAjpjhiTjrjgjdjdjdmraijojmjnjkjljijjjcaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababbaabababaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababbbababababababiLiKiKiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaJaJaJaJaJabbbababababababiMeOeOdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababaJiNiOiPaJaJbcaJaJaJaGaGaGaGiQiRaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababaJjbbiiUiViWbpaKaKiSaiiZjfaibXeOaijaiZaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababaAaAaAaAjpjhiTjrjgjdjdjdccaijojmjnjkjljijjjcaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaababababaAaAaNaOaAaJaJaJaJaKaKaLaLaMaiaiaiaiaIaHaiaiaiaGazazazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahagafaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababaAaBaCaDaEaFasaraqapawavauataiakajaiaoanaiamayaUaxamazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbmblaeaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababaAaWbobpaAbnbAbgbBbAbybxaubzaibubwbvbrbqbtbsbjbhbhfJazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaRaQaSaeaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababaAaWaTbiaAaVbgbfbebdbbbcbbbaaGaGaGaGaZaYaiaXbjbhbhdvazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdldleubWbVblaeaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeabababaAaWcmcnaAclbYbXcabZcccbcecdcgcfchaGcjcickamamiXamjeazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQdRdSdTbDbCbEaeaeababababababababababababababababababababababababababababababababababababababababababababababababababalalalaeaeaeaeaeaeaeaebTaGaGaGaGaGaGbUaGaGaGaGbFaGaGbIbHbGbLbKbJaGbPbObNbMbRbSbQbRazalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetdldlfycPbVcrabababababababababababababababababababababababababababababababababababababababababababababababababababalalalaaaaaaexexexexexexexaicWcXcUcVcScTcQcRdcdbdeddaGcYdacZdidhdjaGdgdfbNbMbMbMbMazazalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecocqcpcrabababababababababababababababababababababababababababababababababababababababababababababababababababababalaaaaaaexexexexexexexcscwcxcyctctcucvctcycFcEcDcCcBcAczcMcMcLcKcJcIcHcGcOkrcNazalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefxemelekcrababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaexexexexexexexejcwdAdBdCeheidFdGdYaGeadZaGebedecdOdNdPaGdVdUaidWdWdWdWeeefegalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaedLdKdMcrdJdIcrcrcrcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexdHcwdAdBdCdDdEdFdGdyaGdxdwaGdzbbbbbbbbdsaGlyduaidtdodpdmdndqdrdqdqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkbmblaeaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababaAaWbocVaAbnbAbgbBbAbybxaubzaibubwbvbrbqbtbsbjddbhfJazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPaRaQaSaeaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababaAaWaTdsaAaVbgbfbebdaJbcaJdzaGaGaGaGaZaYaiaXbjbhbhdvazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdldleubWbVblaeaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeabababaAaWcmcnaAclbYdPcabZgxcbcecdcgcfchaGcjcickamamiXamhgazhpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQdRdSdTbDbCbEaeaeababababababababababababababababababababababababababababababababababababababababababababababababababalalalaeaeaeaeaeaeaeaebTaGaGaGaGaGaGbUaGaGaGaGbFaGaGbIbHbGbLbKbJaGbPbObNbMbRbSbQhVjeiYalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetdldlfycPbVcrabababababababababababababababababababababababababababababababababababababababababababababababababababalalalaaaaaaexexexexexexexaicWcXcUjBcScTcQcRdcdbdejIaGcYdacZdidhdjaGdgdfbNbMbMbMbMbMazalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecocqcpcrabababababababababababababababababababababababababababababababababababababababababababababababababababababalaaaaaaexexexexexexexcscwcxcyctctcucvctcycFcEcDcCcBcAczcMcMcLcKcJcIcHcGcOkrcNazazalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefxemelekcrababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaexexexexexexexejcwdAdBdCeheidFdGdYaGeadZaGebedecdOdNjQaGdVdUaidWdWdWdWeeefegalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaedLdKdMcrdJdIcrcrcrcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexdHcwdAdBdCdDdEdFdGdyaGdxdwaGkaaGaGaGaGcCaGkoduaidtdodpdmdndqdrdqdqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfefEfHfGfFafbCeYcrfbfacrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaifkflfjdCfhfidFfgfvaGfzfwfsfrfuftfoaGeLeKfmeRaifnfAfBfCfDdqalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefcfdfeffeUeTeWeVeYeXfaeZfbcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaeAereseyezeresevewepeqeneneneoeoeoeoeoeSeReQePeOeNeMaGfqfpeJeIaieHeFeGeDeEeCaGaGeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahSfchbfcfEfEdJheeUcrekhdcrfahccrabababababababababababababababababababababababababababababababababababababababababababababababdXaaaaaaaaaagMgPgQgNgOgTgQgRgSgWgXgUgVhaeogYgZgweogxeRgBgAgDgCgEaGgGgFgIgHaiaigJaiaiaieReRgKeBeBeBeBgLeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaegugvfEgsgtfEcpgqeTgrgpgocrcrcrcrcrcrababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaagngbgcgcgcgcgdgegfggghgigjgkeoglgmfVfUfTeIfXfWeReRfYfweReReJeIgafZfKfLfIlzeReRfMeBfOfPeBfNfRfSfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeiCiBhRfEgtiDffiGeUiFcriIiHcrhOhKbCiEcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaagngQgQgQhWgQhVhUgQibgXhZiahYeogmhXihigijiiidicifieilieimieikieieieirisitiuinioipiqixiyiziAivhAiweBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeababcrfFhLhPhQhRhThNeThOafbChKcrhOhLhKhMcrababababababababababababababababababababababababababababababababababalalalalalalababababababkDkEaaaaaahrgQgQhihjhfhggRhhhnhohphqhkeohlhmhHeoeohGhGhFhuhEhxhuhJhuhIhwhwhwhwhxhuhvhththseBhChDeBhBhzhAhyeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrcrcrcrcrcrfGeUnWhLeUgqnUhOhOeVeYiIcrhOcpeknVcrababababababababababababababababababababababababababababababababalalalgygygygyalalalababsEgygyaaaaaaaanwereseynwnwnwnwnwpMnwnununueopJeonSnTnRhGsesjhunMnKnLnInJnGnHkmkmkmnFhunEnChtnBlulululurVnznyfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrmPeUhRoEcriCoDiBcrgrcroGoHoFcrbClLiFmOcpeleUcrabababababababababababababababababababababababababababababababalalgygygygygygygygyalalabgygyaaaaaaaaaaaaaaaeaekBohogoflnoeodocqOoanZnYqhoqorosrIrfrvhuopokollDkmnGoiojkmkmmghuoCozhtoBoAovoulueBeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahSfchbfcfEfEdJheeUcrekhdcrfahccrabababababababababababababababababababababababababababababababababababababababababababababababdXaaaaaaaaaagMgPgQgNgOgTgQgRgSgWgXgUgVhaeogYgZgweoloeRgBgAgDgCgEaGgGgFgIgHaiaigJaiaiaieReRgKeBeBeBeBgLeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaegugvfEgsgtfEcpgqeTgrgpgocrcrcrcrcrcrababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaagngbgcgcgcgcgdgegfggghgigjgkeoglgmfVfUfTeIfXfWeReRfYfweReReJeIgafZfKfLfIlyeReRfMeBfOfPeBfNfRfSfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeiCiBhRfEgtiDffiGeUiFcriIiHcrhOhKbCiEcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaagngQgQgQhWgQlzhUgQibgXhZiahYeogmhXihigijiiidicifieillQimmrikieieieirisitiuinioipiqixiyiziAivmFiweBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeababcrfFhLhPhQhRhThNeThOafbChKcrhOhLhKhMcrababababababababababababababababababababababababababababababababababalalalalalalababababababkDkEaaaaaahrgQgQhihjhfocgRhhhnhopdhqhkeohlhmhHeoeohGhGhFhuhEhxhuhJhuhIhwhwhwhwhxhuhvhththseBhChDeBhBhzhAhyeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrcrcrcrcrcrfGeUnWhLeUgqnUhOhOeVeYiIcrhOcpeknVcrababababababababababababababababababababababababababababababababalalalgygygygyalalalababsEgygyaaaaaaaanwereseynwnwnwnwnwpMnwnununueopJeonSnTnRhGoTsjhunMnKnLnInJnGnHkmkmkmnFhunEnChtnBlulululupHnznyfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrmPeUhRoEcriCoDiBcrgrcroGoHoFcrbClLiFmOcpeleUcrabababababababababababababababababababababababababababababababalalgygygygygygygygyalalabgygyaaaaaaaaaaaaaaaeaekBohogoflnoeodpLqOoanZnYqhoqorosrIrfrvhuopokollDkmnGoiojkmkmmghuoCozhtoBoAovoulueBeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcrmPcphRcpmUlLhLmShLmTbCbCmNeYbCcpcpcreUmOeUeUcrababababababababababababababababababababababababababababababalalgygygygygygygygygygymQmRgygyaaaaaaaaaaaaaaaaaekBmLllmMlOmImHmJkBkBllmKeomCmDhGhGnPnXhumEmxmbmvmwmAmBmynAmsnfhumqmuhtmtmpmpmoluabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcrlMhReUcpnscpnrdJcpnqmTnrhKntcpkNekcrlIcpgobCcrabababababababababababababababababababababababababababababalmRgygygygygygygygygygygynDnjgyaeaaaaaaaaaaaaaaaaaekBmLllnppGnmnlllnkkBnneoeonNnOhGoXotoKhupPmVmWmXnQonoomEobmGquhungnhhtnineneneluabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababcrlMlNeUfFcrkPcrlJlKcrcpcrlJlKcreUlLcrdIlHiFlIcrabababababababababababababababababababababababababababababalomgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaaaekBlmlllolnmzlqltlskBlpeoowoxoyhGnamYmZhulxlFlGlDlElBlCkmnbkmkmhulwlvhtlululululuabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababcrcrcrcrcrcrkPcrgokNcphTmmeUhTeUgoffcrmnmknxmjcrabababababababababababababababababababababababababababababalmQgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaeaekBlRlQlPlOnolqndlTkBlSeooYoxoyhGnvhGnchulWmbmcmdmelYlZmamamhmghumimfhtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababcrkPcrkNekkOhTkMcphKcreUekcrkLkJkJkKcradababababababababababababababababababababababababababababalalgygygyprgygygygygygygygygygyaeaaaaaaaaaaaaaeaeaekBkBkCkFkBkBkGlhkGkBkIeoowpBpCkokpmFkshukVkvkwkYkukzkAlckyknkmhuhththtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababcrlMlNeUfFcrkPcrlJlKcrcpcrlJlKcreUlLcrdIlHiFlIcrabababababababababababababababababababababababababababababalomgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaaaekBlmllqWlnmzlqltlskBlpeoowoxoyhGnamYmZhulxlFlGlDlElBlCkmnbkmkmhulwlvhtlululululuabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababcrcrcrcrcrcrkPcrgokNcphTmmeUhTeUgoffcrmnmknxmjcrabababababababababababababababababababababababababababababalmQgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaeaekBqZlRlPlOnolqndlTkBlSeooYoxoyhGnvhGnchulWmbmcmdmelYlZmamamhmghumimfhtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababcrkPcrkNekkOhTkMcphKcreUekcrkLkJkJkKcradababababababababababababababababababababababababababababalalgygygyprgygygygygygygygygygyaeaaaaaaaaaaaaaeaeaekBkBkCkFkBkBkGlhkGkBkIeoowpBrVhGkpsekshukVkvkwkYkukzkAlckyknkmhuhththtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababcrkPcrhTcpbVljeUekgocrkPcrcrhOeUkJkKlkadababababababababababababababababababababababababababababalpSpTgypUpSpQgygygygygygygygygytjaaaaaaaaaaaetjtjtjgygyqdqeqfkBmllglfkBlieogylrlAhGkSkTkTkUlUkWkXkUlVkZlalblXleldlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababcrkPcrcrcrcrcrcrcrcrcrkPcrphbCeUbCkKpiadababababababababababababababababababababababababababababalpSgygygypSpQgygygygygygygyqwqCpjsWsWsWsWsWsWpoqwqCgygygygygykBplpnpmkBpkgygygygyhGpApxpykUpwpupvkUptpqpslbpppEpDlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLababababababababababababababcrkPkPkPkPkPkPkPkPkPkPkPcrhOeUiFeUiEcradababababababababababababababababababababababababababababalgygygygyqMqNgygygygygygygygyrWqPqPqPqPqPqPqPqPrWgygygygygygykBpHrUkGkBpFrigygygyhGpXkTkTkUpWpOtykUpRpLtllbpNpKsIlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababcrcrcrcrcrcrcrcrcrcrcrcrcrcrmjrOoMcrcradababababababababababababababababababababababababababababalgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygygypBrSpCpdpcpeoVoVoVoToUsyoZkUoWoOoPkUoNoRoSlboQpbpalbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababcrkPcrcrcrcrcrcrcrcrcrkPcrphbCeUbCkKpiadababababababababababababababababababababababababababababalpSgygygypSpQgygygygygygygyqwqCpjsWsWsWsWsWsWpoqwqCgygygygygykBplpnsIkBpkgygygygyhGpApxpykUpwpupvkUptpqpslbpppEpDlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLababababababababababababababcrkPkPkPkPkPkPkPkPkPkPkPcrhOeUiFeUiEcradababababababababababababababababababababababababababababalgygygygyqMqNgygygygygygygygyrWqPqPqPqPqPqPqPqPrWgygygygygygykBtlrUkGkBpFrigygygypmpXkTkTkUpWpOtykUpRuStZlbpNpKuWlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababcrcrcrcrcrcrcrcrcrcrcrcrcrcrmjrOoMcrcradababababababababababababababababababababababababababababalgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygyuXpBrSpCvcpcpeoVoVoVxVoUsyoZkUoWoOoPkUoNoRoSlboQpbpalbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadadcrkJkJeUcradadababababababababababababababababababababababababababababalpSpTgygygygygygygygygygyaaaaaaaaaaaaaaaaalalalalalalalalgygygygygygypBpgpCgygyalhGhGhGhGkUkUkUkUkUpfpfpflblblblblbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadadcroJoIoJcradabababababababababababababababababababababababababababababalpSgygygygygygygygygygygyaaaaaaaaaaaaaaaaalalalababababalalalalalalalgyjHgygyalalababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababadadcroLrOmjcradabababababababababababababababababababababababababababababalalpVryrxgygygygygyalalalaaaaaaaaaaaaaaaaaaababababababababalalalalalgyjHgygyalabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1685,10 +1706,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLabababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaabababaaaaaaababababababababababalalgygyjHgyalabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaababaaaaaaababababababababababalalalgyjHgyalalalalalababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababalalalgyjHgygygygyrHjFjFjFjFjFjFjFjFjFjFjFjFabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababalalalgyjHgygygygyrJkakQjYjXkgkfkekdjFkckbjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaabababababababababalalalgykHjSjSjSoVjVjOjNjQjPkqjZkxktjWjRjTjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabaaaaaaaaababababababababababalalgykigygygygyjFjFjFjFjFjFjKjJjIjFjMjLjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababababalalgyqqjsjujtjtjvjxjwjzjyjBjAjUjCjEjDjGjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababalalalgyjHgygygygyrJvtkQjYjXkgkfkekdjFkckbjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaabababababababababalalalgykHjSjSjSoVjVjOjNvHjPkqjZkxktjWjRjTjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabaaaaaaaaababababababababababalalgykigygygygyjFjFjFjFjFjFjKjJwOjFjMjLjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababababalalgyqqjsjujtjtjvjxjwjzjyxajAjUjCjEjDjGjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaaaabababababababababalalgygygykigygyjFjFjFjFkljFjFjFjFjFjFjFjFabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababalalalalgykigygygygysAkRsCsCalababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababalalalrJkkrigygygygygygygyalababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1729,16 +1750,16 @@ aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqL aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLabababababqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaagygygygygygygygypBpCgygygykigygygygyalababababababababababababababababababababababababababababababababqjqkqmqlrXqiqjababaaaaaaaeaaaaaaaeaaaeaaaeaeaeaeaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaalalgysLgygygygygygygygyqqjsqngygyalalabababababababababababababababababababababababababababababababqjqkqvtzqjqjqjababaaaaaaaeaeaeaeaeaeaeaeaeaaaaaeaeaaqgqcqbaeqgqcqbaeqgqcqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabalalmRalalalalalalgygygygykigygygyalalalabababababababababababababababababababababababababababababqjqkqtqsrXqrqjabababaaaaaeaaaeaaaaaaaeaaaaaaaaaeaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababalalgygygykigygygygygyalalababababababababababababababababababababababababuyuyuyuyuyvewkveveveqjqjqjababaaaeaaaeaeaaaaaeaaaaaaaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalalalaeaeaeaeaeaeaeaeaeaeaealalalalabababababalalgygyqqjsjsqngygygyalalababababababalalalababababababababababababababuyvbuZEqvJEpuVEoErvcuOuOqjababaaaeaaaeaaaaaaaeaeaeaeaeaeaeaeqgqcqbaeqgqcqbaeqgqcqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalalalalsHsHsHsHsHsHsHsHsHsHsHsHsHsHalalalalababababalgygygygygykigygygygyalalabababalalalgyalababababababababababababababuyuQuRuSuTuUuAuPuNuMuPuOqjababaaaeaaaaaaaaaaaeaaaaaeaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababalalgygygykigygygygygyalalababababababababababababababababababababababababuyuyuyuyuyvewkveveveqjqjqjabalaaaeaaaeaeaaaaaeaaaaaaaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalalalaeaeaeaeaeaeaeaeaeaeaealalalalabababababalalgygyqqjsjsqngygygyalalababababababalalalababababababababababababababuyvbuZEqvJEpuVEoxnxbuOuOqjalalxyaeaaaeaaaaaaaeaeaeaeaeaeaeaeqgqcqbaeqgqcqbaeqgqcqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalalalalsHsHsHsHsHsHsHsHsHsHsHsHsHsHalalalalababababalgygygygygykigygygygyalalabababalalalgyalababababababababababababababuyuQuRxDuTuUuAuPuNuMuPxLypxMxMiYaeaaaaaaaaaaaeaaaaaeaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaealalabababababalalgygygygyqqjsjsqngygyalabalalalgygygyalababababababababababababababuyuzuwuxuFuGuAuBuKuJuIuHqjuLuLuLuLuLrMrLrLrNrtrMrNrtaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaqaqaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababalalalalgysMgygykigygyalalalgygygygygypzpzpzpzabababababababvMvMvMvMuywJuwwKwHwIEBuPwFwEuIwGvewBwDEAwywxwAwzshwawwwvECrMrLrNaaaaaewLaeaaaewLaeaaaewLaeaaaeaaqaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaababababababababababalalmRgygykigygygygygygygygygygyAwwuwtpzabababababababvMvXvVvWuyvUuwvTvRvSuAuPwjwiuPwhvewgwfwewdwcwbtEshwavZvYxlxmxnxqxewlsNsNsNsNsNsNsNsNsNsNwrwqwsaeqaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLabqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaababababababababababababalalgyqqjsqngygygygygygygygyAwAevQpzababrtrtrtrtabvMvNvOExuyvHvIEwuTvKuAvLvCvBuAvDvevEvGvFvwvvvgvxvzvysvvAEvrMrLrNaaaaaevuaeaaaevuaeaaaevuaeaaaeaaqaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaabababababababababababababalgygygyqygygygygygygygygyAwAeEurtrtrtrtvivirtrtrtrtwnrtrtrGrGrGrGvhrNrGwRrGvhrNrGvsvrrGwpEtvlvkvpvorGvnEsrtaaaaaaaaqgrgqbaaqgrgqbaaqgrgqbaaqaqaqaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaabababababababababababababalalalrJqzrigygygygygygygypBAzuDuvvPsxulwosJuXwCwmsDsFsGtdtetctfsYtctctctrtqtctcxCtktntmtAzgtDtCtvtuxMtwtEtFaaaeaaaaqgrgqbaaqgrgqbaaqgrgqbaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaabababababababababababababababalalAwrQrPrRrRrRrRrRrRrRrRrTswsztZsKsBuksdsdsdvtsoslsmstsdsdsssqsrsdsdvauYuWsdscsbsarZskvdrZsishshtYsQsusvaeaeaeaeqgrgqbaeqgrgqbaeqgrgqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababalalalalgysMgygykigygyalalalgygygygygypzpzpzpzabababababababvMvMvMvMuywJuwwKwHwIEBuPwFwEuIwGvewBwDyqwywxwAwzshwawwwvECrMrLrNaaaaaewLaeaaaewLaeaaaewLaeaaaeaaqaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaababababababababababalalmRgygykigygygygygygygygygygyAwwuwtpzabababababababvMvXvVvWuyvUuwvTvRvSuAuPwjwiuPwhvewgwfwewdwcwbtEshwavZvYxlxmzoxqxewlsNsNsNsNsNsNsNsNsNsNwrwqwsaeqaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLabqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaababababababababababababalalgyqqjsqngygygygygygygygyAwAevQpzababrtrtrtrtabvMvNvOztuyAfvIAyuTvKuAvLvCvBuAvDvevEvGvFvwvvvgvxvzvysvvAEvrMrLrNaaaaaevuaeaaaevuaeaaaevuaeaaaeaaqaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaabababababababababababababalgygygyqygygygygygygygygyAwAeACrtrtrtrtviAWrtrtrtrtwnrtrtrGrGrGrGvhrNrGwRrGvhrNrGvsvrrGwpEtvlvkvpvorGvnEsrtaaaaaaaaqgrgqbaaqgrgqbaaqgrgqbaaqaqaqaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaabababababababababababababalalalrJqzrigygygygygygygypBAzuDuvvPsxulwosJBawCwmsDsFsGtdtetctfsYtctctctrtqtctcxCtktntmtAzgtDtCtvtuBbtwtEtFaaaeaaaaqgrgqbaaqgrgqbaaqgrgqbaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaabababababababababababababababalalAwrQrPrRrRrRrRrRrRrRrRrTswszBzsKsBuksdsdsdBLsoslsmstsdsdsssqsrsdsdvauYBMsdscsbsarZskvdrZsishshtYsQsusvaeaeaeaeqgrgqbaeqgrgqbaeqgrgqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababaaaaaaaaaaaaabababababababababababababababababalalpBqApCgygygygygygygyrJsCrurtrtrtrtrtrtrtrtrtrwrzrArErzrFrGsnrGrKrtrtrtrtrtrtrtrtrtrtrtrMrLrLrNrtspsgrtaaaaaeaaqgrgqbaaqgrgqbaaqgrgqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLababababababababqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababalalalalgyqygygygygygygygygyAwowowalabababababababqDrlrjrkrorprmrnrrrsrqqDababababababababababaaaaaaaarcrhrbrcaaaaaeaaqgrgqbaaqgrgqbaaqgrgqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLabqLababababqLqLabababqLqLqLqLqLababababababababqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababalalalalalalgyqygygygygygygygygyAwumalalabababababababqDrlurusuqqQqQqQunuoupqDababababababababababaaaaaaaauuutvquuaeaeaeaeqgrgqbaeqgrgqbaeqgrgqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1746,8 +1767,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqL aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababalgypZjsjsjsjsragyalalgygygygyalalalalababababababababqDrltXqQqQqQtTtUtVtWCgqDabababababababababaaaaaaaaqBqBqBqBqBqBqBaaaaqgrgqbaaqgrgqbaaqgrgqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLabababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababababalgykigygygygysLgyalalalalalalalabababababababababababqDtStOtJtJBZtHtItMtNtLqDababababababababaaaaaaaaaaqBqBqBqBqBqBqBaaaaqgrgqbaeqgrgqbaeqgrgqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababababababababalgykigyalalalmRalalabababababababababababababababababqDqGqIqHqQqDqSqRqDqJqKqDabababababababaaaaaaaaaaaaqBqBqBqBqBqBqBaaaaqgqEqbaaqgqEqbaaqgqEqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababababababababababababalgykigyalalalalabababababababababababababababababababqDqVqUqTqQqDqZqYqDqXqWqDababababababaaaaaaaaaaaaaaqBqBqBqBqBqBqBaaaaaaaeaaaaaaaeaaaaaaaeaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababalgykigyalalalababababababababababababababababababababqDqDqDqDqDqDrYrYqDsfsfqDababababaaaaaaaaaaaaaaaaaaqBqBqBqBqBqBqBaatKqaqaqaqaqaqaqaqaqaqaqaqaqaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababababababababababababalgykigyalalalalabababababababababababababababababababqDqVqUqTqQqDClqYqDqXCrqDababababababaaaaaaaaaaaaaaqBqBqBqBqBqBqBaaaaaaaeaaaaaaaeaaaaaaaeaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababalgykigyalalalababababababababababababababababababababqDqDqDqDqDqDCBrYqDsfCRqDababababaaaaaaaaaaaaaaaaaaqBqBqBqBqBqBqBaatKqaqaqaqaqaqaqaqaqaqaqaqaqaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLababababababqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababababalalgykigyalalababababababababababababababababababababababababababqDqDqDqDqDqDqDababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLababababqLabqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababababalgygykigyalalabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLabababqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababalgygykigyalabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1777,19 +1798,19 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababqLqLqLqLqLqLqLqLqLqL aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLababababababqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLgygygygygygygygyDEDEDEgyalalalababababababababababababababababababababababababababababababababababababababababababababababababababababababababpIababzizMzLDDzJDCgygygygygygygygygyaaaaaaaaaaaaaaaaaaaaababababababkDmRmRmRmRmRgygyqygygygygygygygyalabalalabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLababababababababqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLgygygygygygygygyDVDUDTgyalalalababababababababababababababababababababababababababababababalalalalalalalababababababababababababababababababziDSziziziziziziArDRgygygygygygygygygygygyaaaaaaaaaaaaaaaaaaabababababmRtPsCtQtQtRgyrJqzrigygygygygygygyadabalababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLababababababqLqLqLqLqLqLqLababababababqLqLqLqLalgyzyzyzyzyzyzyDPDQDOzyzyzyzyzygygygyalabababababababababababababababababababababababababababababalalalalalalalalalalalalabababababababababababziziziziDLDMDNziDwEzziDzzixhxhDJCcCdxhgygygygygygyaaaaaaaaaaaaaaaaaaabababalmRudowueueufgyAwDIrPDHAjAjAjAkgygygygygyalabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLababababababqLqLqLqLqLqLqLabababababqLqLalalalgyzyzxzqzpzszrzuztzwzvznzozlzmsCsCrialalalalabababababababababababababababababababababababababalalalalalalalalalalalalalalalalalabababababababzizhzkzjzIzHzGzizMzLzKzJzizPzOzNzRzNzQgygygygygygygyaaaaaaaaaaaaaaaaaaalalalmRuCuDuEuEpCgyAwzBzAzFzEzAzAzzgygygygygyalababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLababababababqLqLqLqLqLqLqLabababababqLqLalalalgyzyzxzqzpzszrzuDazwzvznErzlzmsCsCrialalalalabababababababababababababababababababababababababalalalalalalalalalalalalalalalalalabababababababzizhzkzjzIzHzGzizMzLzKzJzizPzOzNzRzNzQgygygygygygygyaaaaaaaaaaaaaaaaaaalalalmRuCuDuEuEpCgyAwzBzAzFzEzAzAzzgygygygygyalababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLabababqLqLqLqLqLqLqLqLabababqLqLabalalalgyzyAdzYAbzZAJBfBeBeBdzXAcAAAIzVzWufalalalalalalabababababababababababababababababababababalalalalalalalalalalalalalalalalalalalalababababababzizTzkzSAoAnAqziziziziArzizPAsAsAuAtAvgygygygygygygyaaaaaaaaaaaaaaaaaagygygygygygygygygygypBzBAgAgAgAizAAlAmAjAkgynDmRalabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabalalalgyzyAKAHBnBFBEBkAEAGAFznBgAxAyxvBhufalalalalalalalalalabababababababababababababababababalalalmRalalalalalalalalalalalalalalalalalalalalabababziABADACASARAQAPAOANAMALzizPAsAWAVAUATgygygygygygyaaaaaaaaaaaaaaaaaaaaaaaagygygygygywNwNyKxQzBBbAZAYBazAzAzAzAAXgygygyalalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababalalalgyzyBjBiBIzsBHBGzYBczyzyzyzyzyzyBhufgygygygygygygyalalalalabababababababababababababababalalgytGgygygygygygygygyrJrigygygygygygyalalalalalababziziziziziziziBmBlBJBmBlzixhxhxhBKxhxhxhBoBpgygyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygyxOxQBqBxBwBvBuBuBtBsBrBzBAByAXgygygymQalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLabababalalgyzyBBBDBCzZzYBLzYzYBMBXBYBRBVBNBQqpjsjsjsjsjsqngyalalalalalalababababababababababababalalalgypZjsjsjsjsjsjsjsjsqoqpjsjsjsjsqngyalalalalalabababababxhCoCnCmAsAsCpAsAsCjCiAsChAVClCkCkCeCfCcCdEGEFEFEFEFEFEFEFEFEFEFEFEFEFEFyKycCaCbxPBTBSCPBUBWBWDfCTBOBPCxCDgygygymQalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababalalgyzyzyzyzyzyzyzyzyzyzyCqzyzyzyzyowufgygygygygykigygygygyalalalalababababababababababalalgygygykigygygygygygygygypBpCgygygygykigyalalalalalalalalalabxhxhxhxhCLCNCMCGCGCGCFCGCGCICHCKCJCODlCGDlCyCyCyCyCyCyCyCyCyCyCyCyCyCyCyDgCzDgCACzCtxPCsCrCwCvCuBrDjCECBCCsCsCrigyalalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLabababalalgygygygygygygygygygygyAwAfAhowowowufgysMgygygyqqjsjsqngyalalalalababababababababababalgygypZjspYgygygygyalgygysMgygygygygygykigyalalalalalalalalalalalalalxhCZCYAsAsAsAsCXAsCWCVCUDmAsCRCSCcCdEHEHEHEHEHEHEHEHEHEHEHEHEHEHEIyKycyMDcxPDbxPzBzAzAzAzAzAzAzAzADauDxJpCqFmQalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabalalalgyzyAKAHBnBFBEBkAEAGAFznBgAxEuxvBhufalalalalalalalalalabababababababababababababababababalalalmRalalalalalalalalalalalalalalalalalalalalabababziABADEwASARAQAPAOANAMALzizPAsExAVAUATgygygygygygyaaaaaaaaaaaaaaaaaaaaaaaagygygygygywNwNyKxQzBEAAZAYEEzAzAzAzAAXgygygyalalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababalalalgyzyBjBiBIzsBHBGzYBczyzyzyzyzyzyBhufgygygygygygygyalalalalabababababababababababababababalalgytGgygygygygygygygyrJrigygygygygygyalalalalalababziziziziziziziBmBlBJBmBlzixhxhxhBKxhxhxhBoBpgygyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygyxOxQBqBxBwBvBuBuBtBsBrEQBAByAXgygygymQalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLabababalalgyzyBBBDBCzZzYERzYzYESBXBYBRBVBNBQqpjsjsjsjsjsqngyalalalalalalababababababababababababalalalgypZjsjsjsjsjsjsjsjsqoqpjsjsjsjsqngyalalalalalabababababxhCoCnCmAsAsCpAsAsCjCiAsChAVETCkCkCeCfCcCdEGEFEFEFEFEFEFEFEFEFEFEFEFEFEFyKycCaCbxPBTBSCPBUBWBWDfCTBOBPCxCDgygygymQalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababalalgyzyzyzyzyzyzyzyzyzyzyCqzyzyzyzyowufgygygygygykigygygygyalalalalababababababababababalalgygygykigygygygygygygygypBpCgygygygykigyalalalalalalalalalabxhxhxhxhCLCNCMCGCGCGCFCGCGCICHCKCJCODlCGDlCyCyCyCyCyCyCyCyCyCyCyCyCyCyCyDgCzDgCACzCtxPCsEUCwCvCuBrDjCEEVCCsCsCrigyalalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLabababalalgygygygygygygygygygygyAwEWAhowowowufgysMgygygyqqjsjsqngyalalalalababababababababababalgygypZjspYgygygygyalgygysMgygygygygygykigyalalalalalalalalalalalalalxhCZCYAsAsAsAsCXAsCWCVCUDmAsEXCSCcCdEHEHEHEHEHEHEHEHEHEHEHEHEHEHEIyKycyMDcxPDbxPzBzAzAzAzAzAzAzAzAxXuDxJpCqFmQalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababalalalalalalalalalgygygypBuDuDuDuDDeApalmRalalgygygygykigyalalalalalabababababalalalalalgypZpYgygygyalalalalalalmRalalalalalgykigyalalalalalalmRalalalalalwVwVDiDuDiwXwXDhDtwXwXwXxIDsxIxhDkgygygyaaaaaaaaaeaaaaaaaeaaaaaaaaaaaeaayTxQxPDqDpDoDnxixixjDvDKEgDxDGDrDrDrqFgyalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababalalalalalalalalalalalalabalalalalalgykigygygygygyalalalalalalalalalalalgykigygyalalalabababababalalalalalalgykigygygyrJrigygytGgygyalalalwVwUwTwZwYwXwWxdxcxbxawXxgxfxtxhgygygygygygyaaaaaeaaaaaaEDaeaeaeaeaeEDaeaewNwMwPwOwQwQwQwQxrwQwSwQwQxsqFqFqFqFgyalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababalalalalgyqqjsjsjsqngygygygygygygygygygygygygykigyalalabababababababalalalalalalgyqqjsjsjsqoqpjsjsjsqngyalalalwVxwxuxyxxwXxzxBxAxDEEwXxExGxFxhgygygygygygyaeaeaeaeaeaeaeyIyIyIyIyIaeaaaawNxkxoxPxWxRykxixixpxixjwQxKgygygygyalalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababalalalgygygygygyqqqngygyrJrigygypZjsjsjsjsjspYgyalabababababababababalalalalalgygygygygypBpCgygygykigygygygywVwVwVwVwVwXxHxNxAxDxLwXxIymxIxhgygygygygygyaaaaaeaaaaaaaeyIyIyIyIyIaeaaxOxQxPxSypwQwQwQwQwQwQxTxUwQxKgygygyalalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababalalalgysMgygyqqjsjsqoqpjsjspYgygygygygygygyalabababababababababababalalalalalalalgygygygyalgyqqjsjsqngygygygygygywXxVxXwXwXwXwXowysufyZgygygygygyaaaaaaaeaaaaaaaeyIyIyIyIyIydycybyaxZylytyjyiyhygyfyexYxUwQxKgygygyalalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababalalmRalgygygygypBpCgygygygysMgyalalalalalababababababababababababababalalalalalalalalalgygygygykigygygygygygygygyyAowowowowowowufgygygygygygyaeaeaeaeaeaeaeaeyIyIyIyIyIywyEyxyJyvynxPxPxPyuyoyryqyyyzwQxKgygygyalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababalalalalalalalalalalalalabalalalalalgykigygygygygyalalalalalalalalalalalgykigygyalalalabababababalalalalalalgykigygygyrJrigygytGgygyalalalwVwUwTwZwYwXwWxdxcFaEZwXxgxfxtxhgygygygygygyaaaaaeaaaaaaEDaeaeaeaeaeEDaeaewNwMwPFbwQwQwQwQxrwQwSwQwQxsqFqFqFqFgyalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababalalalalgyqqjsjsjsqngygygygygygygygygygygygygykigyalalabababababababalalalalalalgyqqjsjsjsqoqpjsjsjsqngyalalalwVxwxuFcxxwXxzxBxAFeFdwXxExGxFxhgygygygygygyaeaeaeaeaeaeaeyIyIyIyIyIaeaaaawNxkxoxPxWxRykxixixpxixjwQxKgygygygyalalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababalalalgygygygygyqqqngygyrJrigygypZjsjsjsjsjspYgyalabababababababababalalalalalgygygygygypBpCgygygykigygygygywVwVwVwVwVwXxHxNxAFgFfwXFhymxIxhgygygygygygyaaaaaeaaaaaaaeyIyIyIyIyIaeaaxOxQxPxSFiwQwQwQwQwQwQxTxUwQxKgygygyalalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababalalalgysMgygyqqjsjsqoqpjsjspYgygygygygygygyalabababababababababababalalalalalalalgygygygyalgyqqjsjsqngygygygygygywXEYFkDhwXwXwXowysufyZgygygygygyaaaaaaaeaaaaaaaeyIyIyIyIyIydycybyaxZylytyjyiyhygyfyexYxUwQxKgygygyalalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababalalmRalgygygygypBpCgygygygysMgyalalalalalababababababababababababababalalalalalalalalalgygygygykigygygygygygygygyyAowowowowowowufgygygygygygyaeaeaeaeaeaeaeaeyIyIyIyIyIywyEyxyJyvynxPxPxPyuyoyrFjyyyzwQxKgygygyalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababalalalalalalalalalalalmRalalabababababababababababababababababababababababababalalalalalgykigygygygygygygygyyNuDuDuDuDuDuDpCgygygygygygygyaaaaaaaaaaaaaeyIyIyIyIyIyKycyMyLxPyFyDyDyDzDyHyHyGyByCwQxKgygyzCmRabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababalalalalalalalalalalalababababababababababababababababababababababababababababalalalalgyqqjsjsjsjsjsjsjsjsyOjsjsjsjsjsjsjsjsyPgygygygygygyaaaaaaaaaaaeyIyIyIyIyIzUaayTxQyUySxPxPxPyRyQyryrxTyVwQxKgygygyalabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababalalalalalababababababababababababababababababababababababababababababababalalalalgygygygygygygygygygygygygygygygygygygyqygyrJrigygygypzyWaaaaaaEDyIyIyIyIyIEDaaaaaazfzeytzdzczbzayYyXyyxUwQxKgygygyalababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png index bed65e9b01..079c4379b7 100644 Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ diff --git a/nano/templates/portpump.tmpl b/nano/templates/portpump.tmpl new file mode 100644 index 0000000000..3e14aac8f9 --- /dev/null +++ b/nano/templates/portpump.tmpl @@ -0,0 +1,100 @@ +

          Pump Status

          +
          +
          + Tank Pressure: +
          +
          + {{:data.tankPressure}} kPa +
          +
          + +
          +
          + Port Status: +
          +
          + {{:data.portConnected ? 'Connected' : 'Disconnected'}} +
          +
          + +
          +
          + Load: +
          +
          + {{:data.powerDraw}} W +
          +
          + +
          +
          + Cell Charge: +
          +
          + {{:helper.displayBar(data.cellCharge, 0, data.cellMaxCharge)}} +
          +
          + +

          Holding Tank Status

          +{{if data.hasHoldingTank}} +
          +
          + Tank Label: +
          +
          +
          {{:data.holdingTank.name}}
          {{:helper.link('Eject', 'eject', {'remove_tank' : 1})}} +
          +
          + +
          +
          + Tank Pressure: +
          +
          + {{:data.holdingTank.tankPressure}} kPa +
          +
          +{{else}} +
          No holding tank inserted.
          +
           
          +{{/if}} + + +

          Power Regulator Status

          +
          +
          + Target Pressure: +
          +
          + {{:helper.displayBar(data.targetpressure, data.minpressure, data.maxpressure)}} +
          + {{:helper.link('-', null, {'pressure_adj' : -1000}, (data.targetpressure > data.minpressure) ? null : 'disabled')}} + {{:helper.link('-', null, {'pressure_adj' : -100}, (data.targetpressure > data.minpressure) ? null : 'disabled')}} + {{:helper.link('-', null, {'pressure_adj' : -10}, (data.targetpressure > data.minpressure) ? null : 'disabled')}} + {{:helper.link('-', null, {'pressure_adj' : -1}, (data.targetpressure > data.minpressure) ? null : 'disabled')}} +
           {{:data.targetpressure}} kPa 
          + {{:helper.link('+', null, {'pressure_adj' : 1}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}} + {{:helper.link('+', null, {'pressure_adj' : 10}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}} + {{:helper.link('+', null, {'pressure_adj' : 100}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}} + {{:helper.link('+', null, {'pressure_adj' : 1000}, (data.targetpressure < data.maxpressure) ? null : 'disabled')}} +
          +
          +
          + +
          +
          + Power Switch: +
          +
          + {{:helper.link('On', 'unlocked', {'power' : 1}, data.on ? 'selected' : null)}} {{:helper.link('Off', 'locked', {'power' : 1}, data.on ? null : 'selected')}} +
          +
          + +
          +
          + Pump Direction: +
          +
          + {{:helper.link('Out', 'arrowreturn-1-e', {'direction' : 1}, data.pump_dir ? 'selected' : null)}} {{:helper.link('In', 'arrowreturn-1-w', {'direction' : 1}, data.pump_dir ? null : 'selected')}} +
          +
          diff --git a/nano/templates/portscrubber.tmpl b/nano/templates/portscrubber.tmpl new file mode 100644 index 0000000000..c99f53344c --- /dev/null +++ b/nano/templates/portscrubber.tmpl @@ -0,0 +1,91 @@ +

          Scrubber Status

          +
          +
          + Tank Pressure: +
          +
          + {{:data.tankPressure}} kPa +
          +
          + +
          +
          + Port Status: +
          +
          + {{:data.portConnected ? 'Connected' : 'Disconnected'}} +
          +
          + +
          +
          + Load: +
          +
          + {{:data.powerDraw}} W +
          +
          + +
          +
          + Cell Charge: +
          +
          + {{:helper.displayBar(data.cellCharge, 0, data.cellMaxCharge)}} +
          +
          + +

          Holding Tank Status

          +{{if data.hasHoldingTank}} +
          +
          + Tank Label: +
          +
          +
          {{:data.holdingTank.name}}
          {{:helper.link('Eject', 'eject', {'remove_tank' : 1})}} +
          +
          q + +
          +
          + Tank Pressure: +
          +
          + {{:data.holdingTank.tankPressure}} kPa +
          +
          +{{else}} +
          No holding tank inserted.
          +
           
          +{{/if}} + + +

          Power Regulator Status

          +
          +
          + Volume Rate: +
          +
          + {{:helper.displayBar(data.rate, data.minrate, data.maxrate)}} +
          + {{:helper.link('-', null, {'volume_adj' : -1000}, (data.rate > data.minrate) ? null : 'disabled')}} + {{:helper.link('-', null, {'volume_adj' : -100}, (data.rate > data.minrate) ? null : 'disabled')}} + {{:helper.link('-', null, {'volume_adj' : -10}, (data.rate > data.minrate) ? null : 'disabled')}} + {{:helper.link('-', null, {'volume_adj' : -1}, (data.rate > data.minrate) ? null : 'disabled')}} +
           {{:data.rate}} L/s 
          + {{:helper.link('+', null, {'volume_adj' : 1}, (data.rate < data.maxrate) ? null : 'disabled')}} + {{:helper.link('+', null, {'volume_adj' : 10}, (data.rate < data.maxrate) ? null : 'disabled')}} + {{:helper.link('+', null, {'volume_adj' : 100}, (data.rate < data.maxrate) ? null : 'disabled')}} + {{:helper.link('+', null, {'volume_adj' : 1000}, (data.rate < data.maxrate) ? null : 'disabled')}} +
          +
          +
          + +
          +
          + Power Switch: +
          +
          + {{:helper.link('On', 'unlocked', {'power' : 1}, data.on ? 'selected' : null)}} {{:helper.link('Off', 'locked', {'power' : 1}, data.on ? null : 'selected')}} +
          +
          diff --git a/nano/templates/power_monitor.tmpl b/nano/templates/power_monitor.tmpl index 607115aec0..bf07238784 100644 --- a/nano/templates/power_monitor.tmpl +++ b/nano/templates/power_monitor.tmpl @@ -77,8 +77,8 @@
          {{/if}} {{else}} -
          - No active sensor. Printing sensor list. +
          + {{:helper.link('Scan For Sensors', 'refresh', { 'refresh' : 1})}} No active sensor. Printing sensor list.

          {{for data.all_sensors}} {{if value.alarm}} diff --git a/sound/effects/cascade.ogg b/sound/effects/cascade.ogg new file mode 100644 index 0000000000..9de7b01b0c Binary files /dev/null and b/sound/effects/cascade.ogg differ diff --git a/sound/effects/supermatter.ogg b/sound/effects/supermatter.ogg new file mode 100644 index 0000000000..83081a5e9b Binary files /dev/null and b/sound/effects/supermatter.ogg differ diff --git a/sound/effects/teleport.ogg b/sound/effects/teleport.ogg new file mode 100644 index 0000000000..650867782b Binary files /dev/null and b/sound/effects/teleport.ogg differ diff --git a/sound/items/goggles_charge.ogg b/sound/items/goggles_charge.ogg new file mode 100644 index 0000000000..b41bbf1d06 Binary files /dev/null and b/sound/items/goggles_charge.ogg differ diff --git a/sound/music/THUNDERDOME.ogg b/sound/music/THUNDERDOME.ogg new file mode 100644 index 0000000000..0a36b251b7 Binary files /dev/null and b/sound/music/THUNDERDOME.ogg differ diff --git a/sound/serversound_list.txt b/sound/serversound_list.txt index 24cbafaf15..21d48ed7f9 100644 --- a/sound/serversound_list.txt +++ b/sound/serversound_list.txt @@ -1,9 +1,11 @@ sound/music/1.ogg sound/music/b12_combined_start.ogg +sound/music/clouds.ogg sound/music/main.ogg sound/music/space.ogg sound/music/space_asshole.ogg sound/music/space_oddity.ogg +sound/music/THUNDERDOME.ogg sound/music/title1.ogg sound/music/title2.ogg sound/music/traitor.ogg diff --git a/sound/weapons/heavysmash.ogg b/sound/weapons/heavysmash.ogg new file mode 100644 index 0000000000..609e20fd96 Binary files /dev/null and b/sound/weapons/heavysmash.ogg differ diff --git a/sound/weapons/rapidslice.ogg b/sound/weapons/rapidslice.ogg new file mode 100644 index 0000000000..a428c18efe Binary files /dev/null and b/sound/weapons/rapidslice.ogg differ diff --git a/sound/weapons/spiderlunge.ogg b/sound/weapons/spiderlunge.ogg new file mode 100644 index 0000000000..fc2d91e079 Binary files /dev/null and b/sound/weapons/spiderlunge.ogg differ diff --git a/tools/GenerateChangelog/makeChangelog.bat b/tools/GenerateChangelog/makeChangelog.bat new file mode 100644 index 0000000000..67149b1165 --- /dev/null +++ b/tools/GenerateChangelog/makeChangelog.bat @@ -0,0 +1,4 @@ +@echo off +rem Cheridan asked for this. - N3X +call python ss13_genchangelog.py ../../html/changelog.html ../../html/changelogs +pause diff --git a/tools/GenerateChangelog/ss13_genchangelog.py b/tools/GenerateChangelog/ss13_genchangelog.py new file mode 100644 index 0000000000..472fbc69aa --- /dev/null +++ b/tools/GenerateChangelog/ss13_genchangelog.py @@ -0,0 +1,210 @@ +''' +Usage: + $ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/ + +ss13_genchangelog.py - Generate changelog from YAML. + +Copyright 2013 Rob "N3X15" Nelson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +''' + +from __future__ import print_function +import yaml, os, glob, sys, re, time, argparse +from datetime import datetime, date +from time import time + +today = date.today() + +dateformat = "%d %B %Y" + +opt = argparse.ArgumentParser() +opt.add_argument('-d', '--dry-run', dest='dryRun', default=False, action='store_true', help='Only parse changelogs and, if needed, the targetFile. (A .dry_changelog.yml will be output for debugging purposes.)') +opt.add_argument('targetFile', help='The HTML changelog we wish to update.') +opt.add_argument('ymlDir', help='The directory of YAML changelogs we will use.') + +args = opt.parse_args() + +all_changelog_entries = {} + +validPrefixes = [ + 'bugfix', + 'wip', + 'tweak', + 'soundadd', + 'sounddel', + 'rscdel', + 'rscadd', + 'imageadd', + 'imagedel', + 'spellcheck', + 'experiment', + 'tgs' +] + +def dictToTuples(inp): + return [(k, v) for k, v in inp.items()] + +changelog_cache = os.path.join(args.ymlDir, '.all_changelog.yml') + +failed_cache_read = True +if os.path.isfile(changelog_cache): + try: + with open(changelog_cache) as f: + (_, all_changelog_entries) = yaml.load_all(f) + failed_cache_read = False + + # Convert old timestamps to newer format. + new_entries = {} + for _date in all_changelog_entries.keys(): + ty = type(_date).__name__ + # print(ty) + if ty in ['str', 'unicode']: + temp_data = all_changelog_entries[_date] + _date = datetime.strptime(_date, dateformat).date() + new_entries[_date] = temp_data + else: + new_entries[_date] = all_changelog_entries[_date] + all_changelog_entries = new_entries + except Exception as e: + print("Failed to read cache:") + print(e, file=sys.stderr) + +if args.dryRun: + changelog_cache = os.path.join(args.ymlDir, '.dry_changelog.yml') + +if failed_cache_read and os.path.isfile(args.targetFile): + from bs4 import BeautifulSoup + from bs4.element import NavigableString + print(' Generating cache...') + with open(args.targetFile, 'r') as f: + soup = BeautifulSoup(f) + for e in soup.find_all('div', {'class':'commit'}): + entry = {} + date = datetime.strptime(e.h2.string.strip(), dateformat).date() # key + for authorT in e.find_all('h3', {'class':'author'}): + author = authorT.string + # Strip suffix + if author.endswith('updated:'): + author = author[:-8] + author = author.strip() + + # Find
            + ulT = authorT.next_sibling + while(ulT.name != 'ul'): + ulT = ulT.next_sibling + changes = [] + + for changeT in ulT.children: + if changeT.name != 'li': continue + val = changeT.decode_contents(formatter="html") + newdat = {changeT['class'][0] + '': val + ''} + if newdat not in changes: + changes += [newdat] + + if len(changes) > 0: + entry[author] = changes + if date in all_changelog_entries: + all_changelog_entries[date].update(entry) + else: + all_changelog_entries[date] = entry + +del_after = [] +print('Reading changelogs...') +for fileName in glob.glob(os.path.join(args.ymlDir, "*.yml")): + name, ext = os.path.splitext(os.path.basename(fileName)) + if name.startswith('.'): continue + if name == 'example': continue + fileName = os.path.abspath(fileName) + print(' Reading {}...'.format(fileName)) + cl = {} + with open(fileName, 'r') as f: + cl = yaml.load(f) + f.close() + if today not in all_changelog_entries: + all_changelog_entries[today] = {} + author_entries = all_changelog_entries[today].get(cl['author'], []) + if len(cl['changes']): + new = 0 + for change in cl['changes']: + if change not in author_entries: + (change_type, _) = dictToTuples(change)[0] + if change_type not in validPrefixes: + print(' {0}: Invalid prefix {1}'.format(fileName, change_type), file=sys.stderr) + author_entries += [change] + new += 1 + all_changelog_entries[today][cl['author']] = author_entries + if new > 0: + print(' Added {0} new changelog entries.'.format(new)) + + if cl.get('delete-after', False): + if os.path.isfile(fileName): + if args.dryRun: + print(' Would delete {0} (delete-after set)...'.format(fileName)) + else: + del_after += [fileName] + + if args.dryRun: continue + + cl['changes'] = [] + with open(fileName, 'w') as f: + yaml.dump(cl, f, default_flow_style=False) + +targetDir = os.path.dirname(args.targetFile) + +with open(args.targetFile.replace('.htm', '.dry.htm') if args.dryRun else args.targetFile, 'w') as changelog: + with open(os.path.join(targetDir, 'templates', 'header.html'), 'r') as h: + for line in h: + changelog.write(line) + + for _date in reversed(sorted(all_changelog_entries.keys())): + entry_htm = '\n' + entry_htm += '\t\t\t

            {date}

            \n'.format(date=_date.strftime(dateformat)) + write_entry = False + for author in sorted(all_changelog_entries[_date].keys()): + if len(all_changelog_entries[_date]) == 0: continue + author_htm = '\t\t\t

            {author} updated:

            \n'.format(author=author) + author_htm += '\t\t\t
              \n' + changes_added = [] + for (css_class, change) in (dictToTuples(e)[0] for e in all_changelog_entries[_date][author]): + if change in changes_added: continue + write_entry = True + changes_added += [change] + author_htm += '\t\t\t\t
            • {change}
            • \n'.format(css_class=css_class, change=change.strip()) + author_htm += '\t\t\t
            \n' + if len(changes_added) > 0: + entry_htm += author_htm + if write_entry: + changelog.write(entry_htm) + + with open(os.path.join(targetDir, 'templates', 'footer.html'), 'r') as h: + for line in h: + changelog.write(line) + + +with open(changelog_cache, 'w') as f: + cache_head = 'DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.' + yaml.dump_all([cache_head, all_changelog_entries], f, default_flow_style=False) + +if len(del_after): + print('Cleaning up...') + for fileName in del_after: + if os.path.isfile(fileName): + print(' Deleting {0} (delete-after set)...'.format(fileName)) + os.remove(fileName)